Java实例---flappy-bird实例[最终版]
代码分析
解析版: Java实例---flappy-bird实例解析
完整版:
TestBirdFly.java
1 package testfly;2
3 import java.awt.Color;
4 import java.awt.Font;
5 import java.awt.Graphics;
6 import java.awt.Graphics2D;
7 import java.awt.event.MouseAdapter;
8 import java.awt.event.MouseEvent;
9 import java.awt.event.MouseListener;
10 import java.awt.image.BufferedImage;
11 import java.util.Random;
12
13 import javax.imageio.ImageIO;
14 import javax.swing.JFrame;
15 import javax.swing.JPanel;
16 public class TestBirdFly extends JPanel {
17 Bird bird;
18 Column column1, column2;
19 Ground ground;
20 BufferedImage background;
21 boolean gameOver;
22 boolean started;
23 BufferedImage gameoverImg;
24 //分数
25 int score;
26 /** 初始化 BirdGame 的属性变量 */
27 public TestBirdFly() throws Exception {
28 score = 0;
29 bird = new Bird();
30 column1 = new Column(1);
31 column2 = new Column(2);
32 ground = new Ground();
33 gameOver=false;
34 background = ImageIO.read(
35 getClass().getResource("bg.png"));
36 gameoverImg= ImageIO.read(
37 getClass().getResource("gameover.png"));
38 }
39
40 /** "重写(修改)"paint方法实现绘制 */
41 public void paint(Graphics g){
42 g.drawImage(background, 0, 0, null);
43 g.drawImage(column1.image,
44 column1.x-column1.width/2,
45 column1.y-column1.height/2, null);
46 g.drawImage(column2.image,
47 column2.x-column2.width/2,
48 column2.y-column2.height/2, null);
49 //在paint方法中添加绘制分数的算法
50 Font f = new Font(Font.SANS_SERIF,
51 Font.BOLD, 40);
52 g.setFont(f);
53 g.drawString(""+score, 40, 60);
54 g.setColor(Color.WHITE);
55 g.drawString(""+score, 40-3, 60-3);
56
57 g.drawImage(ground.image, ground.x,
58 ground.y, null);
59 if (gameOver){
60 g.drawImage(gameoverImg,0,0,null);
61 return;
62 }
63 //旋转(rotate)绘图坐标系,是API方法
64 Graphics2D g2 = (Graphics2D)g;
65 g2.rotate(-bird.alpha, bird.x, bird.y);
66 g.drawImage(bird.image,
67 bird.x-bird.width/2,
68 bird.y-bird.height/2, null);
69 g2.rotate(bird.alpha, bird.x, bird.y);
70 }//paint方法的结束
71 //BirdGame中添加方法action()
72 public void action() throws Exception {
73 MouseListener l=new MouseAdapter(){
74 //Mouse 老鼠 Pressed按下
75 public void mousePressed(
76 MouseEvent e){
77 //鸟向上飞扬
78 started=true;
79 bird.flappy();
80
81 }
82 };
83 //将l挂接到当前的面板(game)上
84 addMouseListener(l);
85
86 while(true){
87
88
89 //计分逻辑
90 if(!gameOver||started){
91 ground.step();
92 column1.step();
93 column2.step();
94 bird.step();
95 }
96 bird.fly();
97 ground.step();
98
99 if(bird.hit(ground) ||bird.hit(column1)||bird.hit(column2)){
100 gameOver=true;
101 }
102 bird.fly();
103 if (bird.x==column1.x||bird.x==column2.x){
104 score++;
105 }repaint();
106
107 Thread.sleep(1000/60);
108 }
109 }
110
111 /** 启动软件的方法 */
112 public static void main(String[] args)
113 throws Exception {
114 JFrame frame = new JFrame();
115 TestBirdFly game = new TestBirdFly();
116 frame.add(game);
117 frame.setSize(440, 670);
118 frame.setLocationRelativeTo(null);
119 frame.setDefaultCloseOperation(
120 JFrame.EXIT_ON_CLOSE);
121 frame.setVisible(true);
122 game.action();
123 }
124 }
125 /** 地面 */
126 class Ground{
127 BufferedImage image;
128 int x, y;
129 int width;
130 int height;
131 public Ground() throws Exception {
132 image = ImageIO.read(
133 getClass().getResource("ground.png"));
134 width = image.getWidth();
135 height = image.getHeight();
136 x = 0;
137 y = 500;
138 }//地面的构造器结束
139 //地面的类体中,添加方法,地面移动一步
140 public void step(){
141 x--;
142 if(x==-109){
143 x = 0;
144 }
145 }
146 }//地面类的结束
147 /** 柱子类型,x,y是柱子的中心点的位置 */
148 class Column{
149 BufferedImage image;
150 int x,y;
151 int width, height;
152 /** 柱子中间的缝隙 */
153 int gap;
154 int distance;//距离,两个柱子之间的距离
155 Random random = new Random();
156 /** 构造器:初始化数据,n代表第几个柱子 */
157 public Column(int n) throws Exception {
158 image=ImageIO.read(
159 getClass().getResource("column.png"));
160 width = image.getWidth();
161 height = image.getHeight();
162 gap=144;
163 distance = 245;
164 x = 550+(n-1)*distance;
165 y = random.nextInt(218)+132;
166 }
167 //在Column中添加方法 step,在action调用此方法
168 public void step(){
169 x--;
170 if(x==-width/2){
171 x = distance * 2 - width/2;
172 y = random.nextInt(218)+132;
173 }
174 }
175 }//Column类的结束
176 /** 鸟类型, x,y是鸟类型中心的位置 */
177 class Bird{
178 BufferedImage image;
179 int x,y;
180 int width, height;
181 int size;//鸟的大小,用于碰撞检测
182
183 //在Bird类中增加属性,用于计算鸟的位置
184 double g;// 重力加速度
185 double t;// 两次位置的间隔时间
186 double v0;// 初始上抛速度
187 double speed;// 是当前的上抛速度
188 double s;// 是经过时间t以后的位移
189 double alpha;// 是鸟的倾角 弧度单位
190 //在Bird类中定义
191 //定义一组(数组)图片,是鸟的动画帧
192 BufferedImage[] images;
193 //是动画帧数组元素的下标位置
194 int index;
195
196 public Bird() throws Exception {
197 image=ImageIO.read(
198 getClass().getResource("0.png"));
199 width = image.getWidth();
200 height = image.getHeight();
201 x = 132;
202 y = 280;
203 size = 10;
204 g = 1;
205 v0 = 10;
206 t = 0.25;
207 speed = v0;
208 s = 0;
209 alpha=0;
210 //创建数组,创建8个元素的数组
211 //是8个空位置,没有图片对象,
212 //8个位置的序号: 0 1 2 3 4 5 6 7
213 images = new BufferedImage[8];
214 for(int i=0; i<8; i++){
215 //i = 0 1 2 3 4 5 6 7
216 images[i] = ImageIO.read(
217 getClass().getResource(i+".png"));
218 }
219 index = 0;
220 }
221 //在Bird中添加飞翔(fly)的代码
222 public void fly(){
223 index++;
224 image = images[(index/12) % 8];
225 }
226 //在Bird中添加鸟的移动方法
227 public void step(){
228 double v0 = speed;
229 s = v0*t + g*t*t/2;//计算上抛运动位移
230 y = y-(int)s;//计算鸟的坐标位置
231 double v = v0 - g*t;//计算下次的速度
232 speed = v;
233 // if(y>=500){//如果到达地面,就重新抛起
234 // y = 280;
235 // speed = 35;
236 // }
237 //调用Java API提供的反正切函数,计算倾角
238 alpha = Math.atan(s/8);
239 }
240 //在Bird中添加方法
241 public void flappy(){
242 //重新设置初始速度,重新向上飞
243 speed = v0;
244 }
245 //在鸟中添加方法hit
246 // 检测当前鸟是否碰到地面ground
247 //如果返回true表示发生碰撞
248 //否则返回false表示没有碰撞
249
250
251 public boolean hit (Ground ground){
252 boolean hit =y+size/2>ground.y;
253 if(hit){
254 y=ground.y-size/2;
255
256 }
257 return hit;
258 }
259 //检测当前鸟是否撞倒柱子
260 public boolean hit(Column column){
261 //先检查是否在柱子的范围以内
262 if (x>column.x-column.width/2-size/2&&x<column
263 .x+column.width/2+size/2){
264 if(y>column.y-column.gap/2+size/2&&y<column.y+column.gap/2-size/2){
265 return false;
266
267
268
269 }
270 return true;
271
272 }
273 return false;
274 }
275 }
View Code
截图
源码下载
点击下载
以上是 Java实例---flappy-bird实例[最终版] 的全部内容, 来源链接: utcz.com/z/392837.html