游戏运行画面:
首先分析该游戏中的对象:
在游戏中共有四个对象(即在窗口中显示出来的元素),分别为背景、柱子、地面、小鸟。其中背景在运行过程中没有变化,因此在主类中定义一下就好,没必要用一个单独的类;而其余的三个对象在游戏整个运行的过程都处于不停变化中,且有各自独特的变化逻辑,因此选择使用单独的类来定义。(Game为主类,column为柱子,bird为鸟,ground为地面)
再依次分析各个对象:
地面:
在gif中可以看出,地面共有两种状态,静止与向左移动,静止不必说,向左移动为y轴坐标保持不变x轴坐标减小,因此在ground类中需要写一个函数实现每次左移一步的功能。
属性方面即图片的一般属性,x,y轴坐标,width,height图片宽高。
1 public class ground { 2 BufferedImage image; 3 int x,y; //位置 4 int width,height; //宽和高 5 public ground() throws IOException { //构造函数 6 image= ImageIO.read(getClass().getResource("/resources/ground.png")); 7 width=image.getWidth(); 8 height=image.getHeight(); 9 x=0; 10 y=500; 11 } 12 /*左移*/ 13 public void step(){ 14 x--; 15 if (x==-109){ //因为图片大小有限,每次左移到一定位置的时候就需要把图片位置重置 16 x=0; 17 } 18 } 19 }
柱子:
柱子和地面有些类似,也是只有静止与左移两种状态,因此在柱子类中也只需要step这一个左移函数。
但在属性方面,由于每一根柱子是一个单独的对象,而在游戏运行的过程中屏幕中最多同时出现了两根柱子,且两根柱子之间的距离一定,因此在构造柱子这一对象的时候要根据这是定义的第几根柱子来设置初始位置。而且!柱子的y轴坐标是变化的(即柱子中间的缝隙的位置是变化的),还需要一个一定范围内的随机数来设定y轴坐标。而且且!别忘了柱子是有缝的!缝隙有多宽也是需要设置的,这在接下来判断小鸟是否发生碰撞时是必须属性。
1 public class column { 2 BufferedImage image; 3 int x,y; //位置 4 int width,height; //宽和高 5 int gap; //柱子之间的缝隙 6 int distance; //两个柱子之间的距离 7 Random random=new Random(); //随机数,用来改变每根柱子的上下位置 8 /*n为第几根柱子*/ 9 public column(int n) throws IOException { 10 image= ImageIO.read(getClass().getResource("/resources/column.png")); 11 width=image.getWidth(); 12 height=image.getHeight(); 13 gap=144; 14 distance=245; 15 x=550+(n-1)*distance; //第一根柱子初始x坐标为550,以此类推后面的柱子的初始位置 16 y=random.nextInt(218)+132; //虽说每一根柱子的y轴位置是随机生成的,但还是要有一个范围使游戏更合理 17 } 18 /*向左移动一步*/ 19 public void step(){ 20 x--; 21 /*当柱子移动到屏幕最左端,且正好完全消失的时候,改变其x轴坐标, 22 使其移动到屏幕右端新柱子该出现的位置,并重新随机设置y轴坐标*/ 23 if (x==-width/2){ 24 x=distance*2-width/2; 25 y=random.nextInt(218)+132; 26 } 27 } 28 }
鸟:(鸟这个东西真是把