好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java实现经典游戏Flappy Bird的示例代码

前言

《布谷鸟闯关-简单版》是一个基于java的布谷鸟闯关游戏,摁上键控制鸟的位置穿过管道间的缝隙,需要做碰撞检测,监听键盘事件,背景图片的切换,障碍物管道产生时y轴上需要随机位置。

主要设计

设计游戏界面,用swing实现 设计背景 设计移动墙 设计布谷鸟 设计障碍物 设计背景音乐和音效 由几个关键的布尔类型变量start,crash,over是产生键键盘事件时用来控制界面显示的弹框的 操作:空格键开始游戏,enter键取消"game over"弹框,摁空格键继续,上键(up)是对鸟的控制 工具类ImageMgr专用于读取图片

功能截图

游戏开始:

控制布谷鸟

飞过障碍物

撞到障碍物,游戏结束

代码实现

游戏启动类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public class Main {

     public static void main(String[] args) {

         Cuckoo frame = new Cuckoo();

         while ( true ){

             try {

                 Thread.sleep( 100 );

                 if (!frame.crash){

                     frame.repaint();

                 }

             } catch (InterruptedException e) {

                 e.printStackTrace();

             }

         }

     }

}

核心类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

/**

  * 1.窗口

  * 2.背景

  * 3.移动墙

  * 4.布谷鸟

  * 5.障碍物

  * 6.背景音乐

  * 7.音效

  * 8.欢迎界面

  * 9.game over

  */

public class Cuckoo extends Frame {

     private int step;

     private int score;

     private int height;

     private int moveLeft;

     private int pipeMove;

 

     boolean crash = false ;

     private boolean over = false ;

     private boolean start = false ;

 

     private static int bird_y = 270 ;

     private static final int L_X = 800 ;

     private static final int L_Y = 200 ;

     private static final int SPEED = 2 ;

     private static final int BIRD_X = 100 ;

     private static final int GAME_X_Y_0 = 0 ;

     private static final int GAME_WIDTH = 288 ;

     private static final int GAME_HEIGHT = 512 ;

     private static final int PIPE_WIDTH = ImageMgr.pipe.getWidth();

     private static final int PIPE_HEIGHT = ImageMgr.pipe.getHeight();

     private static final int READY_WIDTH = ImageMgr.ready.getWidth();

     private static final int READY_HEIGHT = ImageMgr.ready.getHeight();

     private static final int START_WIDTH = ImageMgr.start.getWidth();

     private static final int BIRD_WIDTH = ImageMgr.bird[ 0 ].getWidth();

     private static final int BIRD_HEIGHT = ImageMgr.bird[ 0 ].getWidth();

     private static final int GROUND_HEIGHT = ImageMgr.ground.getHeight();

     private static final int GAME_OVER_WIDTH = ImageMgr.gameOver.getWidth();

     private static final int GAME_OVER_HEIGHT = ImageMgr.gameOver.getHeight();

     private static final int BACKGROUND_HEIGHT = ImageMgr.background.getHeight();

 

     private static Image offScreenImage;

     private static Rectangle pipeRectangle1;

     private static Rectangle pipeRectangle2;

     private static Rectangle birdRectangle;

 

     Cuckoo(){

         setVisible( true );

         setResizable( false );

         //setTitle("cuckoo");

         setBounds(L_X, L_Y,GAME_WIDTH,GAME_HEIGHT);

 

         addKeyListener( new KeyAdapter() {

             @Override

             public void keyPressed(KeyEvent e) {

                 switch (e.getKeyCode()){

                     case KeyEvent.VK_SPACE : start = true ; break ;

                     case KeyEvent.VK_ENTER : reopen(); break ;

                 }

             }

 

             @Override

             public void keyReleased(KeyEvent e) {

                 if (e.getKeyCode() == KeyEvent.VK_UP) {

                     bird_y -= 20 ;

                 }

             }

         });

 

         addWindowListener( new WindowAdapter() {

             @Override

             public void windowClosing(WindowEvent e) {

                 System.exit( 0 );

             }

         });

     }

 

     @Override

     public void update(Graphics g) {

         if (offScreenImage == null ){

             offScreenImage = this .createImage(GAME_WIDTH,GAME_HEIGHT);

         }

         Graphics gOffScreen = offScreenImage.getGraphics();

         Color c = gOffScreen.getColor();

         gOffScreen.setColor(Color.BLACK);

         gOffScreen.fillRect( 0 , 0 ,GAME_WIDTH,GAME_HEIGHT);

         gOffScreen.setColor(c);

         paint(gOffScreen);

         g.drawImage(offScreenImage, 0 , 0 , null );

     }

 

     @Override

     public void paint(Graphics g) {

         background(g);

         ground(g);

         start(g);

 

         if (start){

             bird(g);

             pipe(g);

             colliedWith();

             gameOver(g);

             score(g);

         }

 

     }

 

     //如果碰撞后,可以嗯enter键重开

     private void reopen(){

         if (crash){

             score = 0 ;

             over = false ;

             crash = false ;

             start = false ;

             moveLeft = 0 ;

             pipeMove = 0 ;

             //bird_y = 270;//继上次死的位置开始

         }

     }

 

     private void score(Graphics g){

         Font font = new Font( "微软雅黑" ,Font.BOLD, 18 );

         g.setFont(font);

         Color c = g.getColor();

         g.setColor(Color.lightGray);

         g.drawString( "score " + score, 20 , 70 );

         g.setColor(c);

     }

 

     private void background(Graphics g){

         g.drawImage(ImageMgr.background,

                 GAME_X_Y_0 - moveLeft,GAME_X_Y_0,

                 GAME_WIDTH - moveLeft,GAME_HEIGHT,

                 GAME_X_Y_0,

                 GAME_X_Y_0,

                 GAME_WIDTH,

                 GAME_HEIGHT, null );

         g.drawImage(ImageMgr.background,

                 GAME_WIDTH- 1 - moveLeft,GAME_X_Y_0,

                 GAME_WIDTH* 2 - moveLeft, GAME_HEIGHT,

                 GAME_X_Y_0,

                 GAME_X_Y_0,

                 GAME_WIDTH,

                 GAME_HEIGHT, null );

         moveLeft += SPEED;

         //游戏启动计分

         if (start && moveLeft % 100 == 0 ){

             score += 1 ;

         }

         if (moveLeft >= GAME_WIDTH){

             moveLeft = 0 ;

         }

     }

 

     private void ground(Graphics g){

         g.drawImage(ImageMgr.ground, 0 ,BACKGROUND_HEIGHT - GROUND_HEIGHT, null );

     }

 

     private void bird(Graphics g){

         Color c = g.getColor();

         g.setColor(Color.BLUE);

         g.drawRect(BIRD_X, bird_y,BIRD_WIDTH,BIRD_HEIGHT);

         g.setColor(c);

 

         g.drawImage(ImageMgr.bird[step++], BIRD_X, bird_y, null );

         if (step >= ImageMgr.bird.length){

             step = 0 ;

         }

 

         if (start){

             bird_y += 4 ;

         }

 

         birdRectangle = new Rectangle(BIRD_X,bird_y,BIRD_WIDTH,BIRD_HEIGHT);

     }

 

     private void pipe(Graphics g){

         drawPipe(g);

         pipeMove += SPEED;

         if (pipeMove >= GAME_WIDTH + PIPE_WIDTH){

             pipeMove = 0 ;

             Random ran = new Random();

             height = ran.nextInt( 10 )* 20 ;

             drawPipe(g);

         }

 

     }

 

     private void drawPipe(Graphics g){

         g.setColor(Color.RED);

//        g.drawRect(GAME_WIDTH - pipeMove,GAME_HEIGHT/5*3 - height,PIPE_WIDTH,PIPE_HEIGHT);

//        g.drawRect(GAME_WIDTH - pipeMove,-GAME_HEIGHT/5*4 - height,PIPE_WIDTH,PIPE_HEIGHT);

 

         g.drawImage(ImageMgr.pipe,GAME_WIDTH - pipeMove,GAME_HEIGHT/ 5 * 3 - height, null );

         g.drawImage(ImageMgr.pipe,GAME_WIDTH - pipeMove,-GAME_HEIGHT/ 5 * 4 - height, null );

 

         pipeRectangle1 = new Rectangle(GAME_WIDTH - pipeMove,GAME_HEIGHT/ 5 * 3 - height,PIPE_WIDTH,PIPE_HEIGHT);

         pipeRectangle2 = new Rectangle(GAME_WIDTH - pipeMove,-GAME_HEIGHT/ 5 * 4 - height,PIPE_WIDTH,PIPE_HEIGHT);

     }

 

     private void gameOver(Graphics g){

         if (over){

             g.drawImage(ImageMgr.gameOver,GAME_WIDTH/ 2 - GAME_OVER_WIDTH/ 2 , GAME_HEIGHT/ 2 - GAME_OVER_HEIGHT, null );

         }

     }

 

     private void start(Graphics g){

         if (!start){

             g.drawImage(ImageMgr.ready,GAME_WIDTH/ 2 - READY_WIDTH/ 2 , GAME_HEIGHT/ 2 - READY_HEIGHT, null );

             g.drawImage(ImageMgr.start,GAME_WIDTH/ 2 - START_WIDTH/ 2 , GAME_HEIGHT/ 2 , null );

         }

     }

 

     private void colliedWith(){

         if (birdRectangle.intersects(pipeRectangle1) || birdRectangle.intersects(pipeRectangle2)){

             crash = true ;

             over = true ;

             //gameOver(g);

         }

     }

}

工具类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

public class ImageMgr {

     static BufferedImage background,ground,pipe,gameOver,start,ready;

     static BufferedImage[] bird = new BufferedImage[ 3 ];

     private static final ImageMgr INSTANCE = new ImageMgr();

     //nothing

     private ImageMgr(){

         initImage();

     };

 

     private void initImage(){

         try {

             background = ImageIO.read(Objects.requireNonNull(Cuckoo. class .getClassLoader().getResourceAsStream( "images/bg_light.png" )));

             ground = ImageIO.read(Objects.requireNonNull(Cuckoo. class .getClassLoader().getResourceAsStream( "images/ground.png" )));

             pipe = ImageIO.read(Objects.requireNonNull(Cuckoo. class .getClassLoader().getResourceAsStream( "images/pipe.png" )));

             gameOver = ImageIO.read(Objects.requireNonNull(Cuckoo. class .getClassLoader().getResourceAsStream( "images/gameover.png" )));

             start = ImageIO.read(Objects.requireNonNull(Cuckoo. class .getClassLoader().getResourceAsStream( "images/start.png" )));

             ready = ImageIO.read(Objects.requireNonNull(Cuckoo. class .getClassLoader().getResourceAsStream( "images/ready.png" )));

 

             for ( int i = 0 ;i < 3 ;i++){

                 bird[i] = ImageIO.read(Objects.requireNonNull(Cuckoo. class .getClassLoader().getResourceAsStream( "images/blueBird_" + (i+ 1 ) + ".png" )));

             }

         } catch (IOException ex) {

             ex.printStackTrace();

         }

     }

 

     public static ImageMgr getInstance(){

         return INSTANCE;

     }

}

总结

通过此次的《布谷鸟闯关-简单版》实现,让我对JAVA的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。

java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。

以上就是Java实现经典游戏Flappy Bird的示例代码的详细内容,更多关于Java Flappy Bird游戏的资料请关注其它相关文章!

原文链接:https://juejin.cn/post/7068587606967058463

查看更多关于Java实现经典游戏Flappy Bird的示例代码的详细内容...

  阅读:16次