甘 泉,王启明
(平顶山学院计算机科学与技术学院,平顶山467000)
移动平台上射击类游戏设计开发
甘 泉,王启明
(平顶山学院计算机科学与技术学院,平顶山467000)
在移动应用设计开发过程中,基于类的设计成为应用开发的主流方法,类的设计方法及运用直接影响应用开发过程及结果。在Android移动应用平台上,采用面向对象的移动应用开发,以雷电游戏为例,着重探讨类的设计,开发一个射击类游戏。在应用设计过程中,分析了系统接口类的特点。通过系统分析,设计和分析类、类间关系和类的组织。为了便于团队开发,提高类的复用性,提出了类的优化建议。最后实现并发布游戏,为移动应用平台,尤其是Android平台应用开发提供参考。
移动平台;应用开发;游戏设计
Android操作系统因其稳定性、开放性、低成本等特点,受到广大手机游戏开发者关注。Android平台提供给开发者的开发类库,即Framework层提供的API和LIBRARIES层提供的一些类库,决定了移动应用的开发条件、开发过程和开发结果[1]。Android平台游戏设计是基于Android手机平台,运用Java语言,使用2D游戏引擎的部分技术,开发出针对于Android平台的手机应用[2]。这里以雷电游戏的开发为例,研究Android平台上移动应用中类的特性、组织、设计。基于Android平台借助面向对象的技术,对基础构件和常用设计进行抽象和实现[3]。
在游戏设计中,需要寻找实体。这里使用OOAD大师Peter Coad所提出的事物模式[4]来寻找实体。在一个游戏中,可以把“游戏的运行”看作一个事务,围绕着这个事务来分析出系统中涉及的类。对于一个游戏来说,通常需要有主角,敌人,以及Boss。在雷电游戏中,由于是射击类游戏,因此需要子弹这一实体类。至此共分析出4个和事物相关的实体类,分别命名为Player,Enemy,Boss,Bullet。除此之外,一个游戏还需要菜单和游戏背景,分别定义为:GameMenu和GameBackground。在实现过程中,可能还会出现其他的类,将在实现部分具体分析和实现。
在Android平台上开发游戏,需要使用系统预定义的回调接口,以及系统提供的方便游戏开发的一些类。本论文在游戏框架中将要介绍的类Activity就是其中的一个。此外,对于游戏开发,另一个比较重要的类是SurfaceView,它提供了局部重绘功能[5],这极大的方便了游戏程序员对屏幕的控制。这里又分析出两个由系统提供的类,至此,对系统的实体分析工作基本完成。
3.1 Activity类
在Android提供的API中,Android提供了Activity类,这个类实际上是一个接口,也可以说是系统的回调函数。程序员只要在这个类中实现系统定义的接口,完成相应的编码,当系统调用该类时,就会实现程序员所期望的效果。在Android应用程序设计中,最需要关注的就是Activity类的生命周期,利用其生命周期,实现诸如程序的运行,暂停及数据的存储等一系列操作。
图1 Activity的生命周期
图1就是Activity的一个生命周期,在这个游戏的实现过程中,需要复写Activity预定义的方法,实现系统和游戏框架间的通信。对数据的存储一般在onPause()中实现,对数据的恢复在onResume()中实现,以确保程序在各种情况下能读取到正确的数据。
3.2 框架设计
游戏实现通常是基于一个循环,在这个循环中处理用户输入,实现游戏逻辑和各种角色绘制。结构清晰的循环可以方便游戏的实现。在游戏雷电的实现中,使用如图2的循环结构。
图2 游戏通常的框架[6]
图2中,Input()函数用来接收用户输入,Logic()函数用来处理游戏逻辑,Paint()函数用来实现游戏绘制。再循环过程中,循环的频率决定屏幕刷新频率,从而影响游戏画面的质感。如使用每秒16帧的间隔会出现抖动,而50帧的间隔会使画面更真实。刷新频率受设备处理能力等影响,可根据具体需求而定,一般取值范围为[16..50],在此,雷电游戏的实现使用了每秒20帧的间隔[7]。
3.3 游戏框架的实现
根据Activity类和一般游戏框架,实现雷电游戏框架,其实现过程如下,游戏的后续实现将会在这个框架的基础上,逐步扩充。
(1)生成一个继承Activity的类MainActivity。
(2)创建一个继承自SurfaceView的类MySurfaceView,并在该类中实现游戏的框架(见图3中的loop片段)。
(3)在MySurfaceView的onCreate()方法中调用setContentView()方法,设置屏幕上要显示的视图为MySurfaceView中的内容。
在MySurfaceView中定义的Input()、Logic()和Paint()方法中将调用其他类中对应的Input()、Logic()和Paint()方法。整个系统对象的交互过程如图3所示。
由于在MySurfacView中实现的角色对象都继承自Sprite,并且为了清晰显示序列图中的交互过程,图3中通过使用多个Sprite对象代替Player、Enemy、Boss等对象,来显示对象间的交互情况。同时在图3中使用了OPT片段来显示在MySurfaceView中游戏进入不同状态时系统的行为。由于在每个状态中都执行onInput(),onLogic()和onPaint()方法,所以图3中省略了其他状态时系统的行为。
图3 游戏主体部分序列图
4.1 类的关系
在需求分析中通过需求实体,可以得到系统所需要的各个类。静态结构设计阶段就是分析游戏中各个类间的关系,找出他们之间的关联,从而方便游戏的实现。系统各个类间关系如图4所示。
图4 需求分析阶段分析出来的类
图4中增加了一个Boom类,用于实现子弹的爆炸效果。随后还要实现一个Rocker类(在图上给出)来实现一个屏幕上的游戏手柄,用来实现对游戏主角,即飞机的控制。
由于类图是对系统实体的抽象,并展现了各个抽象实体间的关联,例如,在MySurfaceView类中只引用一个Player类,所以,MySurfaceView和Player是一对一关系;一个Player可以发射多颗子弹,所以这里Player类和Bullet类是一对多的关系,如图5所示。
在实现过程中,一对一关联可以通过在调用方引用单个类的实例实现,一对多关联可以在调用方通过容器实现,这里使用向量(Vector)来实现。
图5 类之间的关系
从敏捷开发的观点出发,随着项目的实施和需求的不断变更,需要对项目进行不断更迭,这样系统的静态结构也会出现一些变化,由于篇幅所限,这里不再讨论更迭的过程,只给出项目类图的最终结构,如图6所示。
图6 项目最终静态结构
相对于图4,图6的变化是:将Gamemenu从MySufaceView中单独分离出来,并定义成单独的一个类MenuSurfaceView。其意义在于便于团队开发,很好的实现了分工和不同功能模块的隔离,其次也可以使菜单类MenusurfaceView得到重用。
4.2 类的组织
为了便于实现以及代码重用,需要对代码进行组织。根据每个类在程序中的实现功能和逻辑的不同,将代码分为四个包,如图7所示。
图7 系统包图
其中各个包所对应的职责如表1所示。
表1 各包包含类的介绍
对于com.gan.game包实际上还可以进行拆分,分成单独的一个游戏逻辑包和游戏精灵包,这样可以方便的对程序进行扩充,增加新的关卡。
5.1 菜单的实现
为了实现菜单选项和文字显示效果,在游戏实现过程中又定义了一个Button类和一个Panle类。Button和Panle类与MenuSurfaceView间的静态关系如图8所示。Button类的实现可以通过直接使用或者继承系统提供的Button类,或者在Menusurface-View中直接自定义一个Button类,并实现其绘制。同理Panel类的实现可以直接使用或者继承系统提供的TextView类。
图8 菜单界面类间的关系
5.2 背景的实现
滚屏背景的实现需要使用两张相同的图片,并使两张图片在垂直或者水平方向相接,然后不断的交替出现,从而实现屏幕的滚动效果。在实现过程中要求使用图片的高度应该稍大于屏幕高度,当一张图片到达屏幕底部时,立即将它移动至其后继的上方,如此反复以实现连续滚动的效果,如图9所示。
图9 雷电游戏背景界面的实现
在程序中实现时,滚动效果是通过改变被绘制图像左上角的Y坐标来实现的。
5.3 游戏中各角色的实现
游戏中的Enemy,Boss,Player以及Bullet类有很多相似处,如均有逻辑处理和绘制自身的能力,因此将这些方法抽象出来,定义成一个超类,以方便游戏的实现。在2D游戏引擎中通常被称为Sprite。此外2D游戏引擎中还具有一些代表性的技术,如碰撞检测,精灵动画等。也需要在Sprite类中实现,供其继承类使用。
在此以具有代表性的碰撞检测技术为例。通常,在2D游戏中,常见的有两种碰撞检测技术,即矩形碰撞检测和圆形碰撞检测,此外对于要求较高的游戏还有像素级别的碰撞检测。本游戏使用了矩形碰撞检测技术,就是把碰撞双方的边界都看成矩形,通过测试它们的边界是否相交来检验是否发生碰撞,其典型代码实现如下所示:
5.4 触屏手柄技术
智能移动终端带给人们触屏操控的快感,在触屏上进行方向操作,比较典型的做法是在触屏上设置一个虚拟键盘,实现方向操作。这个虚拟键盘需要实现两个功能。
5.4.1 小圆跟随手指的运动限制在一定范围内
为实现小圆在大圆内运动的效果,定义两个同心圆,将这两个同心圆的圆心设置为同一个点,如图10左图所示。让小圆随着用户的手指来回移动。为实现这个目的,需要规定当用户手指的触摸在大圆半径范围内的时候,只改变小圆的圆心坐标,在大圆范围外的时候,通过计算用户手指所在点到大圆圆心的弧度,然后乘以大圆的半径,这样就保证小圆在大圆的范围内,不会在屏幕上乱转,如图10右图所示。
图10 游戏触柄的原理
5.4.2 实现方向判断
为实现对四个方向的判断,需要使用数学上的三角函数,判断触点相对于圆心的弧度,然后判断该点的弧度是否在图11所示各个方向的弧度范围内。规定每一个方向的弧度区域为PI/4。通常在实现过程中以弧度表示角度。
图11 游戏触柄的数学原理
5.5 游戏主场景的实现
前述SurfaceView类提供了游戏开发所需要的局部屏幕重绘技术,使得游戏开发更加容易。在游戏的具体实现中让MySurfaceView继承SurfaceView类,并实现了callback和runable接口。callback接口是系统的一个回调接口,这样系统就能实现对surfaceView在缓冲池中的操作,runable是一个线程的实现,这样主线程就可以使用其子线程的方法实现对该子线程实现类的控制。
同时,本游戏在MySurfacev类中实现了整个游戏的逻辑,其游戏中各个角色的逻辑规则和描述如图12和表2所示。
由于Android平台增加了触屏输入方式,为实现对触屏输入的判断及处理,这里的Input()方法会被拆分成OnKeyDown(),OnKeyUp(),OnTouchEvent()三个方法,其原理是一样的。
图12 雷电游戏的逻辑
表2 各个实体对应的逻辑
需要注意的是,MySurfaceView是通过状态机来对应游戏的不同运行,如游戏失败时进入Game_Lost状态,并显示游戏失败的界面;游戏胜利时,进入Game_Win状态,并显现游戏胜利的界面。对该状态机各个状态的实现是通过定义不同的数值常量来实现的。
5.6 音效的实现
在Application层,MediaPlayer和SoundPool都可以用来播放声音[8],但是两者又有很大的区别。MediaPlayer类既可以播放声音又可以播放视频,其最大的特色是基于状态机实现的。该类适合于播放比较大的音频文件,如游戏的背景音乐。SoundPool类可以同时播放多种声音,正好符合游戏中同时播放多种音效的需要,但是其也有自身限制,就是不能播放太大(大于10K)的声音文件,否则会出现内存溢出。Android推荐在游戏中使用*.ogg和*.mid音频文件。对声音类的实现主要通过com.gan. Sound包。
通过压力测试工具monkey进行压力测试。这里只关注压力测试。进行压力测试的主要目的是检验程序中是否存在ANR(Application Not Response)错误,以及其它一些像音频文件过大等造成的内存溢出问题。测试结果如图13所示。
图13 压力测试结果
按照Android提供的系统安全策略进行程序发布。程序运行时效果如图14所示。
图14 程序运行时效果
在诸多移动应用平台上,选择Android作为游戏的实现平台。在应用开发中,以类的设计为主线,研究分析了Android平台的系统架构和组件模型,并剖析了一般游戏的框架结构,在此基础上实现了一个适合Android平台的游戏框架。参考常见2D游戏引擎的实现方法,使用了精灵动画,碰撞检测等典型技术,运用面向对象的方法实现了一个名为雷电的射击类游戏。在开发过程中注重类的设计,为移动应用平台,尤其是Android平台应用开发提供了参考。
[1] 柯元旦.Android程序设计[M].北京:北京航空航天大学出版社,2009.
KE Yuan-dan.Android program design[M].Beijing:Beijing university of aeronautics and astronautics Press,2009.
[2] Creative Commons Attribution.Android Development document[EB/OL].Beijing:Developers,2012.http://developer.android.com/sdk/installing.html,2014-11-22.
[3] 陈淮.基于Android游戏开发中常用类库的设计与实现[D].西安:西安电子科技大学,2011.
Chen Huai.Based on the Android game development in the design and implementation of a common class library[D].Xi’an:Xidian University,2011.
[4] 李华明.Android游戏编程之从零开始[M].北京:清华大学出版社,2012.
Li Hua-ming.Android game programming from scratch[M].Beijing:Tsinghua university,2012.
[5] Peter Coad.ObjectModels:Strategies,Patterns&Application[M].Yourdon Press,2008.
[6] 张鹏.3D手机游戏开发实例教程[M].北京:电子工业出版社,2000.
Zhang Peng.3Dmobile game development instance tutorial[M].Beijing:Electronic industry Press,2000.
[7] Dave Shreiner.OpenGL Programming Guide[M].American:Addison-wesley,2009:23-24.
[8] Creative Commons Attribution.Android Development document[EB/OL].Beijing:Developers,2012.http://developer.android.com/guide/topics/media/index.html.2014-11-22.
Design and Development of Shooting Game in Mobile Platform
Gan Quan,Wang Qiming
(College of Computer Science and Technology,Pingdingshan University,Pingdingshan 467000,China)
In the process of the design and development for themobile application,the design based on the class becomes themainstream of application developmentmethod.The designmethod and usage of the class directly affect the application development process and result.In android mobile application platform,a shooter game,adopting the object-oriented mobile application development and focusing on the design of the class,is developed.In the process of application design,the features of the system interface classes are analyzed.Through system analysis,the classes,the relationship between them and its organization are analyzed and designed.In order to facilitate team development and improve the reusability of the class,the suggestions for the class optimization are put forward.Finally,the game is realized and released to provide the reference for application development inmobile application platform.
Mobile platform;Application development;Game Design
10.3969/j.issn.1002-2279.2015.03.016
TP312
A
1002-2279(2015)03-0054-06
甘泉(1980-),男,安徽省灵璧县人,硕士研究生,讲师,主研方向:算法分析等。
2014-11-28