臧利萍 刘燕美 高振
【摘要】针对Android平台下游戏实时交互的特点,本文使用SurfaceView进行界面布局的构建,采用矩形碰撞检测进行算法分析,以数组、list、HashMap等进行数据的存储和更新。本文以Java多线程技术为开发的关键技术。本文使用触屏、键盘和重力传感器三种控制方式,实现了游戏场景、游戏难度的选择,游戏背景音乐、音效和震动效果的设置以及白天模式和夜间模式两种适合不同光照条件的游戏模式。
【关键词】Android;飞行射击游戏;多线程;传感器
一、绪论
Android是Google公司针对手机等移动终端设备设计的开源平台,该平台基于Linux内核,有操作系统、中间层、用户界面层和应用程序组成,是首个为移动终端打造的真正开放和完整的操作系統。该平台以其开放性、平等性、无界性、方便性和硬件丰富性受到用户和开发者的青睐,并迅速占领移动终端市场[1]。该平台呈现众多应用程序。射击类游戏是一种较成熟的游戏类型,在移动手机中飞行射击类游戏更是受到用户的特别青睐。随着Android平台的发展和移动设备硬件水平的不断提高,无论是在数量上还是质量上,Android游戏手机游戏都得到很大的发展,优秀的2D、3D游戏层出不穷[2]。本文是基于Android平台设计一款飞行射击类游戏。
本游戏使用Android中的SurfaceView作为主要视图,采用矩形碰撞检测作为游戏的主要碰撞检测算法。游戏涉及Android图形处理、数据存储、多媒体开发、传感器开发、Android进程内部通信和Java集合框架的应用。
游戏提供了触屏、键盘和重力传感器三种控制方式,实现了游戏场景、游戏难度的选择,游戏背景音乐、音效和震动效果的设置以及白天模式和夜间模式两种适合不同光照条件的游戏模式。
二、游戏设计
1.界面设计
本游戏的主要包括欢迎界面、菜单界面、帮助界面、游戏界面、设置界面、游戏胜利界面、游戏失败界面等。其中游戏界面采用SurfaceView视图,该视图下采用onTouchEvent、onKeyUp、onKeyDown回调方法捕获用户输入,实现人机交互。SurfaceView在使用时通过SurfaceHolder管理,SurfaceHolder通过其内部接口CallBack实现对SurfaceView状态变化的监听,从而实现对Surfaceview的管理[4]。SurfaceView用来保存界面像素信息,游戏界面的构建、敌机、我机、子弹等绘制工作由SurfaceHolder完成。SurfaceView运用双缓冲技术实现界面绘制,提高界面绘制的实时性和交互性。
2.界面功能
游戏控制方式:游戏提供触屏控制、传感器控制、键盘控制三种控制方式。本文重点描述传感器控制的过程。游戏通过调用相关的方法获得传感器服务,该方法返回一个负责管理移动终端设备的传感器对象,并且提供了访问设备支持的传感器的方法。Android系统提供了一个对传感器数据进行实时监控的类[5]。在传感器对象中利用该对象的方法以特定的频率监听传感器数据的更新。
游戏设置:主要实现游戏背景音乐、音效、震动效果等设置,游戏控制方式设置,游戏模式(白天模式和夜间模式)设置。Andriod对音频文件的处理主要通过MediaPlayer和soundpool实现。MediaPlayer具有资源占用率高、延迟时间较长,不支持同时播放多个音频文件的特点[6]。考虑到游戏音乐实时性、多变性等特点Soundpool成为播放音效文件的最佳选择,它支持多个音乐文件的同时播放。
游戏场景与难度选择:实现不同游戏场景的选择,实现游戏难度(容易、中等、困难)的选择,保存游戏进行到一半的信息。本文采用SQLite存储游戏相关的数据。SQLite是Android系统内嵌的一个非常优秀轻型的数据库,它占用资源非常的低[7],支持目前市面上主流的操作系统,同时又能够跟很多程序语言相结合,与其他开源数据库管理系统如MySql相比,SQLite具有更快的处理速度。
三、游戏碰撞检测
碰撞检测是游戏开发中的重要组成部分,游戏开发中常用的碰撞检测技术有矩形碰撞、圆形碰撞、像素碰撞等[8]。
矩形碰撞就是利用两个矩形之间的位置关系来进行判断,如果一个矩形的像素和另外一个矩形有公共部分,就可以认为这两个矩形发生了碰撞[9]。
圆形碰撞是利用两个圆形的圆心距与这两个圆的半径之和的大小关系进行判定的;当两圆的圆心距小于两圆半径之和,则判定发生了碰撞,否则,没有发生碰撞。
像素碰撞是通过检测两个对象的像素是否有重复判断碰撞的一种碰撞检测技术,由于这种方法造成代码效率低下,在游戏开发中是不推荐使用的。实际的应用中常用多矩形或多圆形的检测方式来代替。分析飞机射击游戏交互性和实时性的特点,本文采用矩形碰撞技术实现碰撞检测,其实,两个矩形不发生碰撞的情况就只有以下四种,处理这四种情况外,其他的位置关系都应判定为发生了碰撞。
四、多线程技术
1.进程与线程
进程就是一个有自己独立的内存空间和系统资源的执行中的程序。线程是一段完成某个特定功能的代码[10]。同类的多个线程共享内存空间和系统资源,所以系统在线程之间切换时,系统开销占用要比进程小得多,正因如此,线程也被称为轻量级进程。进程和线程之间是一对多的关系[11]。
基于Android操作系统而言,每个组件都是一个进程,进程之间通过IBinder对象进行通信,进程内部通过Handler实现线程间的通信[12]。主线程主要工作是负责维护组件对象和应用程序创建的窗口,以及更新主界面,如果组件在应用程序中创建了自己的线程,子线程无法对用户界面进行更改,只能通过handler与主线程进行交互,实现用户界面的更新。
2.游戏中多线程实现
多线程技术是本游戏设计的关键技术,多线程的思想在游戏的各个界面都有体现,其中以游戏界面体现最为显著。游戏界面中除了主线程之外还存在计数器线程、传感器事件处理线程、键盘事件处理线程、游戏逻辑处理线程和界面绘制线程,这些线程都是以内部类的形式创建的,方便实现线程同步。其中计数器线程负责对游戏时间轴计数器的维护,传感器数据处理线程只有在启用传感器时才存在并运行在系统中,传感器事件处理线程通过以一定的时间间隔获取并处理传感器事件数据控制我机的移动,键盘事件处理线程负责处理用户键盘事件,游戏逻辑处理线程负责游戏中所有元素(敌机的移动、碰撞检测、敌机计数器的检测,武器的移动逻辑和碰撞检测等等)的逻辑处理。界面绘制线程负责游戏界面中所有游戏元素的绘制工作。
同时,设计线程对象的初始化和启动工作在onCreate方法中处理,线程的销毁工作在onDestroyed方法中,保证线程只在游戏界面可见的时候才存在和运行,防止用户不当操作造成线程意外死亡或重建。
五、游戏测试
图1 欢迎界面测试效果图
图2为游戏菜单界面,共有六个选项供玩家选择。
图2 菜单界面测试效果图
图3为游戏场景选择界面,选择玩家喜欢或者想挑战的场景。
图3 场景选择界面测试效果图
图4为游戏设置界面,玩家可以选择自己喜欢的模式以及操作方式。
图4 设置界面测试效果图
图5 游戏界面测试效果图
图5为游戏界面的测试效果图,该界面有敌方和我方的装备、武器、爆炸以及一些魔法。
参考文献
[1]李华明.Android游戏开发之从零开始[M].清华大学出版社,2011.
[2]李刚.疯狂Android讲义精粹[M].电子工业出版社,2012.
[3]何晨光, 李洪刚.Android编程入门经典[M].清华大学出版社,2012.
[4]熊斌编.Android多媒体开发技术实战详解[M].电子工业出版社,2012.
[5]范怀宇.Android开发精要[M].机械工业出版社,2012.
[6]杨明羽.Android语法范例参考大全[M].电子工业出版社,2012.
[7]吴亚峰,苏亚光.Android游戏开发大全[M].人民邮电出版社,2012.
[8]李刚.疯狂Java讲义精粹[M].电子工业出版社,2012.
[9]杨丰盛.Android應用开发揭秘[M].机械工业出版社,2010.
[10]埃克尔,陈昊鹏.Thinking in java[M].机械工业出版社,2007.
[11]叶乃文,邝劲筠,杜永萍.Java核心技术[M].电子工业出版社,2011.
[12]http://developer.android.com/develop/index.html.
项目来源:河南省重点科技攻关计划项目(编号:132102210054)。
作者简介:臧利萍(1984—),女,河南焦作人,硕士,助教,现供职于郑州航空工业管理学院,主要从事计算机图形、虚拟现实等计算机应用教学研究。