APP下载

基于libGDX的Android赛车游戏的设计与实现

2015-01-17张艳青

电子设计工程 2015年1期
关键词:赛车页面赛道

张 晓, 张艳青, 苏 航

(1.华南理工大学 计算机科学与工程学院,广东 广州 510006;2.华南理工大学 软件学院,广东 广州 510006)

随着科技的发展,智能手机已经与我们的日常生活密不可分,当前主流的智能终端操作系统有 Android,IOS和Windows Phone等,其中Android是Google公司推出的开源手机操作系统[1]。2012年11月数据显示,Android占据全球智能手机操作系统市场76%的份额,中国市场占有率为90%。越来越多的人喜欢在闲暇时间玩手机游戏,中国手机游戏市场在近几年也一直保持了较快的发展[2]。优良的手机游戏不仅能给人们的生活带来乐趣,也能给开发者带来可观的经济收益。游戏引擎是游戏的核心,选择一款兼容性好、高效、容易使用的游戏引擎,能大大降低游戏开发的成本。libGDX游戏开发框架就是这样一款备受开发者青睐的引擎。本文将介绍利用libGDX来快速的开发一款简单、有趣的Android赛车游戏。

1 libGDX介绍

libGDX基于 Apache License,Version 2.0协议,由 Java/C/C++语言编写而成,是一个免费并且高效的跨平台的2D/3D的 游 戏 开 发 框 架 , 它 由 audio、files、graphics、math、physics、scenes、utils这些主要类库所组成,分别对应了libGDX中的音频操作,文件读取,2D/3D渲染,libGDX绘图相关运算,Box2D封装,2D/3D游戏组件,以及libGDX内置工具类,它们之间的关系如图1所示。它使用JNI封装了物理引擎Box2D的C++版本,使得其运行效率比其他同级的物理引擎要更快[3]。

图1 libGDX框架架构Fig.1 Framework architecture of libGDX

一般在Android开发中,一个页面是一个Activity,一个应用中包含多个Activity。而在基于libGDX的Android应用中,只有一个Activity,而且是用一个继承了Activity的Android Application来作为整个程序的父类。libGDX中把Screen当成页面,通过Game的setScreen方法来实现不同页面的切换。每个Screen又可包含多个Stage对象,同一个Screen中多个Stage的切换也可以达到页面切换的效果。 而页面中的物体称为 Actor,在 Screen 的 show()方法中,调用 Stage.Add(Actor actor)方法将物体添加到Stage中,这样就构成一个游戏页面。在Screen的render()方法中,可以不断的更新各个Actor的状态,从而达到游戏运行时动态变化的效果。

2 系统方案设计

赛车游戏的主要逻辑位于游戏主页面中,在手机屏幕下方摆放一辆赛车,让用户通过手机的重力加速度感应器来控制左右移动,让其他的赛车和背景赛道地图像下滚动,可以给人一种相对的向前运动的感觉。用户控制赛车向前行驶,会和屏幕上的其他Actor发生碰撞,所以必须要有碰撞检测。

根据赛车游戏的特点,通过加载资源,进入游戏主菜单页面,然后点击“开始游戏”即可进入游戏主界面开始游戏了。当游戏结束时会进入成绩排行榜页面,显示历史成绩,在排行榜页面也可以返回到游戏主菜单或者直接重新开始游戏。游戏的设计流程图如图2所示。

图2 赛车游戏流程图Fig.2 Flow chart the racing game

3 系统实现

3.1 地图滚动

要实现赛道地图滚动的效果,一种比较简单的方案是用两张关于赛道的图片放在一起,在屏幕中向下移动,一张图片移出屏幕造成的空余由另一张图片移进屏幕来填补,不断循环,这样可以达到赛道滚动的效果,如图3所示。libGDX中Actor的setY方法可以直接设置图片的Y轴坐标,从而让图片不断的移进、移出屏幕。

3.2 元素添加与移动

游戏主页面中赛道上面包含的可移动的元素有赛车和道具等。这些元素都是作为Actor对象来添加到页面的Stage中的。

赛车分为两类,一类是用户直接控制的赛车,取名为playerCar,另一类是由系统自动控制的赛车,取名为friendCar。playerCar位于屏幕中Y轴方向上的固定位置,通过重力加速传感器来控制playerCar的左右移动。friendCar由系统控制运行,多辆friendCar不断的放在屏幕上(赛道图的顶端),并设置向下运行的速度。因此,playerCar在垂直方向上绝对位置不变,而多辆friendCar向下方移动,让用户感觉playerCar是在向前行驶。

图3 地图循环滚动过程Fig.3 Map cycle rolling process

为了提高程序运行的效率,可以用对象池来管理friendCar。即在程序初始化的时候,实例化多个friendCar对象,放到一个集合中构成对象池,当需要添加赛车到屏幕上的时候,从对象池中取出一个friendCar,按照需要修改相应属性,然后将它放到屏幕中上运行[4]。当这个friendCar要从屏幕上消失(被炸毁或者超出屏幕)的时候,可直接将这个对象放回到对象池中,如图4所示。

图4 利用对象池来管理赛车流程图Fig.4 Flow chart of using object pool to manage the car

赛车对象池就是赛车对象的一个集合,libGDX中可以使用Group对象来表示这样的一个集合,通过Group对象的getChildren()方法来得到该集合中的所有元素。

程序中可以添加一些道具,比如炸弹道具,playerCar得到这个道具之后,可以发射出炸弹,可以炸毁与之有接触的friendCar。道具的添加和移动可以基本按照赛车添加和移动的方式来实现。

3.3 碰撞检测

用户控制赛车向前行驶,会和friendCar以及道具产生碰撞。playerCar与friendCar之间的碰撞检测可以采用libGDX中已经封装好的Box2D物理引擎,Box2D可以很方便的检测到碰撞,并根据设置刚体的各种属性,让碰撞的效果更加逼真。

而playerCar与道具的碰撞则不必采用Box2D,可以直接把赛车和道具看成两个矩形,从而只需检测两个矩形是否有接触[5],libGDX 中 Actor的 getX()和 getY()方法可以得到该Actor的所处位置,getWidth()和getHeight()可以得到该Actor的宽度和高度,这样就能很容易的检测两个Actor代表的矩形是否相交,如果这两个矩形有相交,则表示有碰撞。

3.4 成绩排名

用户每玩一次游戏,都会根据游戏中相应的数据计算出一个得分作为本次游戏的成绩。Android系统集成了SQLite,它是一款非常流行的嵌入式数据库,支持SQL查询,并且只占用很少的内存[6]。可以用本地数据库SQLite将成绩保存起来,让用户能够查看历史成绩,但是如果保存每次游戏的成绩,那将势必会使应用占据越来越多的手机存储空间。从手机空间和用户体验的角度来看,可以只存前十名的成绩。如果用户成绩数据表中已经存了十条记录,那么下一条前十的成绩可以直接用来更新原来的第十名的成绩。

3.5 屏幕适配

Android手机种类繁多,对应的手机屏幕的尺寸也是大小不一。赛车游戏的UI需要尽量照顾到各种尺寸的手机屏幕。我们可以取当前比较普遍的手机屏幕分辨率800*480为基准,用本手机的高度除以800得到BX,用本手机的宽度除以480得到BY,将BX,BY作为一个基础的比例,程序中布局时,设置图片位置时,用相应的宽度和高度来分别乘以BX和BY,再进行设置,可以达到很好的屏幕适配效果。

3.6 动画与声音

libGDX中提供了Animation类,可以用来实现动画效果,其实质就是连续播放多张图片。libGDX中用Sound来播放比较短暂的声音如爆炸声音,用Music来播放长时间的声音比如背景音乐,通过Sound和Music可以很方便的播放游戏中需要的声音。为了保证游戏的流畅性,动画中包含的多张图片和声音资源都需要进行预加载。

4 仿真结果

整个应用实现完成以后,在LG Nexus4手机中得以成功运行。选取了游戏运行时主页面的几个运行画面,运行结果充分显示出程序运行良好,也基本符合设计要求。如图5所示,在游戏主页面中 playerCar是用户控制的赛车,friendCar由系统控制,图中出现了两个道具,分别是能量道具和炸弹道具。如图6所示,用户通过点击屏幕右半部分使playerCar发射炸弹,炸毁一辆friendCar时出现的爆炸动画。

图5 游戏主页面Fig.5 Main page of racing game

图6 爆炸效果Fig.6 The explosion effect

5 结束语

文中介绍了游戏开发框架libGDX,并基于此框架设计和开发了一款流畅、有趣的Android赛车游戏,玩家通过简单的交互如点击手机屏幕左侧或右侧、轻微摇晃手机就可以体验本游戏。结果表明,libGDX提供了丰富且易用的接口,使用它来开发手机游戏,在保证功能得以实现的同时,又可以缩短开发时间、降低开发难度。

[1]黎忠文,覃志东,王全宇,等.基于Android平台手机游戏引擎的设计与实现[J].计算机工程与设计,2014,35(1):119-124.LI Zhong-wen,QIN Zhi-dong,WANG Quan-yu,et al.Design and implementation of mobile game engine based on Android platform[J].Computer Engineering and Design,2014,35(1):119-124.

[2]崔浩然.基于Android平台的手机游戏的设计与实现[D].西安:西安科技大学2011.

[3]吴庆林.基于libGDX的Android游戏研究与开发[D].广州:华南理工大学,2012.

[4]水超,李慧.对象池模式的扩展与设计[J].计算机工程,2004,30(9):26-27.SHUI Chao,LIU Hui.Extension and implementation of object pool pattern[J].Computer Engineering,2004,30 (9):26-27.

[5]高春晓,刘玉树.碰撞检测技术综述[J].计算机工程与应用, 2002(5):9-11.GAOChun-xiao,LIUYu-shu.A survey of collision detection[J].Computer Engineering and Applications,2002(5):9-11.

[6]彭艳,杨欧.Android平台的数据存储技术[J].计算机系统应用,2012,21(5):192-193.PENG Yan,YANG Ou.Analysis on the data storage of android application[J].Computer Systems&Applications,2012,21(5):192-193.

猜你喜欢

赛车页面赛道
刷新生活的页面
自制冰墩墩不能滑出“法律赛道”
科创引领,抢跑新赛道
征服蒙特卡洛赛道
云上赛车
春季赛车会
无人驾驶,先上赛道如何?
加油吧,赛车!
遥控赛车
Web安全问答(3)