一、给游戏分块
给游戏分为4部分内容,分别是bird 、 background、game、main
1.bird:
在这个部分中,鸟具有的属性是:isDie(是否死亡)。方法是,扇动翅膀,下落,上跳,死亡。
2.background:
在这个部分中,背景的属性有:背景,管道(管道的属性有各个管道的高度、宽度和移动步长等属性。这里的管道是指上下两个管道)。方法有:背景移动,管道生成,管道移动等。
3.game:
在这个部分中,属性有:管道的索引,是否停止,游戏是否结束等属性,方法有:开始,判定,暂停,结束等。
4.main:
这个部分主要是用控制游戏的过程的,比如让游戏开始,暂停,或者在游戏结束后让游戏重新开始
二、遇到的问题及解决办法
1.背景无限循环问题:
1.一开始,我将管道与天空和陆地等背景放在一个盒子中,然后产生的问题是,天空和陆地是无限循环的,但是管道我无论如何也做不到无限循环,于是我换了个思路,将管道与天空和陆地隔开,管道单独放到一个盒子中去,然后现在至少天空和陆地可以无限循环,并且不受影响。
2.对于让管道无限循环的问题,我采取的解决方式是,让装管道的盒子单独移动,并且往一个方向一直移动下去,移动的速度和背景一样。然后在这个盒子每移动了特定的一段长度时,生成一个管道(上下两个管道)。
(因为天空和陆地的盒子是循环出现的,而管道的盒子是一个方向一直移动的,所以他们不能共用一个盒子)
2.判定小鸟撞到管道的问题:
1.一开始,我用时间判定,当小鸟飞到离第一个管道还有一个管道的时候,开始计时,然后计算小鸟每飞过一个管道到达下一个管道所需要的时间t1,设置一个定时器time1,设置time1每t1执行一次,在time1中再设定一个定时器time2和i,计算小鸟完全飞过一个管道的时间t2,然后将time2设置为1ms执行一次,每执行一次i加一,当i等于t2时,清除定时器time2,在i未到达t2时,若小鸟的高度不在上下两个管道之间,则判定小鸟撞到了管道,清除所有定时器,重新开始。但是这有一个缺点,就是每暂停一次,程序就会出错,因为当time1或者time2进行到一半时,暂停,就会清除定时器,然后再重新开始的时候,time1和time2又会重新计时,这样的话,小鸟的位置和管道的位置就会对不上。
2.第二种方案就是,先设定一个定时器runtime,当装管道的盒子移动的距离为第一个管道到小鸟的距离时,开始判定(用 if )。计算一个管道到下一个管道的距离s1,从开始判定的位置开始,每移动一个s1的倍数的距离,管道的索引值index加一,这样就可以让小鸟分别与每根管道进行判定。再计算下一根管道的左侧距的位置pipeWidth(上一根管道的左侧与装管道的盒子移动的距离之差),再计算小鸟刚到与管道左侧接触时管道左侧的位置P1和小鸟完全飞出管道时管道左侧的位置P2如此,当pipeWidth在P1和P2之间时,进行碰撞判定就解决了,目前没有发现什么问题,判断代码:
因为小鸟的左右位置是不变的,所以我们只需要根据管道左侧的位置来进行判定就行。