基于Android的飞行射击游戏设计与实现
赖建评
摘要:基于Android的游戏应用,是Android市场中最重要的组成部分,而飞行射击类游戏是经典的游戏类型之一。该文采用Android平台,分析设计了Android飞行射击游戏开发的总体框架,研究Android飞行射击游戏开发相关的技术,包括SurfaceView视图、背景滚动、碰撞检测等、爆炸动画等,设计实现飞行射击游戏开发。
关键词:Android;飞行射击;游戏
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)12-0073-02
游戏发展至今,划分出了休闲益智、体育竞速、动作冒险、飞行射击、经营策略、角色扮演等游戏类型。在众多的游戏分类中,飞行射击游戏是发展较早的游戏类型之一,在电子游戏的历史演变过程中扮演了重要的角色,留下很多经典的代表作,如“斑鸠”、“1945”、“雷电”等。随着Android智能终端的普及,飞行射击游戏在Android平台,通过用户触屏直接控制飞机,能给用户带来更刺激、更畅快的体验。本文基于Android平台,分析相关开发技术,设计实现一款飞行射击游戏。
1 飞行射击游戏框架
1.1游戏视图
在Android游戏开发中,游戏界面需要用到大量的图片资源和处理图像特效,如果采用Android应用开发中单纯的XML布局界面,会造成界面刷新时间过长、事件处理等待太久等问题。为解决以上问题,在Android游戏中采用自定义视图继承View或SurfaceView实现游戏界面绘制。
View对画布的重新绘制,通过该类的invalidate()或postInvalidate()完成,画布由系统的UI主线程进行更新。而SurfaceView中内嵌有Surface对象,Surface是在后台线程中绘制,画布的重绘由新线程完成。在飞行射击游戏中,游戏界面的物体是动态变化的,需要在游戏过程中不断重新绘制,因此选择SurfaceView视图,能够避免主线程阻塞,提高程序反应速度,SurfaceView更适合用于飞行射击游戏开发。
1.2 SurfaceView框架
SurfaceView继承View,包含SurfaceHolder接口的实现实例,对外提供该实例的访问接口。SurfaceHolder里包含对SurfaceView内嵌的 Surface进行控制的接口,能够获取Surface、更改Surface显示内容及监听Surface状态事件。
Surface状态事件的监听通过重写以下三个函数实现:surfaceCreated(),当SurfaceView首次创建后调用,在该函数中完成绘制界面相关信息的初始化工作;surfaceChanged(),当SurfaceView的尺寸发生改变的时候调用,在surfaceCreated运行后会首次被调用;surfaceDestroyed(),当SurfaceView被销毁前调用,如退出游戏画面,在该函数中停止绘图线程和清理使用的资源。
SurfaceView采用了双缓冲技术,在绘图前通过SurfaceHolder的lockCanvas()获取Canvas,在 Canvas上绘制内容,绘制完成后调用SurfaceHolder的unlockCanvasAndPost(),把画布中的内容提交到Surface渲染显示,这种双缓冲技术能够避免更新视图时画面闪烁。在线程的run方法中循环调用绘图函数,实现动态刷新屏幕。
2 飞行射击游戏关键技术
2.1背景滚动
在飞行射击游戏运行后,通过用户点击“开始”按键,启动游戏进入主界面,此时游戏的背景一般是用同一张图片,在游戏过程中不断从上到下滚动,使得飞机在游戏界面中给玩家留下不断飞行的错觉。为实现这一效果,设计一张上、下两边沿能够衔接过渡的背景图片,设置两个位图A、B初始化为同一背景图,通过绘图控制两个位图A、B前后连接一起向下移动,当A的上边到达屏幕底部后,把A设置到B的上方,当B到达屏幕的底部后,把B设置到A 的上方,不断循环以上过程,实现背景不断向下滚动的效果,该过程如图1所示。
2.2 碰撞检测
游戏开发经常需要进行碰撞检测处理,飞行射击游戏中要判断子弹是否击中飞机,然后根据检测的结果做出不同的处理。在手机游戏开发中最常用到三种检测碰撞的方式,包括矩形碰撞、圆形碰撞和像素碰撞检测。当碰撞检测的物体形状比较复杂时,需要进行组合碰撞检测,将复杂物体分解成多个基本形状的组合,然后分别进行碰撞检测。本程序中用到的角色形状近似矩形,下面只讨论矩形碰撞检测的其中一种实现方式。
矩形碰撞检测是通过两个矩形之间的位置关系,判断它们是否发生碰撞。两个矩形之间不碰撞时的位置关系有图2所示的四种情况:当矩形A的右端比矩形B的左端靠左,或矩形A的左端比矩形B的右端靠右,或矩形A的下端比矩形B的上端靠上,或矩形A的上端比矩形B的下端靠下时,两个矩形不可能发生碰撞。根据德摩根定律,求不碰撞情况下的否定,既为碰撞情况:在水平方向上,矩形A的右端比矩形B的左端靠右,并且矩形A的左端比矩形B的右端靠左,同时在垂直方向上矩形A的下端比矩形B的上端靠下,并且矩形A的上端比矩形B的下端靠上时,两个矩形发生碰撞。
2.3爆炸动画
Android游戏开发中,爆炸效果可以用逐帧动画实现。逐帧动画实现有两种方式:当每一帧是单独一张图片时,可以通过XML资源设置animation-list定义每一帧图片和播放时间,在碰撞点播放该逐帧动画;当多个帧的图片合并在一张图片里面的时候,需要通过画布的剪切区域,更改剪切区域位置,依次在碰撞点绘制显示每一帧。在本文中,采用第二种方式实现爆炸动画效果。
3 飞行射击游戏设计与实现
3.1 程序流程设计
游戏中设计了玩家飞机、敌机和Boss角色。程序运行后,进入菜单界面,点击开始进入游戏界面。进入游戏界面后,背景和敌机不断从上到下移动,同时敌机发射子弹,当敌机移动到屏幕底部或者被玩家击中后,敌机爆炸,随后敌机在屏幕上方重新出现;在游戏状态下,玩家通过触屏控制飞机上、下、左、右飞行,并不断向上发射子弹,玩家飞机被击中后减少血量,当玩家能够击中足够多的敌机时,通关成功,否则游戏失败。
3.2程序实现
程序主体框架使用自定义视图类继承SurfaceView并实现SurfaceHolder.Callback和Runnable接口。线程的run()方法不断循环调用逻辑处理模块和绘图方法,根据玩家操作所处的阶段,完成游戏初始状态、游戏进行状态、游戏结束状态界面更新绘制。初始状态菜单绘制使用GameMenu类完成,实现初始欢迎界面;游戏过程中通过GameBg类设置背景循环滚动,Player类完成玩家飞机飞行绘制、玩家飞机与敌机碰撞检测、玩家飞机与敌机子弹碰撞检测,Enemy类完成敌机飞行绘制、敌机与玩家飞机子弹碰撞检测,Boss类完成Boss飞行绘制、Boss与玩家飞机碰撞检测,Bullet完成子弹飞行绘制,Boom类完成爆炸效果动画显示。
3.3 游戏运行效果
通过使用SurfaceView视图,应用背景滚动和矩形碰撞检测技术,实现完成的飞行射击游戏运行效果如图3所示。
4 结束语
本文介绍了Android游戏开发中的SurfaceView视图,研究了飞行射击游戏开发过程中背景滚动、碰撞检测、爆炸动画等关键技术,设计实现了Android飞行射击游戏的框架开发,经过运行测试,该游戏运行流畅、稳定,后期为了增强趣味性,可以在游戏中增加武器选择、音效等开发。
参考文献:
[1] 吴新华,万强.基于Android平台的手机游戏开发[J].萍乡学院学报,2015,12(32).
[2] 李华明.Android游戏编程之从零开始[M].北京:清华大学出版社,2011.
[3] 吴亚峰,于复兴,杜化美.Android游戏开发大全[M].北京:人民邮电出版社,2013.