`
Lirongheng
  • 浏览: 4788 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JAVA线程游戏---flappy bird

    博客分类:
  • JAVA
阅读更多

   这本是早就应该要进行总结的博客了,在学习了线程之后,为了巩固自己对线程这个知识的掌握,做了个前段时间玩得好火的一个小游戏——flappy bird。这个游戏早在一个多月前已经做了,不能说是已经做好了,因为里面有好多的问题需要解决,没有及时解决这些问题问题的原因有很多,比如说自己的技术还不够扎实,这段时间也有好多其他的事情要做等等。。。。
   
我大概把游戏分为下面几个部分:
一、游戏场景
游戏主要有三个场景组成,开始场景、主场景、结束场景
二、主场景
主场景是由上下两个水管和水管之间空隙组成,间隙时一定的,下水管可以是随机出来的,然后上水管可以由下水管的数据计算出
三、小鸟
每次按一下向上小鸟坐标就向上加一定的高度,释放后就自由落下
四、游戏成绩
当小鸟没通过一个水管的时候分数就自加一定分值
五、死亡判断
当小鸟碰到水管或者是地面的时候,小鸟死亡,游戏结束。
判断到小鸟坐标与水管坐标或者地面坐标在一定的范围内就可以判断其死亡


做游戏的过程:
1.刚想到做这个游戏的时候,我也没仔细考虑那么多,所以不管它三七二十一,我马上做了个界面出来,然后用线程来让小鸟掉下来,用鼠标监听来控制小鸟的飞行,当时也没把各个对象抽象出来,就一个劲把它放到界面的那个类里面,然后又把地面、水管等陆续加进去,后来随着做的深入,发现这样是行不通的。因为我们做这个游戏还要拿到他的坐标判断游戏是否结束,现在的问题是我把小鸟、水管、地面等都放到一个类里面,根本就不方便往下做,因为这样拿不到他们的数据,比如说他们的坐标等。
2.在上面这样做行不通的时候,我只有停下来思考怎么做,其实很很明显,要把各个对象抽象成为一个类(当然可能还有更好的办法,但是我觉得现在办法是行的通的),这样一个类就只管一个对象,比如说,小鸟一个类、水管一个类、地面有事一个类,这样就能更好的做下去,各个类之间关系也不会那么,让每个类具有自己单一的功能,体现低耦合的思想。
3.做小鸟是比较简单的,毕竟一个线程就能轻松搞定了。。。但是现在水管应该怎么做呢?玩过这个游戏的人都知道,水管是上下对着各一根,上下水管之间的间距也是一定的,而且水管是随机出现的,我是这样做的,我是让上水管随机出现的,这样下水管就可以的位置也就能确定了,因为我们知道游戏面板的高度和上下水管的间距,所以可以确定下水管的位置。具体怎么实现,我下面会说明。
4.还有一步比较重要就是如何判断游戏的输赢。判断游戏的输赢也可以分为两种情况,一种是小鸟掉到地上了;一种是小鸟碰到水管了;当然可能会有人说游戏玩爆机了,当然这种情况我不会让它出现的,我会让水管不停的出来,所以这种情况就不用考虑了。。。
5.还有一个就是计算分数了,这个我觉得可以直接写在判断输赢的类里面,只要小鸟没越过一根水管,就令一个数加一,并显示到游戏面板上就可以了。
6.当然并不是这个游戏就只有那么简单的几步,还有其他的部分,比如说,开始的场景、结束的场景,如果真的要把做的很完美还有一点点细节需要考虑。


下面是我如何用代码实现的:
一、开始场景
[img][/img]


可以知道,这个开始场景其实我们还可以它细分问为三个重要的部分
a.下面动态的地面
b.上下飞扬的小鸟,其实我们看到的这个小鸟翅膀挥动的效果是有三张图片组成的,这也需要有线程来控制间断显示不同的图片
c.剩下的就是背景图了,这都很简单,但这里要说的是地面和后面天空的图是分开的,不是同一张图,还有就是只要双击游戏面板就能进入游戏了,因为我给面板添加了监听
我觉得这个场景的核心代码是:
[img][/img]



二、具体的小鸟
这里我用了一个showMe()方法,这样先把小鸟画了出来,我们可以最后在游戏的主面板上调用这个showMe()方法,当然这个类里面还有获取小鸟当前坐标的方法和鼠标监听改变小鸟坐标的方法
[img][/img]



三、水管类
水管的类主要就是解决下面的几个问题
a.如何随机出上面的水管和根据上水管的位置而确定下水管的为位置(需要注意的是这个随机产生的随机数应该写在构造方法里面的,我的方法是用一个数组来保存这些随机的数据,当然现在我这种方法是所有水管的位置度已经确定了,不过还有别的办法就是水管出现一个就出现一个,个人认为第二种办法更好,不过我现在用的是第一种,这种办法应该会比较耗内存)
[img][/img]


[img][/img]


b.获取所有水管的坐标(这里可以看出来,水管的坐标是用一个数组来保存的,所以要把整个数组都传到判断的类里面)
[img][/img]



四、判断游戏是否结束和计算分数
这个问题在把各个对象抽象成一个类的时候就已经变得很好解决了,前面已经把小鸟的坐标和水管的坐标都传到判断游戏是否结束这个类里面来了
可是我们应该用什么办法去判断呢?当然,既然是线程的学习,我还是用到了线程, 在小鸟和水管还没在同一个纵轴线的时候我先让这个线程睡一定的时间,当然这个一定的时间是要经过计算出来的,我们知道小鸟的初始位置,小鸟的横坐标不变,水管的纵坐标改变,还知道水管的移动速度,所以就能算出这段时间该让线程睡多长的时间了;紧接着的判断都是一样的,因为相邻的两个水管之间的间距是一定的,所以没个多长时间久判断一次就可以了,还有一点比较重要的就是如果就只判断一次肯定结果是不准确的,所以我们要在小鸟在水管经过的那一段时间都持续地判断。分数也就简单了,我说的简单是因为我哈没用到数据库的知识去保存这些游戏的分数,而是紧紧把游戏分数显示出来而已
具体代码:[img][/img]


[img][/img]



五、游戏结束场景
其实这个和游戏开始差不多的了

总体做出来的效果图:
[img][/img]


[img][/img]


[img][/img]




  • 大小: 38.5 KB
  • 大小: 52.9 KB
  • 大小: 61.1 KB
  • 大小: 20.6 KB
  • 大小: 49.5 KB
  • 大小: 13.8 KB
  • 大小: 55.1 KB
  • 大小: 66.9 KB
  • 大小: 38.5 KB
  • 大小: 37.3 KB
  • 大小: 44.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics