基于安卓平台上的猴王争霸游戏设计与开发(编辑修改稿)内容摘要:

的 SurfaceView 的刷新线程、碰撞检测和物理效果线程、计时器线程、 AI 线程需要自己编写。 这些线程都是要经历线程的创建、运行、结束三个阶段。 当游戏主界面开始时,线程开始创建并运行,游戏结束并跳转到游戏结果页面时,线程应当被关闭。 但是,在通常的情况下,如果采用 stop()或者 destroy()方法来完成线程的停止可能会引发异常或者错误,同时也不利于实现游 戏的暂停功能。 那么,既然不能用强制关闭线程的方式来结束线程,不妨设置标志位来控制线程的运行。 如采用 while( live) {/*线程内容 */; sleep( time) }的方式,当游戏主界面开始时,将线程启动,设置 live 变量为 true,然后重载游戏主界面的 destroy()方法;当游戏主界面销毁时,设置 live 变量为 false,这样线程就可以正常结束运行而不会发生任何异常和错误。 当进程中存在线程并发执行时,手机的硬件性能会得到很大的利用,但是线程之间的同步互斥则是程序面临的另一个问题。 在 java 中对于对象之间 加锁可以采用 synchronized实现。 对于一些变量的互斥访问,可以采用 lock()来进行加锁实现。 本游戏中也有需要互斥访问的变量,比如 SurfaceView 的刷新线程正在对游戏画面进行重新绘制时,如果此时游戏的碰撞检测和物理效果线程对玩家人物进行了位置上的移动,那么势必会造成游戏中玩家角色前后绘制的数据不一致造成位置上的差别。 诸如此类需要同步的地方还有很多,但是纵观这些需要并发的地方,假如没有采用 lock()锁来保持同步,所造成的影响并不是十分恶劣。 但是如果采用了 lock()锁,那么会导致游戏线程之间的 并发量大大下降,从而使游戏画面异常卡顿,用户体验极其糟糕。 因此,对于游戏中需要并发处理的地方,大多采取鸵鸟算法,也就是视而不见或者尽可能采用别的方式让用户无法觉察。 比如玩家角色的移动数据问题,本游戏所采取的方式就是使游戏画面的刷新频率较低,处于 3540 次左右,然后将游戏中碰撞检测和物理效果线程的运行周期缩短,这样每次刷新屏幕的移动距离就不会十分明显。 虽然没有解决同步问题,但是用户在视觉上已无法觉察。 碰撞检测和物理效果线程和 AI 线程在后续的两节介绍,这里先说 SurfaceView 刷新线程。 这个线程的主要功 能在上一节游戏绘图技术里面已经讲了,其主要作用就是对游戏主界面进行绘制且绘制的频率要适当。 线程依然是采用判断 live 标志位来决定是否结束,当游戏主界面退出时, live 被置为 false,此时 SurfaceView 线程将在运行完最后一遍时退出,如图 所示。 河北工业大学 20xx 届本科优秀毕业设计论文 7 游戏中的计时器计时线程的主要作用是对游戏中蓄力条的计时,包括玩家或者 AI 的跳跃蓄力和开火蓄力。 一般来说,玩家或者 AI 并不是每时每刻都在进行跳跃或者开火的蓄力,也就意味着计时器计时线程可能会在一段时间里空转。 另外,启动一个线程和一个销毁线程都需要不小的开销,并且计时线程在时间上需要一致,所以采取仅用一个计时线程的方式更有利于提高游戏的效率。 计时线程中利用 LinkedListFJTimeThread申明一个链表,这个链表的节点是FJTimeThread 类对象。 当玩家或者 AI 需要蓄力计时,就创建一个计时 FJTimeThread 类的对象作为计时链表节点加入到计时链表中。 只要 live 变量是 true,计时线程就会对每一个计时节点进行一次计时操作,这样就完成了玩家和 AI 共用一个计时线程完成所有的计时的 SurfaceView 刷新线程 河北工业大学 20xx 届本科优秀毕业设计论文 8 效果,如图 所示。 游戏中的碰撞技术与其他物理效果 游戏中玩家角色能够停留在地图中的树枝上,需要用到碰撞检测技术;玩家角色之间的不可重叠也用到了碰撞检测技术;子弹击中人物的效果也应用到碰撞检测技术。 故本游戏中一共有三种碰撞方式,人物角色与可停留物之间的碰 撞、子弹与人物角色之间的碰撞和人物角色之间的碰撞。 由于在安卓游戏中,大部分机器的内存运行速度都十分有限,游戏的碰撞检测往往偏重于效率所以往往采取比较简单的碰撞检测方式。 在游戏中人物角色与可停留物之间的碰撞检测采取矩形。 也就是用一个个矩形框来标志地图中的碰撞域。 这样,当玩家角色的坐标与这个矩形的范围发生重合时,则发生碰撞,从而进行相应的碰撞处理。 假如玩家角色与矩形碰撞域碰撞,玩家角色在矩形上方且玩家的Y 轴速度为正,那么玩家角色应该停在矩形碰撞域的上方;假如玩家角色从下方与矩形碰撞图 计时线程 河北工业大学 20xx 届本科优秀毕业设计论文 9 域发生碰撞,且玩家 Y 轴方向速 度为负,那么玩家的速度应该立刻取其绝对值并改 Y 轴的方向为正,这样就实现了角色从下方撞到碰撞域上并被反弹下去的效果;如果玩家角色从左边或者右边与碰撞域发生碰撞,那么不管其速度为多少,将其速度置为零,这样就可实现了角色在空中左右晃动时撞上碰撞域而不会陷入的效果。 对于碰撞域的获取,采用将碰撞域用文件的形式记录下来的方式,放在用户手机的 sd卡中,这样当用户进入游戏时就开始加载游戏地图和地图碰撞域。 由于矩形的碰撞域只需要确定其左上角。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。