Flying Birds' blog 3rd

2021年07月16日 99 字


Bird类思路要点

关于实践周的第一个项目选择了制作Flying Birds小游戏,此小游戏的易上手之处其实还在于通过几帧的小鸟图片来代表小鸟的运动形态。
飞行动作(变化一帧)依靠以图片类型构成的数组内重复调用小鸟状态的图片来显示。
移动一步需要依靠计算上跑位移、计算鸟的坐标、计算下次移动速度、计算倾角(反正切函数),向上飞行时按照惯性需要重置速度。
其中设计小鸟的另外两个关键函数在于判断小鸟是否碰撞到地面或者检测小鸟是否撞到柱子,此为游戏规则。

Bird动画原理

1
2
3
4
5
6
7
8
9
10
11
12
13
Image[] images;//一组图片记录小鸟动画帧(images类数组的一组照片,Source里面的小鸟的不同照片完成小鸟的动作动画)
int index;//帧数下标
...
...
//初始化动画帧参数
images=new Image[8];

for(int i=0;i<8;i++)
{
images[i]=new ImageIcon("source/"+i+".png").getImage();
}
index=0;//利用source后面i++来访问souce里面的Bird照片,所以照片存储摆放会有影响

首先有一个Souce文件里面需要收集小鸟多个状态的图片,在此次项目中放置在Source的文件包里面,关于小鸟的每一帧形态的图片为该包内的0-7个文件。
此处文件顺序对动作会有影响,上述代码附带解释。

Bird中step:移动一步

1
2
3
4
5
6
7
8
9
10
11
12
13
public void step()
{
double v0=speed;
//计算上跑位移
s=v0*t+g*t*t/2;
//计算鸟的坐标
y=y-(int)s;
//计算下次移动速度
double v=v0-g*t;
speed =v;
//计算倾角(反正切函数)
alpha=Math.atan(s/8);
}

移动中根据间隔时间需要计算鸟出现的坐标以及倾斜角展示鸟下落或者上飞的一个过程。

Bird类碰撞判断(游戏不碰撞的规则)

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

//检测小鸟是否碰撞到地面
public boolean hit(Ground ground)
{
boolean hit =y+size/2>ground.y;
if(hit)
{
y=ground.y-size/2;
alpha=Math.PI/2;
}
return hit;
}

//检测小鸟是否撞到柱子
public boolean hit(Column column)
{
//检测是否在柱子范围内
if(x>column.x-column.width/2-size/2&&x<column.x+column.width/2+size/2)
{
if(y>column.y-column.gap/2+size/2&&y<column.y+column.gap/2-size/2) return false;
return true;
}
return false;
}
}

hit类用boolean类型定义返回值可以选用0或1方便之后的判断是否碰撞(即0或1)
考虑碰撞的两个需要同时满足的因素:一是小鸟是否会从侧面撞到柱子所以调用到column.width 二是在满足一的条件下小鸟坐标是否位于间隙(gap)坐标内

Bird起飞

1
2
3
4
5
6
//向上飞行
public void flappy()
{
//重置速度
speed=v0;
}

对鼠标左键进行监听,当点击鼠标左键时,小鸟会获得一个向上的速度,当松开鼠标左键的时候,小鸟就会坠落。

Welcome back AM1ng!

本文作者: AM1ngkk
本文链接: https://am1ngkk.github.io/2021/07/16/Blog3/