这款游戏的起源是越南独立开发者开发的手机游戏,短时间内占据了全球各大手机软件商店免费排行榜的第一位。游戏中玩家控制一只小鸟飞过一个个柱子的间隙。飞的越远分数越高,看玩家能使小鸟在空中坚持飞多久。初始界面如图1所示。
完整源码+文档+视频 : 源码+论文 下载
玩家在上图所示界面任意位置,按下鼠标左键,开始游戏。
游戏开始以后,玩家需要不断控制点击屏幕的频率来调节小鸟的飞行高度和降落速度,让小鸟顺利的通过画面右端的柱子间隙。如果玩家不小心碰到了柱子或者落到了地面上,则结束游戏。如图2所示。
如图2所示的左上角显示了用户的得分,每通过一个柱子间隙得1分。另外,此时玩家可以在如图2所示的任意位置,按下鼠标左键,重新开始游戏。
新建名为teduBirdGame的的Java工程,然后,在工程下的src目录下新建包cn.tedu.bird,最后,将该工程所需的图片拷贝至该包下,工程结构如图4所示:
在项目中,包的名字一般为公司域名倒写,再加上项目名字,即为包名。
首先,新建BirdGame类,然后新建Groud类,表示游戏中的地面;新建Column表示游戏中的柱子;新建Bird类表示游戏中的鸟,这些类继承Jpanel类,都继承自Jpanel类。游戏中的各个对象如图5所示。
Jpanel是Java图形界面化(GUI)工具包swing中的面板容器类,可以理解为画板,包含在javax.swing包中,是一种轻量级容器,可以加入到JFrame窗体中。
其中,background属性是游戏背景贴图。
Ground类中,各个属性表示的含义如图7所示:
在Ground类中添加的代码如图8所示:
其中,image属性为地面的贴图。
Column类中,各个属性表示的含义如图9所示。
在Column类中添加的代码如图10所示:
其中,image属性表示柱子贴图。
代码如图11所示:
image属性表示Bird类的贴图,x,y表示鸟的中心位置,width和height表示鸟图片的宽度和高度。在本实训项目中,小鸟的大小用一个正方形区域来表示,size即表示该正方形的边长,用于后续的碰撞检测。
通过图12大家可以看出实例化Column类的时候,出现了编译错误,这是因为还没有为Column类编写一个带参数的构造器。
下面介绍一下x、y坐标的计算方式,第一个柱子的x坐标为x= 432+118=550,第二根主子的x坐标为x=550+245,因此,柱子的x轴坐标可以总结为x = 550+245*(n-1),其中n表示第几根柱子。
可以看出,柱子y的坐标范围在132至350之间随机分布,使用Random类的nextInt方法生成[0-218)之间的随机数,然后再加上132,这样就能得到132至350之间的随机数了。
步骤九:为Ground类添加构造方法,初始化属性
在main方法中,设置窗口的大小、居中、点击窗口的右上角“X”关闭窗口以及设置窗口可见,代码如图20所示。
在BirdGame类中重写paint方法,绘制界面。首先绘制地面,代码如图21所示。
使用Graphics的drawImage方法,绘制背景界面的时候,绘制的起点坐标是(0,0)。然后,绘制2个柱子,代码如图22所示。
绘制两个柱子的时候,绘制的起点坐标与Column类的属性x,y的值不同,需要做一些更改,具体见图23。
运行BirdFrame类,显示的界面效果如图26所示。
经过时间t的位移s的计算公式:
从图33可以看出,经过时间t后小鸟的纵坐标位置y1的计算公式为:
经过t时间后,小鸟的运行速度v为:
此时,Bird类中添加的代码如下所示:
然后,实现鸟的动画处理。使用数组,存储要显示的图片,共计8张,鸟每运动一次换一张图片,以达到鸟的动画效果。此时,Bird类中添加的代码如下:
从上述代码中可以看出,fly方法实现了鸟的飞翔。一个数对8取余,能够得到0到7之间的数字,正好是images数组中的下标,index/12的目的是 使鸟的挥动翅膀次数变慢,即切换照片的频率变慢。
接着,在BirdGame类的action方法中,调用Bird类的fly方法和step方法。运行后,会发现鸟可以动起来了。代码如图34所示。
最后,计算倾角。假设水平移动的位移固定为8,那么倾角 = 反正切s/8,在Bird类中添加的代码如下所示:
上述代码中,调用Java API提供的反正切方法atam,计算倾角。
接着,在BirdGame类的paint中,为达到鸟的飞翔效果,使用Java API,使小鸟旋转,代码如图36所示。
要实现鼠标的按下事件,步骤如下:
2、首先,在Bird类中添加flappy以实现鸟的飞翔。然后,在处理方法中,调用Bird类的flappy方法。
3、注册事件监听。即在BirdGame类的action方法中,注册监听事件。
在BirdGame类中添加的代码如图37所示。
在Bird类添加的代码如图38所示:
从图38可以看出,实现flappy方法,只需要将速度设置为初始速度v0即可。
要实现计分,需要进行以下操作:
1、在BirdGame类中增加属性score,用于计分,score初始化为0。
2、在BirdGame类的action方法的主循环中,添加逻辑判断。当柱子的x坐标与鸟的x坐标重合时,则加1分。
3、在BirdGame类的paint方法中将分数画出来。
在BirdGame类中增加的代码如下图所示:
1、实现鸟碰撞地面。
1)为BirdGame类增加boolean变量gameOver,该变量用于标识游戏是否结束,如果gameOver的值为true,则表示游戏结束了;如果gameOver的值为false,则表示游戏没有结束。gameOver的默认值设置为fasle。
2)当检测到碰到地面的时候,即gameOver的值为TRUE。在循环中检测是否碰到地面。在Bird类中增加方法hit(Ground)检测鸟是否碰地面。当鸟的y坐标减去size/2大于等于地面的y坐标时,则与地面发生碰撞。
3)修改BirdGame类的action方法中的主循环,当游戏没有结束的时,执行鸟和柱子的移动。也就是说,如果游戏结束了,鸟和柱子就不移动了。
4)在BirdGame类的paint方法添加gameOver的值为true时,显示游戏结束界面
从图40可以看出,小鸟与柱子发生碰撞的x的坐标计算入如下:
当鸟的x坐标大于x1(x > x1)并且小于x2(x < x2)时与柱子发生碰撞。但是如果在缝隙中,则不发生碰撞,请看如图41。
从图41可以总结出,小鸟在柱子的缝隙中时y坐标计算如下:
当鸟的y坐标大于y1(y>y1)并且小于y2(y<y2)时,鸟在缝隙中。
在Bird类添加hit(column)方法,用于判断鸟是否碰撞柱子,代码如图42所示:
修改BirdGame类的action方法,修改的代码如图43所示。
完成上述代码,即完成了判断鸟的碰撞功能。
首先,把游戏分成三种状态,分别是start、running以及game_over,start状态的界面效果如图44所示:
觉得本文对你有帮助的话,可以转发关注支持下谢谢·~