本文链接: https://xiets.blog.csdn.net/article/details/50188319
声明: 游戏中使用到的图片和音频资源来自网络,资源版权和游戏创意属原作者,这里仅供学习交流。
1. 概述
《Flappy Bird》,中文名称《像素鸟》,是一款简单而富有挑战性的益智休闲游戏。玩家只需要用一个手指点击屏幕即可操作,手指点击一下屏幕,小鸟就会往上飞一点,受到重力作用,又会不停往下掉,所以玩家要控制小鸟一直向前飞行,并注意躲避途中高低不平的水管,每飞过一对水管,就增加得分。飞行过程中如果撞到水管或掉落在地板上则游戏结束。
2. 游戏效果展示
HTML5 平台 在线演示(浏览器需要支持 WebGL): https://xiets.github.io/FlappyBirdForGDX/
Desktop 平台项目运行截图:
3. LibGDX 工程创建
使用 LibGDX 开发包中的 gdx-setup.jar 工具创建 Gradle 工程,工程相关参数如下:
- 项目名称(Name): FlappyBirdForGDX
- 项目包名(Package): cn.appkf.flappybird
- 游戏程序入口类(Game class): MainGame
- LibGDX 版本: 1.6.1
- Sub Projects: Desktop,Android,Ios,Html
- Extensions: 不需要任何扩展包
项目的创建步骤参考: LibGDX_1.5: 使用 Gradle 创建 LibGDX 所有平台的关联项目
4. 游戏的设计
游戏的程序设计,首先要仔细观察游戏的运行效果,通过现象分析原理和元素组成来设计程序。通过试玩《Flappy Bird》这款游戏,就玩家视觉上感觉而言,可以发现游戏场景中有一只小鸟不断地往右边飞翔,并穿越高低不齐的水管障碍。在程序中让小鸟沿着一张长地图从左边飞到右边的思维去设计并不好设计,并且这样设计出来的水管出现位置和高度相同,关卡长度也有限。在物理学中都有学过,运动是相对,因此可以把小鸟、地板、水管的运动做如下两种描述:
- (1) 以场景中的地板为参照物,小鸟不停地往右边飞翔前进闯关,穿越相对地板静止的水管。
- (2) 以手机屏幕为参照物,小鸟则是水平方向不动,一直在竖直方向上跳跃,水管和地板则是不停地从屏幕右边进入移动到左边并移出。
以手机屏幕为参照物,固定屏幕左下角为坐标原点,这样在程序中更容易设计,因此采用第(2)种方式设计程序,大致原理可如下所示:
- 固定一张大图片作为背景;
- 在场景中放置一只小鸟,横坐标固定不变,纵坐标受到重力影响在每一次循环中根据重力加速度改变位置,点击一次屏幕后,给小鸟一个竖直向上的初速度,然后又受重力影响速度不断减小往下掉(改变纵坐标),实际上就是小鸟在原地(相对于屏幕)跳跃等着水管穿越自己;
- 地板匀速循环向左移动;
- 定时随机生成一对水管从屏幕右边进入并匀速(和地板速度相同)移动到屏幕左边并移出(纵坐标不变,横坐标不断减小);
- 在每一次循环中判断一次小鸟和水管、小鸟和地板是否碰撞,并判断小鸟是否穿越了水管(实际就是水管主动穿越小鸟),穿越一对水管就得 1 分。
程序中的相关游戏元素节点的结构组成关系如下所示:
- DesktopLauncher / AndroidLauncher / IOSLauncher / HtmlLauncher(平台启动器)
- MainGame(游戏程序入口类,表示整个游戏应用)
- GameScreen(游戏主场景,包含 2 个舞台)
- GameStage(主游戏舞台)
- ImageActor(一张大图背景)
- FloorActor(floorActor,地板)
- ImageActor(tapTipActor,点击提示的图片)
- ImageActor(getReadyActor,准备提示的文字图片)
- BirdActor(小鸟,一个带动画效果的演员的封装)
- BigScoreActor(屏幕上方中间的分数显示)
List<BarActor>
(存放水管的集合)
- GameOverStage(游戏结束舞台)
- ImageActor(gameOverActor,游戏结束的文字图片)
- ResultGroup(游戏结果显示的元素组合,包括 奖牌、分数、最佳的分数)
- ImageActor(背景图片)
- AnimationActor(奖牌,由 4 帧组成的一个动画,根据分数评定等级,并固定显示等级对应的其中一帧)
- SmallScoreActor(当前分数)
- SmallScoreActor(最佳分数)
- ImageButton(重新开始游戏按钮)
- GameStage(主游戏舞台)
- GameScreen(游戏主场景,包含 2 个舞台)
- MainGame(游戏程序入口类,表示整个游戏应用)
其他与元素节点结构无关的类:
- Res(资源常量)
- CollisionUtils(碰撞检测工具类,判断给定的两个演员是否发生碰撞)
- GameState(游戏状态枚举)
5. 游戏源码
更加详细的游戏设计和游戏逻辑请结合上面所说的设计思路查看完整源码。