基于安卓平台上的猴王争霸游戏设计与开发学位论文.docx
《基于安卓平台上的猴王争霸游戏设计与开发学位论文.docx》由会员分享,可在线阅读,更多相关《基于安卓平台上的猴王争霸游戏设计与开发学位论文.docx(14页珍藏版)》请在冰豆网上搜索。
基于安卓平台上的猴王争霸游戏设计与开发学位论文
各专业完整优秀毕业论文设计图纸
基于安卓平台上的猴王争霸游戏设计与开发
班级软件092姓名王伟涛指导老师:
薛桂香
摘要:
当前,基于安卓平台上的应用发展迅速并具有极强的生命力。
本课题即是在安卓平台上开发一款二维动作类竞技游戏。
在安卓平台上开发动作类游戏需要熟悉安卓系统的运行机制,能够把握动作类游戏的设计原则和设计方法。
使游戏既能吸引玩家使其快速上手,又能留住玩家、持续吸引玩家。
设计该类游戏需要采用原型开发模型,并使用合理的人机交互方式来开发操作方式,还要兼顾安卓系统版本差异和手机之间的差别。
游戏采用重力感应和多点触控技术,同时使用图片缓存技术加载大图片,利用多线程并发技术提高游戏的流畅度和运行速度。
游戏将设置不同难度的游戏AI以提高游戏的趣味性。
测试表明,该游戏具有很好的用户体验,良好的兼容性,便捷的操作方式,能给喜爱动作类手机游戏的人们带来很好的娱乐体验。
关键词:
安卓,多线程并发,动态图片加载,游戏AI
1引言
在当今社会,手机陪伴人们的时间越来越长,地位也越来越重要。
在手机娱乐中,手机游戏占有着重要的地位,几乎所有玩手机的人都会或多或少的玩着手机游戏。
本课题所要完成的就是一款基于安卓平台上的手机动作类竞技游戏。
2游戏的定位和设计需求
本毕设所开发的游戏面向喜爱动作竞技类游戏的年轻人,通常来说手机游戏一般所利用的是零碎时间,因此设计该游戏的每局时间一般不超过5分钟。
由于是偏向动作竞技,那么游戏需要较好的操作感和良好的游戏画面。
3游戏任务
游戏中,玩家操纵一名猴子在树林里寻找“齐天大圣盔甲”。
玩家可以控制猴子在树林里跳跃,并能够停留在树枝或者地面上。
在寻找盔甲的同时可以发射子弹来干扰其他猴子,被击中时猴子会眩晕一段时间,恢复正常后可继续寻找盔甲。
游戏中可以选择AI的数量和难度,玩家操纵猴子首先找到盔甲则获胜。
4游戏技术
4.1游戏兼容性技术
首先,关于很多系统版本兼容性的问题,安卓的系统版本是向上兼容的,也就是说在低版本上开发的软件可以在高版本上运行,不过一定要采用最高版本的SDK进行开发。
所以,在配置开发环境时,需要选用最高版本的SDK进行编码。
另外我们还要知道主流版本和最新版本。
目前市场上,版本的游戏兼容性最好的是安卓2.3,最新版本是安卓4.2,一般比较新的机器和配置较高的机器采用的是安卓4.0或安卓4.1版本。
所以在开发时,需要兼顾目前较低版本的系统,因此要将MinimumRequiredSDK设置为android2.2,同时将TargetSDK设置为最新的安卓4.2以实现版本的兼容。
另外,关于不同手机分辨率的问题。
本游戏的单位并不是直接以像素点作为单位,而是获取目标手机的屏幕的长和宽,再根据游戏的需求动态生成一个基本单位。
这是就可以间接利用像素点单位来避免不同手机屏幕分辨率所带来的问题。
4.2游戏视角与地图技术
在游戏中,游戏地图远比屏幕大。
当玩家角色在地图中移动时,屏幕视角必须始终跟随玩家角色。
在跟随过程中,最好的跟随方式就是让玩家角色始终显示在屏幕中央,除非玩家到达地图的边缘,如图4.1所示。
在游戏中,每次进行绘制屏幕时,都会重新获得当前时刻玩家角色的坐标值(为游戏地图上的坐标值)。
然后,绘制出一个等于显示屏幕大小的、以玩家角色为中心的屏幕,这样就能做到让画面视角始终跟随玩家角色。
但是,由于地图是有边缘的,所以仅当玩家角色位于屏幕中的一定范围内(如下图所示的虚线框范围内)时才生效。
当玩家角色落到游戏地图的边角时,那么屏幕就会使用最接近的一个中心点来完成屏幕跟随显示。
在开发游戏地图时分三个图层进行制作。
第一个图层是背景层,第二个是前景层,第三个是碰撞层。
二维游戏中,利用背景层和前景层的相互关系来造成玩家视觉上的空间立体感,更有利于画面的逼真。
游戏中,背景层始终显示在屏幕的最底层,简单言之可以理解为用来填充屏幕的空缺部分的一层。
而前景层则是游戏地图上的画面。
画面是根据玩家角色所在的地图坐标显示的一个等于当前屏幕尺寸的矩形。
这样,当玩家的角色在跳跃或者降落时,前景图片就会动态变化,而背景图片始终不变,游戏角色的活动也动态显示。
这样就会形成一种错落有致的画面感,产生距离的效果。
4.3游戏绘图技术
在通常情况下,开发二维游戏甚至做界面相关都使用View作为其显示图片的容器。
可是,当开发一些复杂的、对效率要求较高或者对画面质量要求较高的游戏时,View类就不能满足开发需求了。
这是因为View类并不能直接访问Canvas,必须要通过handler才可以,这样就降低了效率。
另一方面,当采用SurfaceView类来进行开发时,对于刷新频率要求较高的图片可以采用双缓冲来显示,游戏中的背景、人物、动画等都需要绘制在一个画布(Canvas)上,而SurfaceView可以直接访问一个画布,提供给直接画像素而不是使用窗体部件的应用。
所以在开发游戏时,可以通过创建一个线程对SurfaceView进行访问以刷新图片。
在游戏绘图中,往往是设置一个单独的绘图线用于直接访问SurfaceView里面的Canvas并对其进行绘制。
游戏每秒钟绘制的图片数量要合适,既不能少,也不能太多。
首先,如果每秒钟绘制图片少于24张就会使人感觉到视觉上的卡顿;相反,虽然每秒绘制的图片非常多肯定会使图片的连贯性很好,但是由于游戏是运行在安卓机器上,考虑到机器的配置差异、性能差异以及当前手机的内存和CPU使用率等重要因素,一味的追求高品质画面只会让游戏无法在低配置的机器上正常运行,从而影响游戏的推广。
所以,对于每秒刷新次数进行控制的最好的方式是结合当前机器的配置和CPU使用率进行动态配置,可以将刷新次数规定为35-45次每秒。
由于SurfaceView里面并不能直接插入按钮控件,而游戏又必须要用到状态的切换按钮、暂停按钮等等。
对于这个问题本系统所采用的方式是在屏幕需要插入按钮的位置插入那些按钮图片,然后在屏幕触摸事件里面进行监听,当触摸到该按钮的位置大小时进行相应的按钮事件处理。
屏幕刷新线程操作顺序如图4.2所示。
4.4游戏中的交互技术
在本游戏中,主要的交互方式是触控和重力感应。
通过观察发现,玩家对于点击触摸屏手机按钮并不是特别敏感。
也就是说,点击一两个处于边角位置的按钮还可以,但如果点击一些距离很近的按钮时,就会遇到困难。
所以触摸屏最好的交互方式不是用虚拟按键,而是通过滑动或者点击触摸屏的不同位置来实现交互并且辅助以重力感应,这样可以取得良好的用户体验。
关于重力感应,在本游戏中必须要先获得activity的重力感应对象,然后再在SurfaceView类里面实现SensorEventListener接口,再复写publicvoidonSensorChanged(SensorEventevent)方法就可以获得当前的重力感应数值。
安卓的重力感应分为X、Y、Z三个轴。
将安卓手机正放,左上角为顶点,由左上角向右沿着手机窄边为X轴,左上角向下沿着手机长边为Y轴,垂直手机平面向上为Z轴。
当任何一个轴为水平时,它的重力感应值为零,当轴向上时值为正值如果是向上90度则值最大,如果轴向下那么值为负,向下90度为最大值。
因此,游戏要在复写的方法里面实时的获得当前的重力感应值,并由重力感应值来决定玩家角色在空中时左右晃动的速度。
由于重力感应值会随着手机的晃动实时的改变,在用手机感应值生成速度时,最好的方式是玩家角色在空中时的左右速度与重力感应值为一次线性关系。
这样才能更好的符合玩家的控制感觉。
至于这个线性关系的系数取值,需要根据游戏的地图和玩家角色的属性值决定。
游戏的另一个重要的交互方式就是触摸技术。
安卓系统自带了很多手势识别的类和处理函数,不过在本游戏中并不太需要这些发杂的手势识别。
因为,本游戏所需要的交互方式是点击屏幕和长按屏幕。
因此,只需要识别点击的位置、按住时间、松开时刻就可以,对于滑动的事件并不处理。
在本游戏中,对SrufaceView类的publicbooleanonTouchEvent(MotionEventevent)方法进行重载。
然后获得当前触控点的坐标,这样就可以对触摸事件进行处理。
首先,当玩家角色处于跳跃状态时,点击屏幕则在触摸事件里面进行计时并显示蓄力进度条,这个蓄力是以每十毫秒一定的百分比增加,到百分之百停止。
然后,当玩家松开摁在屏幕上的手之后,将根据这个百分比乘以玩家角色最大的跳跃初速度来得到玩家角色向上跳跃的速度。
如果,玩家是在开火状态时,玩家只要进入武器状态武器蓄力条就开始加载,加载原理同跳跃蓄力条。
之后玩家点击屏幕上某一点,那么子弹将根据蓄力条的百分比乘以玩家角色武器能量的最大值来决定子弹的初速度,再通过点击的位置和玩家角色所在位置分解子弹的初速度为X轴方向速度和Y轴方向速度。
这样就可以实现用触摸屏完成玩家角色跳跃和开火功能。
4.5多线程技术
在本游戏中,需要用到多线程并发技术,要并发的线程比如游戏主界面的重力感应线程、触摸屏的监控线程、SurfaceView刷新线程、碰撞检测和物体效果线程、计时器的计时线程、AI线程等。
在安卓系统中按照进程进行资源分配,CPU的调度则按照线程。
也就是说如果安卓进程的线程越多,理论上它所获得的总执行时间也就越长,这就意味着它可以更大限度的利用系统的资源取得更好的游戏效果。
另一方面,如果将这些功能全部都集中于主线程来完成,那么势必会使主线程执行周期大大加长从而使游戏相应用户操作的延迟加大,但是安卓手机系统的CPU和内存利用率也许并不高,这就造成了所谓的进程的假死,使得游戏异常卡顿并极大程度上影响了用户体验。
所以,在开发本游戏时,必须要对各个功能进行划分,提取出多个线程进行并发处理,最大限度的利用手机的硬件资源。
但是由于安卓手机配置种类繁多性能参差不齐,安卓系统对于线程的创建和回收上的资源开销也不可忽略,因此线程应该做到高内聚低耦合。
游戏线程中重力感应和触摸屏监控由系统完成,剩下的SurfaceView的刷新线程、碰撞检测和物理效果线程、计时器线程、AI线程需要自己编写。
这些线程都是要经历线程的创建、运行、结束三个阶段。
当游戏主界面开始时,线程开始创建并运行,游戏结束并跳转到游戏结果页面时,线程应当被关闭。
但是,在通常的情况下,如果采用stop()或者destroy()方法来完成线程的停止可能会引发异常或者错误,同时也不利于实现游戏的暂停功能。
那么,既然不能用强制关闭线程的方式来结束线程,不妨设置标志位来控制线程的运行。
如采用while(live){/*线程内容*/;sleep(time)}的方式,当游戏主界面开始时,将线程启动,设置live变量为true,然后重载游戏主界面的destroy()方法;当游戏主界面销毁时,设置live变量为false,这样线程就可以正常结束运行而不会发生任何异常和错误。
当进程中存在线程并发执行时,手机的硬件性能会得到很大的利用,但是线程之间的同步互斥则是程序面临的另一个问题。
在java中对于对象之间加锁可以采用synchronized实现。
对于一些变量的互斥访问,可以采用lock()来进行加锁实现。
本游戏中也有需要互斥访问的变量,比如SurfaceView的刷新线程正在对游戏画面进行重新绘制时,如果此时游戏的碰撞检测和物理效果线程对玩家人物进行了位置上的移动,那么势必会造成游戏中玩家角色前后绘制的数据不一致造成位置上的差别。
诸如此类需要同步的地方还有很多,但是纵观这些需要并发的地方,假如没有采用lock()锁来保持同步,所造成的影响并不是十分恶劣。
但是如果采用了lock()锁,那么会导致游戏线程之间的并发量大大下降,从而使游戏画面异常卡顿,用户体验极其糟糕。
因此,对于游戏中需要并发处理的地方,大多采取鸵鸟算法,也就是视而不见或者尽可能采用别的方式让用户无法觉察。
比如玩家角色的移动数据问题,本游戏所采取的方式就是使游戏画面的刷新频率较低,处于35-40次左右,然后将