基于android平台的手机游戏的设计与实现new

基于android平台的手机游戏的设计与实现new

ID:33922399

大小:3.48 MB

页数:65页

时间:2019-02-28

上传者:jjuclb
基于android平台的手机游戏的设计与实现new_第1页
基于android平台的手机游戏的设计与实现new_第2页
基于android平台的手机游戏的设计与实现new_第3页
基于android平台的手机游戏的设计与实现new_第4页
基于android平台的手机游戏的设计与实现new_第5页
资源描述:

《基于android平台的手机游戏的设计与实现new》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

西安科技大学硕士学位论文基于Android平台的手机游戏的设计与实现姓名:崔浩然申请学位级别:硕士专业:信号与信息处理指导教师:孙弋2011 论文题目:基于Android平台的手机游戏的设计与实现专业:信号与信息处理研究生:崔浩然(签名)指导老师:孙弋(签名)摘要近年来,随着3G移动互联网络的发展,智能手机的普及率越来越高,各种智能手机操作系统相继出现。Android操作系统作为谷歌公司为移动平台打造的开源操作系统,是真正开放和完整的移动软件,也是最有发展潜力的智能手机操作系统。基于Android系统的手机游戏,是Android应用软件中的最重要的组成部分,有着庞大的用户人群,也必将有巨大的发展潜力。有人已这样预言,Android手机游戏将是游戏产业的下一个阶段,是手机游戏的未来。本文首先提出了Android游戏开发的总体框架,研究并总结了Android游戏开发涉及的一些关键技术,包括Android游戏开发多线程技术、Android游戏开发的图形处理技术以及Android游戏开发中的碰撞检测技术。在此基础上,本文设计实现了基于Android平台的手机游戏“飞行战”。该游戏的总体功能架构由控制调度模块、逻辑计算模块、数据存储模块、图形界面模块、声音播放模块以及短信付费模块组成。控制调度模块主要通过Activity来实现,在其中通过Handler机制实现了控制各个界面的切换;逻辑计算模块主要处理内部和外部事件,在其中重点实现了碰撞检测和游戏人工智能的跟踪算法;数据存储模块重点实现了游戏的地图类;图形界面模块重点实现各个界面的绘制,其中涉及双缓冲绘图技术、游戏界面横屏滚动技术、加载界面进度条技术等关键技术的实现。除此之外还设计实现了游戏的声音播放模块和短信付费模块,用来为游戏加入音效和模拟实现发送短信的游戏付费方式。本游戏最终向Android手机进行了移植,经测试,游戏的基本功能均实现,并且运行流畅,画面效果较好,具备一定的可玩性。本文所展示的Android游戏开发的整个过程和提出的开发框架对Android游戏开发具有一定的参考意义。关键词:Android,手机游戏,Activity,碰撞检测,游戏AI,XML研究类型:应用研究 Subject:TheDesignandRealizationofMobileGameBasedonAndroidPlatformSpecialty:SignalandInformationProcessingName:CuiHaoran(Signature)Instructor:SunYi(Signature)ABSTRACTInrecentyears,asdevelopmentofthe3GMobileInternet,thepenetrationrateofsmartphonegetshigher,varioussmartphoneoperatingsystemshavecomeout.AndroidoperatingsystemformobileplatformmadebyGooglecompanyisopensourceoperatingsystemandtrulyopenandintegritymobilesoftware,whichisalsoknownasthemostpotentialsmartphoneoperatingsystem.ThemobilegamesbasedontheAndroidoperatingsystemarethemainpartofAndroidapplicationsoftware,withahugenumberoftheusercrowd.Itistohavegreatdevelopmentpotential.Someonehassuchpredictions,Androidmobilegameswilldominatethenextstageofthegameindustryandbethefutureofmobilegame.FirstlyinthispapertheAndroidgamedevelopmentframeworkisputforward.SomekeytechnologieswhichtheAndroidgamedevelopmentinvolvesaresummarized,includingthemultithreadingtechnologyappliedintheAndroidgamedevelopment,thegraphicsprocessingtechnologyinAndroidgamedevelopmentandthecollisiondetectiontechnologyappliedinAndroidgamedevelopment.Onthisbasis,themobilegamenamed"flightwar"basedontheAndroidplatformisdesignedandrealized.Overallfunctionstructureofthisgameisconstructedbyacontrolschedulingmodule,logiccomputationmodule,datastoragemodule,graphicalinterfacemodule,soundbroadcastmoduleandSMSpaymodule.ControlschedulingmoduleismainlyrealizedthroughActivityclassinwhicheveryinterfaceisswitchedbyHandlermechanism.Logiccalculationmodulemainlydealswithinternalandexternalevents,inwhichthecollisiondetectionandgameartificialintelligencetrackingalgorithmismainlyrealized.DatastoragemodulemainlyrealizestheMapclassofthegame.Graphicalinterfacemodulemainlyrealizedrawingeachinterface’whichinvolvesdoublebufferingdrawingtechnology,horizontalscreen rollingtechnologyinthegameinterface,progressbartechnologyintheloadinginterfaceandsuchaskeyrealizationtechniques.InadditionsoundbroadcastmoduleandSMSpaymoduleisdesignedandrealizedwhichputsoundeffectsandsimulaterealizinggamepaymentbysendingSMS.ThegamerealizesthetransplantationintoAndroidphonefinally,accordingtothetest,thegamerealizesitsbasicfunctions,andrunsfluently,whosepictureeffectisprettygoodandhaveapartofgameplay.InthispaperentiredesignprocessforAndroidgamesandthedevelopmentframeworkforAndroidgamesareusefultothedevelopmentofAndroidgames.Keywords:AndroidMobileGameActivityCollisiondetectionGameAIXMLThesis:ApplicationResearch 学位论文独创性说明本人郑重声明:所呈交的学位论文是我个人在导师指导下进行的研究工作及其取得研究成果。尽我所知,除了文中加以标注和致谢的地方外,论文中不包含其他人或集团已经公开发表或撰写过的研究成果,也不包含为获得西安科技大学或其他教育机构的学位或证书所使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中做了明确说明并表示了谢意。学位论文作者签名:日期:学位论文知识产权声明书本人完全了解学校有关保护知识产权的规定,即:研究生在校攻读学位期间论文工作的知识产权单位属于西安科技大学。学校有权保留并向国家有关部门或机构送交论文的复印件和电子版。本人允许论文被查阅和借阅。学校可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。同时本人保证,毕业后结合学位论文研究课题在撰写的文章一律注明作者单位为西安科技大学。保密论文待解密后适用本声明。学位论文作者签名:指导教师签名:年月日 1绪论1绪论1.1课题研究背景1.1.1手机游戏的发展手机游戏(MobileGame或WirelessGame),是指消费者利用随身携带并具有无线网络联机功能的智能移动终端设备,能随时随地来进行的游戏。手机游戏最大的特点是其随时随地进行游戏的便利性。这些年来,手机游戏市场有了很大的发展,手机游戏已成为使用率最高的手机娱乐应用,占到各种手机娱乐应用比例的78.4%。在日本,手机游[1]戏市场经历多年的稳定增长,市场规模已经超过了850亿日元。在美国,手机游戏作为美国手机用户最喜欢的移动应用之一,在iPhone和Android等智能终端推出后发展迅速。而在中国,根据易观智库产业数据库最新发布的《2010年第4季度中国手机游戏市场季度监测》数据显示,我国2010年手机游戏市场规模已达到32.9亿元,继续保持了较快的发展。通过图1.1,我们能看出近些年来我国手机游戏市场的发展。图1.1近几年中国手机游戏市场规模的发展从上面的图可以看出,中国手机游戏的市场规模在近几年内一直保持了较快的发展,而且这几年的发展速度越来越快。预计到2012年,市场规模将达到65亿元,同比将增长66.7%。1 西安科技大学硕士学位论文1.1.2Android手机游戏平台Android是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统,[2]号称是首个为移动终端打造的真正开放和完整的移动软件。自从Google发布智能手机Android操作系统平台(2008年9月首款Android智能手机G1上市)以来,Android平台一直以惊人速度挺进,并支持Android智能手机迅速进入领先行列。Android在全球智能手机市场上的份额已从去年第五位(3.9%)跃进到现在的第二位(25.5%),今年3季Android手机销量比去年同期增长1309%。国内外很多市场分析员一致认为,Android到明年有望争得第一的位置(迄今Android在北美、亚洲智能手机市场均已位居第一)。迄今Android是智能手机市场上最大的赢家,是销售增长最快、最成功的竞争者。游戏作为Android平台最主要的应用,预示着随着Android手机用户数量的增多,基于Android平台的手机游戏在未来将有巨大的市场潜力,虽然现阶段在国内研究开发Android手机游戏的人数并不多,但移动互联网业界的许多人士都对Android手机游戏未来的发展表示乐观态度,更有业界精英表示,Android手机游戏是游戏产业的下一个阶段,也是手机游戏的未来。1.2课题研究意义1.2.1Android手机平台的优势现在常见的智能手机平台有:Symbian、WindowsMobile、PALM、Blackberry、iPhoneOS等。Android平台的优势主要体现在以下方面。(1)开放性Android平台是开放性的平台,允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,最大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。(2)挣脱运营商的束缚在过去很长的一段时间,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都要受到运营商的控制。自从Android上市,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不再是运营商口中的笑谈。(3)丰富的硬件选择2 1绪论这一点还是与Android平台的开放性相关。由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各异的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容。例如你从诺基亚Symbian风格手机一下改用苹果iPhone,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等个人资料更是可以方便地转移。(4)开发手机软件不受任何限制Android平台提供给第三方开发商一个十分宽泛、自由的环境。因此不会受到各种条条框框的阻扰,可想而知,如此一来会有多少新颖别致的软件诞生。(5)无缝结合的Google应用如今叱咤互联网的Google已经走过了10年度的历史。从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而[3]Android平台手机将无缝结合这些优秀的Google服务。正因为Android具有以上的优越性,所以2010年末数据显示,仅正式推出两年的Android操作系统就将要超越称霸十年的诺基亚SymbianOS系统,使之跃居全球最受欢迎的智能手机平台。1.2.2Android手机游戏的市场价值随着计算机技术和移动通信技术的快速发展,手机用户的数量越来越多,用户在挑选手机设备的时候己经不再拘泥于基本的通话功能。而新的技术从某种程度上提高了手机设备处理数据的能力,因而可以在手机上添加许多新的功能,以满足用户多样性需求。为此已经有越来越多的研发机构或部门着手研究开发手机应用软件。手机游戏作为手机上的应用软件类型之一,更是深受广大用户的喜爱。由于手机硬件资源有限、屏幕小、游戏时间短等特点,使得手机很适合运行那些剧情简单、操作方便、有益于提高敏捷性和智力开发的游戏。Android平台上的游戏相比应用软件,不需要进行严格的市场细分,不需要针对目标用户量身定制。这是因为游戏玩家的核心需求是统一的,那就是:娱乐与打发时间(乃至更高层面的竞技需求和群体认同需求),这种需求附着于特定的社会发展阶段,不受地域的限制,甚至于能够穿透文化壁垒。因此,绝大多数种类的游戏都具备传染性与普适性,每一个售出的游戏都将会点燃周围潜在玩家的激情,最终吞噬整个需求市场。由此可知,几乎每一个Android手机用户都是游戏的需求者,都是潜在的顾客,现今的1000多万Android用户不过是冰山一角,随着Android手机市场进一步壮大,游戏的市场容量将具备更大的增长空间。综上所述,Android平台相比其他智能手机平台有许多优势,这些优势使Android发展迅速,而Android游戏作为Android手机最主要的应用,其市场价值有目共睹。鉴于现3 西安科技大学硕士学位论文阶段Android游戏研究开发的人数较少,游戏产品数量也较小的现状,对Android游戏的研究具有很大的意义,不仅仅需要研究Android游戏开发中的图形图像、人工智能等关键技术,更重要的是研究Android游戏的开发框架,以及Android游戏开发不同于别的平台游戏开发的相关技术实现等内容。1.3本文主要工作及章节结构本文首先阐述了Android操作系统的框架结构和其应用程序的构成,并描述了Android应用程序的生命周期,然后重点分析了Android游戏开发中涉及的几个关键技术,包括游戏开发的多线程技术、Android图形处理技术和游戏中的碰撞检测技术,并且提出了Android游戏开发的基本框架。文章的最后设计开发了“飞行战”游戏,首先设计出了游戏的总体功能架构和游戏的主要流程,接着分别实现了游戏的控制调度模块、逻辑计算模块、数据存储模块、图形界面模块、声音播放模块和短信付费模块。控制调度模块主要通过Activity来实现,在其中通过Handler机制实现了控制各个界面的切换;逻辑计算模块主要处理内部和外部事件,在其中重点实现了碰撞检测和游戏人工智能的跟踪算法;数据存储模块重点实现了游戏存档技术;图形界面模块重点实现各个界面的绘制,其中涉及双缓冲绘图技术、游戏界面横屏滚动技术、加载界面进度条技术等关键技术的实现。除此对声音播放模块和短信付费模块的实现也做了介绍。上述整个过程展示了Android游戏开发的全过程,并对游戏设计中关键技术的实现做了详细的阐述。本文的组织结构如下:第一章绪论论述了本课题的研究背景和意义,介绍了本文的主要工作和组织结构。第二章Android平台概述重点介绍了Android操作系统的框架结构和其应用程序的主要构成,并分析了Android应用程序的生命周期。第三章Android手机游戏开发关键技术的研究首先介绍了手机游戏的开发流程,重点研究了Android手机游戏的开发框架以及开发涉及的几个关键技术。第四章Android手机游戏“飞行战”的设计首先描述了游戏需要实现的功能,然后叙述了本游戏的主要流程,最后设计出了游戏的总体功能架构,按功能把游戏分为几个模块,并设计了各个模块主要负责实现的具体功能。第五章Android手机游戏“飞行战”的实现本章主要讲述了游戏各个功能模块的实现过程,重点论述了最主要的三个模块(控制调度模块、逻辑计算模块和图形界面模块)的实现过程,并在其中对关键技术的运用作了阐述。第六章结论对本文做了总结,对自己今后需进一步研究的内容做了展望。4 2Android平台概述2Android平台概述本章对Android开发平台做介绍,在简单介绍Android操作系统的基础上,将讲述其特性和系统框架,并将在最后重点对其应用程序的主要构成和生命周期做介绍。2.1Android操作系统简介Android是谷歌公司于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,号称是首个为移动终端打造的真正开放和完整的移动软件,该平台包括移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。谷歌公司与开放手机联盟合作开发了Android,该联盟由包括中国移动、摩托罗拉、高通和T-Mobile等30多家技术和无线应用的领军企业组成。谷歌公司通过与运营商、设备制造商和开发商结成合作伙伴关系,借助其优势建立标准化、开放式的移动电话软件平台,从而在移动产业领域内形成一个真正开放的生态系统。Android作为谷歌公司企业战略的重要组成部分,将进一步推进“随时随地为每个人提供信息”这一目标的实[4]现,并最终能让移动设备不依赖于设备甚至平台。2.2Android操作系统特性Android操作系统主要包括如下特性:应用框架:用于开发可重用可替代的组件。Dalvik虚拟机:Android采用的Java虚拟机是自主开发的代号为Dalvik的虚拟机,在保证API方面兼容的同时Dalvik针对移动手机进行了大幅优化,占用资源更小,运行效率更高。集成的浏览器:基于开源的引擎WebKit。优化的图形:强大的自定义二维图形库。基于OpenGLES1.0标准的3D图形功能,在移动3D开发中有着至关重要的地位。SQLite数据库:SQLite提供结构化的数据存储。它是一款轻型免费的且开源的数据库,设计目标是嵌入式的。它具备占用资源低、需要的内存空间少、处理速度较快,并且还支持事务处理功能等优点。多媒体支持:支持各种通用的音视频和静态图像格式(MPEG4、MP3、JPG、PNG、GIF、AAC、H.264、AMR)。GSM技术:(依赖硬件)GlobalSystemforMobileCommunications,全球移动通讯系统,俗称全球通,是第二代移动通信技术,其开发目的是让全球各地可以共同使用一个移动电话网络标准,让用户使用一部手机就能行遍全球。5 西安科技大学硕士学位论文蓝牙,EDGE,3G,andWi-Fi:(依赖硬件)蓝牙和Wi-Fi都是一种短距离的无线连接技术,在短距离内可以实现话音和数据的无线传输。EDGE(EnhancedDataRateforGSMEvolution),是增强型数据速率GSM演进技术。Camera,GPS,Compass,andAccelerometer:(依赖硬件)GPS(GlobalPositioningSystem),即全球定位系统。它是一个由覆盖全球的24颗卫星组成的卫星系统。Compass是一个开放源代码的Java搜索引擎框架。强大的开发环境:包括一个设备模拟器,调试工具,内存和性能检测,以及EclipseIDE的开发插件。Eclipse是个集成开发环境。2.3Android操作系统框架结构Android作为一个开源的移动设备的平台,其软件层次结构自上而下分为四个层次,分别是:应用程序(Application)、应用程序框架(ApplicationFramework)、各种库(Libraries)和Android运行环境(RunTime)、Linux内核(LinuxKernel)。图2.1Google手机操作系统平台-Android的架构模型2.3.1应用程序突破传统思维,提供更好的用户体验。Android将会移植一系列的核心应用,包括E-mail客户端,SMS程序,日历,GPS地图,浏览器,联系人等等。所有的应用程序都是由Java语言完成的。应用程序是无界限的,可以在平等条件下[5]创建,还可以轻松地嵌入Web,可以并行运行。6 2Android平台概述2.3.2应用程序框架Android应用程序由一个或多个组件组成,Android的应用程序框架为应用程序层的开发者提供APIs,它实际上是一个应用程序的框架。由于上层的应用程序是以Java构建的,因此本层次提供的首先包含了UI程序中所需要的各种控件:例如:Views(视图组件)包括lists(列表),grids(栅格),textboxes(文本框),buttons(按钮)等。甚至一个嵌入式的Web浏览器。一个Android的应用程序可以利用应用程序框架中的以下几个部分:Activity(活动)BroadcastReceiver(广播接收者)Service(服务)ContentProvider(内容提供者)2.3.3库与运行环境Android包含一套C/C++库,能被系统中不同的组件使用。这些功能通过Android应用框架展现给开发人员。下面列出一些核心库:(1)SystemClibrary:从BSD继承来的标准C系统函数库,也是系统中最为底层的库,是专门为基于嵌入式Linux的设备制定的。(2)MediaFramework:该库支持多种常用的音频、视频格式的回放和录制,同时支持静态图片文件,包括MPEG4、H.264、MP3、AAC、AMR、JPG和PNG等。(3)SurfaceManager:用于管理不同应用对图形显示子系统和2D和3D图形层的访问。(4)WebKit:一个时尚的web浏览器引擎,为Android浏览器和内嵌的webview提供实现。(5)SGL:隐藏的2D图形引擎。(6)3Dlibraries:基于OpenGLES1.0APIs实现的库,该库可以使用硬件3D加速,或者高度优化的3D软加速。(7)FreeType:位图和向量模式的字体绘制。(8)SQLite:一个强大的,轻量的关系型数据库引擎,用于所有的应用。Android运行时Android包含一组核心库,提供了Java语言核心库内的大部分功能。Android运行环境主要指的是虚拟机技术——Dalvik。Dalvik虚拟机依赖Linuxkernel来实现一些潜在功能,例如线程和底层内存管理。Dalvik虚拟机和一般Java虚拟机(JavaVM)不同,它执行的不是Java标准的字节码而是Dalvik可执行格式(.dex)中执行文件,该格式的文件经过优化占用很小的内存。在执行的过程中,每一个应用程序即一个进程7 西安科技大学硕士学位论文(Linux的一个Process)。二者最大的区别在于JavaVM是以基于栈的虚拟机[6](Stack-based),而Dalvik是基于寄存器的虚拟机(Register-based)。显然,后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。每个Android应用程序都在DalvikVM的一个实例中运行,这个实例驻留在一个由Linux内核管理的进程中。2.3.4内核Android使用Linux2.6内核来提供系统的核心服务,例如:安全机制,内存管理,进[7]程管理,网络堆栈。Android更多的是需要一些与移动设备相关的驱动程序。其主要的驱动有:显示驱动(DisplayDriver)、Flash内存驱动(FlashMemoryDriver)、照相机驱动(CameraDriver)、音频驱动(AudioDriver)、Wi-Fi驱动(CameraDriver)、键盘驱动(KeyBoardDriver)、蓝牙驱动(BluetoothDriver)、BinderIPC驱动(Android一个特殊的驱动程序,具有单独的设备节点,提供进程间通讯的功能)。2.4Android应用程序构成Android应用程序与其他很多计算机平台的应用程序不同,他们没有唯一的启动入口,一个Android应用程序是由多个不同组件组合而成,组件间通过Intent实现通信。Android系统的基本组件包括Activity、Service、BroadcastReceiver和ContentProvider等,要实现组件间通信,还需要Intent消息组件。并不是每个Android应用程序都必须具备这四个组件,很多时候只需要这四种中的某几种就可以了。除此之外,应用程序的所有组[8]件还都必须在AndroidManifest.xml中声明。这是一个XML配置文件,这个配置文件用于定义应用程序的组件、组件的功能及必要条件等。这个配置文件是任何一个Android应用程序所必需的。图2.2描述了Android应用程序的构成和工作流程。图2.2Android应用程序的构成和工作流程8 2Android平台概述2.4.1ActivityActivity可以说是开发人员最常用的组件,同时也属于Android最基本的组成部分之一。Android程序中,一般一个Activity代表手机屏幕上的一屏。举例来说,如果将手机比作一个浏览器,那么一个Activity就相当于一个网页。在Activity中,可以添加多个视图,然后为这些视图添加一些事件处理。这些视图可以是按钮、文本框、列表等。可以看到,Activity的概念和网页的概念相当类似。一般一个Android应用是由多个Activity组成,同时这些Activity相互之间可以进行跳转,例如,按下某个Activity中的Button按钮后,可能会跳转到一个其他的Activity。不过和网页跳转稍有不同,Activity之间的跳转可以有返回值,例如,在ActivityA跳转到ActivityB后,那么当ActivityB运行结束时,可能会返回给ActivityA一个值。在多个Activity交流的过程中,这种返回机制是相当实用的。当用户进入一个新的屏幕时,之前的屏幕会转入暂停状态,并且保存在历史堆栈中。正是由于历史堆栈的存在,用户可以通过返回操作,返回到之前打开过的所有屏幕。Android默认的是将应用程序从开始到当前的每一个屏幕都保存到堆栈中,不过与此同时,Android还提供了很方便的机制,让开发人员自定义某个屏幕是否需要保存到历史[9]堆栈。Activity的跳转实现,必须借助于Intent类。因此Intent在Android应用中占据的地位是极其重要的。简单来说,一个Intent就是对一个将要执行的操作请求的抽象描述。Intent的描述,主要包含有两个数据结构:动作(action)和动作对应的数据(data)。动作有很多种,系统中最常见的动作类型有:MAIN(表明该Activity是应用程序的入口)、VIEW、PICK、EDIT等等;而动作对应的数据一般以URI的形式表示,例如:要查看某一个网页,则需要创建Intent,它的动作类型为VIEW,对应的数据应该是该网页的网址。值得一提的是,有一个类叫IntentFilter,它是Intent的相关类。如果说Intent是一个有效的操作请求,那么一个IntentFiler则用于描述一个Activity(或者IntentReceiver等)能够接收哪些Intent的请求。比如系统浏览器的Activity用于查看某一个网页,那么它用于接收Intent的IntentFilter,要定义类型为VIEW的动作并且能够过滤表示一个网页网址的[10]URI。通常IntentFilter要被注册在AndroidManifest.xml文件中。Activity之间的跳转正是通过解析各种Intent来实现的。例如一个Activity调用startActivity(intent)方法,希望跳转到其他的Activity时,会触发系统的Intent解析过程,在所有安装的应用程序中已注册的IntentFilter中查找,并最终挑选出能够匹配Intent的Activity。然后这个新的Activity因为接收到Intent的请求而开始运行,完成Activity的跳转。这种跳转机制提供了两个关键好处:9 西安科技大学硕士学位论文(1)操作请求被Intent封装起来,方便Activity重复利用。(2)相互跳转的多个Activity之间实现了松耦合。只要IntentFilier保持不变,一个Activity可以随意修改,而不用担心其他Activity找不到它。2.4.2BroadcastReceiver应用程序可以通过BroadcastReceiver监听一个外部的事件,并做出响应。例如,当应用程序需要对电话呼入这个外部事件做出反应时,可以利用BroadcastReceiver进行处理。再如,当一个后台下载任务成功的事件发生时,需要提示用户下载完成,仍然可以利用BroadcastReceiver来进行处理。BroadcastReceiver不能生成UI,也就是说对于用户来说是透明的,用户是看不到的。BroadcastReceiver只能通过NotificationManager来通知用户这些事件发生了。BroadcastReceiver既可以在AndroidManifest.xml中注册,也可以在运行时的代码中使用Context.registerReceiver()进行注册。注册完成之后,当事件来临的时候,即使程序没有启动,系统依然可以根据定义,自动启动程序。各种应用也可以通过使用[11]Context.sendBroadcast()将它们自己的IntentBroadcast广播给其他应用程序。2.4.3ServiceService是一种程序,它可以运行很长时间,但是它却没有用户界面,不可交互,而[12]且不能自己运行。它需要通过某一个Activity或者其他的Context对象来调用。最常见的例子,比如说用户正在运行一个音乐播放器的程序,此时如果想浏览网页,那么,在用户导航到Android的浏览器以后,虽然进入了浏览器屏幕,但是歌曲的播放并没有停止,而是在后台继续播放着。其实播放的动作正是由播放音乐的Service执行着。当然,如果需要的话,Service也是可以停止。通过startService(Intentservice)可以启动一个Service,通过Context.bindService()可以绑定一个Service。2.4.4ContentProvider对于数据存储,Android与其他的操作系统有一点不太一样,即数据在Android程序中都是私有的,这些数据包括文件类型和数据库类型以及其他类型的数据。这样系统和应用程序的数据就各自独立起来,以避免受到某些不正常程序或是病毒的影响。不过这并不代表各应用程序之间就因此而无法进行数据交换了。当某个应用程序希望与其它的应用共享其数据时,Android提供的ContentProvider就可以发挥作用了。在实现ContentProvider的抽象接口以后,程序便可以将自己的数据暴露出去,其他程序只要有权限,[13]就可以通过这一套标准而统一的接口,读取或是删除该程序的数据。10 2Android平台概述2.5Android应用程序的生命周期Android应用程序一个完整的生命周期是从应用程序的创建到结束的全过程,与其他系统不同,Android应用程序的生命周期是不受进程本身控制的,而是由Android系统来决定的,Android系统会根据应用程序对用户的重要性及当前系统的负载来决定生命周期的长短。Android系统的各个进程重要程度如图2.3所示。图2.3Android应用程序进程优先级(1)前台进程,是Android系统中最重要的进程,是与用户正在进行交互的进程。有以下四种情况:Activity正在与用户进行交互;进程被Activity调用,而且这个进程正在与用户进行交互;进程服务正在执行声明中的回调函数,如onCreate()、onStart()、onDestroy();进程的BroadcastReceiver在执行onReceive()函数。Android系统在多个前台进程同时运行时,可能会出现资源不足的情况,此时会清除部分前台进程,以保证主要的用户界面能够及时响应。(2)可见进程,是指部分应用程序界面能够被用户看见,却不在前台与用户进行交互,不影响界面事件的进程。如果应用程序进程包含一个服务,且这个服务正被用户可见的Activity调用,则此进程同样被视为可见进程。Android进程一般存在少量的可见进程,只有在特殊情况下,Android系统才会为保证前台进程的资源而清除可见进程。(3)服务进程,服务进程是指包含已启动服务的进程。该进程没有用户界面并在后台长期运行。除非Android系统不能保证前台进程和可见进程所必要的资源,否则不会强行清除服务进程。(4)后台进程,后台进程是指不包括任何已经启动的服务,而且没有任何用户可见的Activity的进程。Android系统中一般存在数量较多的后台进程,在系统资源紧张时系统将会优先清除用户较长时间没有见到的后台进程。(5)空进程,空进程是不包含任何活跃组件的进程,空进程在系统紧张时会被首先清除。但为了提高Android应用程序的启动速度,Android系统会将空进程保存在系统内存用,在用户重新启动该程序时,空进程会被重新使用。当两个应用程序具有相同的优先级时,处于较低优先级且运行时间最长的进程将会首先被终止。进程的优先级也受到进程间依赖性的影响,如果一个应用程序依赖于第二个应用程序所提供的服务或者内容提供器,那么第二个应用程序至少会拥有与它所支持的这个应用程序相同的优先级。进程的优先级取决于所有组件中优先级最高的部分,进11 西安科技大学硕士学位论文程的优先级会根据其他进程的依赖关系而变化。2.6本章小结本章主要介绍了Android平台,首先简要的介绍了其特性,然后分析了其框架结构。最后重点分析了其应用程序的主要构成和生命周期,为Android游戏的开发实现打下了理论基础。12 3Android手机游戏开发关键技术研究3Android手机游戏开发关键技术研究本章主要介绍Android游戏开发的基本框架和开发中涉及的关键技术。其中开发框架是基于现有Android游戏学习研究的基础上提出的,开发关键技术是基于Android游戏的研究以及自己的开发实践的总结。3.1手机游戏开发流程这里首先介绍下手机游戏开发制作流程,其开发周期可以分为以下:游戏的策划,企划书的编写,美工及背景音乐的创作,游戏程序的代码编写与调试,游戏的测试,Demo[14]-[15]版的发布,对Demo版的再测试,正式版的发布。其流程如图3.1所示。图3.1手机游戏开发流程13 西安科技大学硕士学位论文3.2Android游戏开发框架本节根据本人对Android游戏的学习研究,提出了Android游戏开发的基本框架。对于Android游戏,在设计上要注重功能独立和层次清晰。一般在设计时可以大概把整个游戏的框架划分为以下三个层次。图3.2游戏程序三层结构整体控制层:在Android游戏中一般是通过Activity控制整个游戏发展的流程,包括进入欢迎界面、游戏加载、进入游戏界面、进入帮助界面,以及启动游戏、暂停游戏、结束游戏等。界面表现层:此层包括图层对象和视图对象。图层对象定义图层的宽和高、图层的[16]位置、图层的移动以及图层的绘制方法等;视图对象的主要作用是绘制图层对象、响应键盘事件和处理视图线程等。数据存储层:保存游戏的数据,例如在游戏中设计的用来封装常用数据常量的类以及在退出游戏时用来保存当前游戏进度的文件等。下面重点介绍下Android游戏设计的界面表现层。(1)图层对象我们以面向对象的设计思想设计一个图层对象,该对象定义图层的坐标、宽和高、移动方法、位置方法、是否可见方法以及绘制方法。(2)视图对象视图对象主要是将图层绘制在屏幕上,另外需要响应用户交互,例如处理键盘事件,触屏事件等等。在Android平台下,提供了View、SurfaceView类作为视图类的基类。我们首先看下以View类作为基类的视图类的开发。在Android中,任何一个View类都只需要重写其中的onDraw()方法来实现界面的绘制。游戏的核心是不断的绘图和刷新界面,在Android中最常用的方法是利用Handler来实现UI线程的更新,也可以直接在run()方法中使用postInvalidate()方法在线程中更新界面。其次,是SurfaceView类开发框架。当需要开发复杂的游戏,而且对程序的执行效率很高时,View类就不能满足需求了,这时必须用SurfaceView类进行开发,这也是主流的开发框架。一般在使用时需要对其进行创建、销毁,情况改变时要进行监视,这就要实现SurfaceHolder.Callback接口,如果要对被绘14 3Android手机游戏开发关键技术研究制的画布进行裁减,控制其大小时都需要使用SurfaceHolder来完成处理。在程序中,SurfaceHolder对象需要通过getHolder方法来获得,同时还需要addCallback方法来添加[17]“回调函数”。下面是一个简单的SurfaceView类框架:publicclassGameSurfaceViewextendsSurfaceViewimplementsSurfaceHolder.Callback,Runnable{publicGameSurfaceView(Contextcontext){super(context);mSurfaceHolder=this.getHolder();mSurfaceHolder.addCallback(this);this.setFocusable(true);}publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){}publicvoidsurfaceCreated(SurfaceHolderholder){newThread(this).start();}publicvoidsurfaceDestroyed(SurfaceHolderholder){}publicvoidrun(){while(true){try{Thread.sleep(1000);}catch(Exceptione){}synchronized(mSurfaceHolder){Draw();}}}privatevoidDraw(){Canvascanvas=mSurfaceHolder.lockCanvas();15 西安科技大学硕士学位论文......mSurfaceHolder.unlockCanvasAndPost(canvas);}}一般surfaceCreated方法用来在开始绘制视图对象时初始化和启动所需的各个线程,而surfaceDestroyed方法用来在绘制视图对象结束时停止各个线程。这里通过实现Runnable接口来实现刷帧线程,也可以通过创建内部的线程类来实现刷帧线程。最后在Activity类中,调用setContentView(GameSurfaceView的对象)实现视图对象的显示。3.3Android游戏开发中的多线程技术线程机制的应用是实现游戏控制的基石,游戏中的刷帧、后台资源的加载以及对各类角色的自动控制都需要线程来实现。下面将具体讲述Android下的多线程机制。3.3.1Android多线程优点在开发较为复杂的Android应用程序时,一般都要使用多线程。单线程模型所有的任务都在同一个线程中执行,当执行一个耗时的操作时,就会阻塞整个用户界面,从用户角度来看,应用程序看上去就像挂掉一样。更糟糕的是,如果阻塞应用程序的时间过长(大概是5秒钟),Android会向用户提示一些信息,即打开一个“应用程序没有响应(applicationnotresponding)”的对话框。这些造成了Android应用程序的性能低下。在应用程序中使用多线程的优点有:(1)与用户更好的交互。(2)模拟同时进行的活动。(3)开发利用多处理器。[18](4)当等待慢的I/O操作时,可以做其他事情。3.3.2Android线程模型在Android中,创建一个线程需要继承Thread类,并实现里面的run()方法。默认情况下,一个Android应用程序用到的各种组件(如Activity、BroadcastReceiver或Service)都会在同一个进程中执行,并且由该进程的主线程负责执行。主线程除了要处理Activity的UI事件,还要处理Service后台服务工作,通常会忙不过来,此时,多线程的并行就派[19]上用场了,其可以化解主线程太过忙碌的情形。也就是说,主线程可以诞生多个子线程来分担其工作,尤其是比较冗长费时的后台服务工作,例如播放动画的背景音乐、或16 3Android手机游戏开发关键技术研究从网上下载电影等。这时,主线程就可以专心处理UI画面的事件了。Android的主线程里有一个消息队列,线程在一个循环中检测是否有新的消息的到来,如果没有消息在队列中,则主线程挂起等待。在设计Android应用程序时,一般都是把费时的工作交给子线程,子线程再把结果反馈给主线程,主线程和子线程之间传递消息是以android.os.Handler为桥梁的。3.3.3Android线程间通信当应用程序创建一个进程后,一个主线程会被创建。这个主线程主要负责维护组件对象和应用程序创建的所有窗口,如果应用程序中创建了自己的线程,就需要使用Handler来同主线程进行交互。Handler类主要用于应用程序的主线程同用户自己创建的线程进行通信,应用程序在主线程中维护一个消息队列。Handler机制使得线程间的通信通过Message和Runnable对象来传递和处理。每个Handler对象都与一个线程及其消息队列相关联。当创建一个Handler对象时,其便与创建这个Handler对象的线程的消息队列绑定,之后Handler对象将会向消息队列传递Message并处理执行队列中的元素。Handler最主要的用法就是安排Message对象使其在未来的某个时刻被处理或运行。在本游戏的开发中常使用方法sendEmptyMessage(intwhat)。其中what是由用户定义的消息类型码,接受方可以根据该字段值来确定收到的消息是关于什么的。接受并处理消息的方法是handleMessage方法,该方法接受的参数为一个Message对象。3.4Android游戏开发中的图形处理技术3.4.1Android图形显示原理Android系统的图形处理能力非常强大,在图形显示方面,Android建立在Linux上,但并没有像一些桌面Linux使用GTK(GIMPToolkit)组建XWindows(一个多平台的图形用户接口),也没有使用Cairo向量图形链接库实现图形显示,而是使用了专为Android而改良的一种2D向量图形处理函数库Skia。在3D图形方面是基于嵌入式3D图形算法标准OpenGL/ES实现的,该库可以使用硬件加速。AndroidSDK的图形包主要包括android.graphics、android.view、android.widget和android.opengl,前3个是用于2D的图形开发,基于SGL(skiagraphicslibrary)。android.opengl是用于3D的图形开发,基于OpenGL/ES。Skia是一个开放源码的2D向量图形处理函数库,包含字型、坐标转换以及点阵图,有着高效能且简洁的表现,在Android平台中搭配OpenGL/ES与特定的硬件特征强化了显示效果。OpenGL/ES是OpenGL的一个子集,是一个跨平台图形库,OpenGL/ES是17 西安科技大学硕士学位论文专门为嵌入式系统而设计的。Android图形系统的组成如表3.1所示。上层应用调用2D和3D图形库对SurfaceManager提供的Surface进行绘制,通过SurfaceManager的合成器SurfaceFlinger对各个Surface进行合成,并由EGL接口实现了在Framebuffer设备上的显示。表3.1Android图形系统的组成ApplicationView/Widget/CanvasOpenGL/ESSGLSurfaceSurfaceManagerEGLFrameBuffer在Android的图形系统中,SurfaceManager是一个重要组成,SurfaceManager对上层提供Surface给应用进行绘制,管理对显示子系统的访问,对来自多个应用的2D和3D图像进行无缝的合成后传给底层的EGL进行处理,SurfaceManager的工作原理如图3.3所示。图3.3SurfaceManager的工作原理SurfaceManager为Application准备一个或多个Surface后,把Surface传给Application,让Application可以在上面作图形处理。应用程序先通过调用图形库提供基础的绘制图形原语和JNI函数,然后又通过NativeMethod的绘制图形原语调用2D和3D的图形库对Surface进行绘制。在Android平台下,每个Surface都有一个FrontBuffer和一个BackBuffer,每个窗口都以一个Surface对象作为基础。每个Surface又对应一个Layer,SurfaceFlinger将各个Layer的FrontBuffer合成后绘制到FrameBuffer上。关于SurfaceFlinger,在SurfaceManager中用于管理逻辑上众多的Surface,其功能特点如下:(1)SurfaceFlinger在一个系统范围内合成Surface的功能,并把合成后的显示内容传给帧缓冲设备;(2)SurfaceFlinger能一起合成来自多个程序的2D或3D显示的Surface;18 3Android手机游戏开发关键技术研究(3)Surface通过Android的IPC机制Binder以缓冲的形式进行递交。3.4.2Android的双缓冲绘图技术在Android平台中,双缓冲技术分别在Surface的处理和底层FrameBuffer的处理中使用到,在对FrameBuffer处理的双缓冲技术根据OpenGL的标准实现,而对Surface处理的双缓冲技术则有所不同,下面重点讲述Surface中的双缓冲技术。每个Surface中都带有两个帧缓冲区,分别称为FrontBuffer和BackBuffer,与OpenGL中双缓冲技术有所不同,当绘制BackBuffer后需要显示时,并没有将BackBuffer中的数据拷贝到FrontBuffer中,而是直接显示BackBuffer中的数据到屏幕中,从而最大限度地减少了数据的复制。图3.4是使用Canvas绘制Surface的原理,具体过程如下:(1)创建一个bitmap与Canvas关联起来;(2)把准备显示的图形提交到Canvas上;(3)lockCanvas,锁定Canvas;(4)drawCanvas,把bitmap中的数据写入到BackBuffer中;(5)unlockCanvasAndPost,解锁Canvas,BackBuffer替换FrontBuffer,替换后BackBuffer作为前台缓冲,FrontBuffer作为后台缓冲。图3.4Canvas绘制Surface原理3.4.3Android中的静态图片访问Android游戏中也需要绘制静态图片。在Android中操作静态图片是通过使用Drawable类来完成的。Drawable类有很多子类,如BitmapDrawable用来操作位图;ColorDrawable用来操作颜色;ShapeDrawable用来操作各种形状。一般有两种方法来实例化Drawable对象:一是使用保存在工程中的一个图片文件;[20]二是使用XML文件定义Drawable属性。最简单的一种方式是在工程的资源文件下面保存图片,该图片会自动在R类中创建引用,然后便可通过R.drawable.my_image使用该图片对象。我们还可通过XML文件来定义Drawable属性,例如可以在布局文件中定义图片按钮的图片及应用程序的图表。在本人开发的游戏中,便通过AndroidManifest.xml配置文件来引用资源图标。如下所示。19 西安科技大学硕士学位论文android:icon="@drawable/icon"//icon便是游戏的图标。3.4.4Android中的动画在Android平台下提供了两种动画,第一种动画是Tween动画,这种动画是通过对场景里的对象进行不断的移动、放大、缩小、旋转等变换来实现动画的效果;第二种动画是Frame动画,它是通过按顺序播放事先安排好的图片,来实现动画的效果,类似于放[21]动画片和电影。本节对这两种动画尤其是第二种动画进行探讨。(1)Tween动画Tween动画通过对View的内容完成一系列的图形变换(包括平移、缩放、旋转、改变透明度)来实现动画效果。它主要包括以下四种动画效果:Alpha:渐变透明度动画效果。Scale:渐变尺寸伸缩动画效果。Translate:画面转移位置移动动画效果。Rotate:画面转移旋转动画效果。具体来讲,Tween动画是通过预先定义一组指令,这些指令指定了图形变换的类型、触发时间、持续时间。程序沿着时间线执行这些指令就可以实现动画效果。因此我们首先需要定义Animation动画对象,然后设置该动画的一些属性,最后通过startAnimation方法来开始动画。(2)Frame动画Frame动画是通过按顺序播放图片来产生动画效果的。例如,如果我们要实现一个人走动的动画,可以用三张图片来实现,第一张两脚都着地,第二张左脚着地,第三张右脚着地。然后我们按顺序播放就可以产生人走路的动画效果了。Frame动画是通过AnimationDrawable类来实现的,该类中的两个重要方法是start()和stop(),分别用来开始和停止动画。动画一般通过XML文件进行配置,在工程的目录resanim下创建一个XML文件,该配置文件中有一个根元素和若干个[22]子元素。下面我们通过Frame动画来演示本人开发的游戏中经常出现的爆炸过程。首先绘制好几幅静态图片,这几幅静态图片顺序描绘了爆炸的整个过程。六幅静态图片按顺序排列如下所示。(a)(b)(c)(d)(e)(f)图3.5实现爆炸效果动画的静态图片20 3Android手机游戏开发关键技术研究创建好工程,在该工程的resdrawable目录下存放好绘制的六幅图片,然后在该工程的resanim目录下创建一个XML文件。这里通过设置android:duration的值来设置动画播放的帧频率,我们在这里设置每秒播放20帧,实验显示爆炸真实感较强。这里为了播放动画,还在main.xml文件中创建两个Button,一个在按键监听方法中调用start()开始动画,另一个在按键监听方法中调用stop()来停止动画。并在main.xml文件中添加一个ImageView显示动画。设置ImageView的背景色:在模拟器AVD上演示效果如下图所示,这里选取了动画中的两个瞬间。图3.6爆炸效果实验截图1图3.7爆炸效果实验截图221 西安科技大学硕士学位论文3.4.5Android中的动态图形绘制游戏中用到最多的还是动态图形的绘制。要绘制这些动态图形,要先创建一个类继承自View类或SurfaceView类,并重新实现其中的onDraw()方法,然后使用Canvas对象在界面上绘制出各种不同的图形,使用invalidate()方法刷新界面。在绘制动态图形时,首先需要一张画布,这就是Canvas类,下来还需要一支画笔,这就要用到Paint类,再次还需要各种不同的颜色,这要用到Color类,除此之外,如果要画线还要连接路径,这用到Path类。这些类都位于android.graphics包中,下面介绍这些类。(1)Canvas类Canvas类主要实现了屏幕的绘制过程,其中包含了很多实用的方法,比如绘制一条路径、区域、贴图、画点、画线、渲染文本,下面是Canvas类常用的方法。Canvas():创建一个空的画布,可以使用setBitmap()方法来设置绘制具体的画布。Canvas(Bitmapbitmap):以bitmap对象创建一个画布,则将内容都绘制在bitmap上,因此bitmap不得为null。Canvas(GLgl):在绘制3D效果时使用,与OpenGL相关。drawColor:设置Canvas的背景颜色。setBitmap:设置具体画布。clipRect:设置显示区域,即设置裁剪区。isOpaque:检测是否支持透明。rotate:旋转画布。setViewport:设置画布中显示窗口。skew:设置偏移量。上面列举了几个常用的方法。在游戏开发中,我们可能需要对某个精灵执行旋转、缩放和一些其它操作。我们可以通过旋转画布来实现,但是旋转画布时会旋转画布上的所有对象,而我们只是需要旋转其中的一个,这时就需要用到save方法来锁定需要操作的对象,在操作之后通过restore方法来解除锁定。(2)Paint类Paint就是涂料的意思,用来描述图形的颜色及风格,如线宽、颜色、字体等信息。该类的主要方法如下所示。Paint():构造方法,使用默认设置。setColor(intcolor):设置颜色。setStrokeWidth(floatwidth):设置线宽。setTextAlign(Paint.Alignalign):设置文字对齐。setTextSize(floattextSize):设置文字尺寸。22 3Android手机游戏开发关键技术研究setShader(Shadershader):设置渐变。setAlpha(inta):设置alpha值。reset():复位Paint默认设置。(3)Color类Color类很简单,主要定义了一些颜色常量,还定义了一些创建颜色的方法。如Color.rgb方法将整型的颜色值转换成Color类型。(4)Path类当需要画一些图形的时候,我们需要画一些点和连线。Path一般就用来从某个点移动到另一个点的连线。主要方法有:lineTo(floatx,floaty):从最后点到指定点画线。moveTo(floatx,floaty):移动到指定点。[23]reset():复位。以上介绍了在游戏开发中绘制动态图形时经常用到的主要类和方法。3.5Android游戏开发中的碰撞检测技术在开发各种游戏,尤其是动作类游戏中,需要运用很多碰撞检测技术。比如飞机撞到子弹,小球反弹,玩家捡到宝物,玩家碰到箱子等等。碰撞检测技术的实现要综合运用数学和物理知识,在不同的情况下,采用不同的碰撞检测方式,本节主要研究总结碰撞检测在游戏中应用的基本原则以及在游戏中的使用方式。3.5.1碰撞检测技术基础一般情况下,碰撞检测只会发生在游戏中的实体对象的位置发生了变化之后。对移动之后进行碰撞检测的场合,程序中一般情况下通过以下流程来应用碰撞检测。图3.8碰撞检测流程图实现碰撞检测涉及的内容通常包括三个方面:23 西安科技大学硕士学位论文(1)确定检测对象:游戏在运行中会有很多实体对象,在进行碰撞检测时并不需要对所有的实体对象都检测一遍,如玩家没有必要检测是否和自己发出的子弹碰撞,静止的宝箱也没有必要去检测和另外的宝箱是否发生了碰撞。所以在开始碰撞检测之前,首先要确定碰撞检测的对象是什么。(2)检测是否碰撞:这是检测的核心环节,在这个环节需要综合考虑游戏本身的需求以及运行平台的性能等问题,合理的选择碰撞检测的算法。(3)处理碰撞:当检测到碰撞发生的时候,就需要根据碰撞的类型进行相应的处理,例如炮弹会在碰到目标后爆炸并给目标带来伤害。考虑到游戏的最佳体验问题,通常在开发游戏碰撞检测模块时需要遵循以下几个原则:(1)尽量避免碰撞,无法避免的情况下要尽量减少碰撞检测的次数。尤其对于手机这样的移动平台而言,碰撞检测会消耗内存和占用CPU时间,会影响游戏的流畅性,所以一定要尽量减少。(2)采用不影响游戏性能的算法尽快检测。对碰撞检测来说,精度和速度就好比算法设计中的空间复杂度和时间复杂度,二者很难两全。所以在游戏开发中要做出权衡,选择一种对于精确程度和执行速度来说比较适中的算法。(3)碰撞处理要柔和,不要让玩家感觉生硬。要考虑到现实中的物理现象,碰撞后[24]的结果要让人感觉真实、自然。3.5.2游戏实体对象之间的碰撞检测具体来讲,碰撞检测主要分为游戏实体对象(玩家、敌人、子弹、道具等)之间的碰撞检测和实体对象和环境(游戏场景中的树、墙、草丛等)之间的碰撞检测。针对本人设计开发的游戏,在这里主要研究了游戏中实体对象之间的碰撞检测。游戏中实体对象和环境间的碰撞检测无法偷工减料,但对于实体对象间的碰撞检测就可以稍加优化。所以在研究实体间碰撞检测算法前,需要考虑如何减少待检测实体的个数,总结后得出一般有如下几种可考虑的方案。(1)静止的实体不负责碰撞检测如游戏中静止的宝箱不应该定时检测玩家控制的英雄有没有与自己发生碰撞,这项工作应该交给二者中移动的一方即玩家自己来负责。(2)只进行单向碰撞检测如射击游戏中,不该出现这样的检测算法:敌人射出的子弹在移动中检测是否遇到了玩家控制的英雄,而玩家控制的英雄在移动中也会检测是否有子弹打中自己。这种算法多此一举,影响了游戏的性能,还使玩家受到双倍伤害。一般来说,碰撞检测应该是由两实体对象中主动的一方来进行。24 3Android手机游戏开发关键技术研究(3)距离远的对象不进行碰撞检测在游戏中,通常如果某两个实体之间的距离太远,在检测时会将较远的实体忽略,这样能提高游戏的执行速度,实现这样的策略方式主要有:①划分网格法将游戏地图划分为若干个网格,每个实体隶属于一个网格,实体只需要检测其隶属网格和相邻网格中的实体对象之间是否发生碰撞。②实体排序法这种方法的实现途径是保持实体对象的有序性,然后再对某一实体进行碰撞检测时,只需要检测与该实体在实体序列中位置相邻的实体。不过这种方式需要消耗一定的性能来维护实体的有序性。在尽可能减少碰撞检测的次数以后,就需要研究碰撞检测的算法了。最基本的有矩(圆柱)形检测和圆(球)形检测。这里只针对我设计的2D游戏来探讨下常用的碰撞检测技术。(1)矩形检测这种方法适用于地图中的物体近似为矩形或者虽然不是矩形,但是碰撞精度要求不高的情况下。每个物体记录一个能够将自己框住的最小矩形的左上角坐标和矩形长宽。碰撞退化为判断矩形与矩形之间是否重叠,而这仅需要4次比较即可得出,速度很快。但为了判断整个场景中的物体,必须取第一个物体,迭代其他所有物体进行判断,再取第二个物体,迭代除第一第二个物体外的所有物体进行判断,以此类推。总计要进行(n-1)!次矩形判断才能准确得出场景中所有的碰撞可能。(2)圆形检测与上一种方法类似,区别在于用一个能够包含物体的最小圆代替了矩形。主要是考虑到游戏中的物体外形以平滑为主,例如人物角色。而判断两个圆是否碰撞的计算也很简单,就是判断两个圆心之间的距离是否小于两个圆的半径之和。虽然球形检测在某些情况下提高了精度,但却损失了速度,因为点距离的计算需要用到平方和开方。另外,为了计算整个地图的所有碰撞可能,也要进行(n-1)!次比较。(3)像素检测精确到像素级,已经不能比这更精确了,相对的,效率也是最低的。怎样判断两个物体是否碰撞呢?在过去PNG格式图片还不盛行的时候,游戏中用到的图片中的透明部分是指定用某种颜色来表示的,例如洋红色。就像电影中的绿幕蓝幕,通过处理把这些颜色的像素点当做透明点,而为了判断检测,需要准备一张原图像的黑白图,黑色区域表示透明,这张图片中的每个像素值为0或者1,判断检测的时候取两张图片的黑白图,进行与运算,结果为1(有白点重叠),则判为碰撞。但是现在有了PNG和XNA,逐像素检测就相对简单一些。首先仍然需要有一个矩形框包围物体,通过矩形检测得到重叠的25 西安科技大学硕士学位论文矩形区域可以大大减少检测的像素点数量。然后在这个区域内,取两个图片的点逐行逐列迭代,如果遇到某个点两张图片均有颜色存在,即判为碰撞。同理,进行(n-1)!次比[25]较后得到全地图的所有碰撞可能。3.6本章小结本章通过对Android游戏的研究,提出了Android游戏的开发框架,并总结归纳了Android游戏开发中涉及的一些关键技术。在本章开始时首先介绍了手机游戏的分类以及手机游戏的开发流程,然后重点介绍提出的Android游戏的开发框架,接着分别论述了Android游戏中涉及的多线程技术和图形处理技术,并针对自己的游戏,论述了游戏开发中的碰撞检测技术。26 4Android手机游戏“飞行战”的设计4Android手机游戏“飞行战”的设计4.1动作射击类游戏概述本课题开发的Android手机游戏名为“飞行战”,属2D动作射击类游戏。动作射击类游戏一般都讲究快节奏,考验玩家的反应和操作能力,其惊险刺激的场面受到许多玩家的追捧。PC机上的动作射击类游戏在玩法上一般有单人模式、二人对战模式和多人在线模式,而手机上的动作射击类游戏一般都是单人模式。此类游戏操作较为简单,易于上手,主要是控制角色的行走方向以及向目标开火或者施放特殊的技能。动作射击类游戏一般会在游戏开始时给玩家提供一定的生命值,当耗尽所给生命值时游戏结束。此类游戏多为关卡游戏,即玩家用有限的生命挑战难度不断上升的关卡。动作射击类游戏的特色是游戏节奏快,惊险刺激,能锻炼玩家的反应能力,需要玩家全神贯注的投入到游戏中,从而给玩家带来刺激的感觉。所以此类游戏在设计时,一般要选好背景,要重视背景画面的设计,因为画面的美观是吸引玩家的一个主要方面。另外为了提高游戏的可玩性,会提供各种道具,比如各种可以提升玩家性能的装备等。关卡难度设计也是这类游戏设计的一个重点,不易太难,也不要太容易,需要难度适中,各关卡难度还要有一个递增[26]的过程,否则会大大降低游戏的可玩度。4.2游戏功能描述“飞行战”游戏情景较为简单,良好的操作和给人带来的震撼刺激感才是最重要的。现在将游戏需要的主要功能做如下描述。(1)界面显示整个游戏界面主要需包括游戏界面和辅助界面两部分。其中游戏界面是游戏的主体界面;辅助界面应包括欢迎界面、菜单界面、游戏说明界面、加载界面、胜利界面以及失败界面,有些界面还需要设计按钮来切换到别的界面或退出游戏。(2)角色设计本游戏的角色包括游戏主角、NPC(非玩家控制角色)、以及道具、子弹等。游戏的主角是玩家控制的飞机,玩家通过上下左右键控制其移动方向,按A键来发射子弹。另外还要设计玩家控制的飞机的生命值,在玩家飞机碰撞到敌机或敌机子弹时,生命值减少。这里还需要设计碰撞检测的算法以及碰撞后的处理(爆炸效果的动画设计等)。游戏的NPC在这里是指的是电脑控制的敌机,包括普通敌机以及敌机BOSS,其中普通敌机的路径通过地图提前标注,而敌机BOSS将为其增加人工智能,使其具有感知玩家飞机位置的能力,并设计实现跟踪算法使其追踪玩家飞机。玩家飞机可以发射不同的子弹,当玩家飞机吃了换子弹道具后发射的子弹会发生变化,子弹威力也会加强,27 西安科技大学硕士学位论文另外不同的敌机也会发射不同的子弹。除换子弹道具外,还有补血道具,当玩家飞机吃到补血道具后,如果玩家飞机的生命值不满,会增加一点生命值,如果生命满值,就不再增加生命值。(3)音效设计为了增加玩家强烈的体验,需要根据游戏具体的场景来添加适当的音效,包括背景音效、发射子弹时的音效以及爆炸音效等。(4)地图设计首先要选定好背景图片,提前标注地图中各种敌机的飞行路径,还要设计各种道具出现的信息。(5)换关功能游戏由多个关卡组成,当玩家通过一关后必须能正确的切换到下一关,继续下一关游戏。(6)嵌入短信付费功能当第一关结束的时候,如果玩家想继续玩后面的游戏,必须付费,这时会弹出是否需要付费以继续游戏的界面,玩家点击“是”向服务器发送短信成功后可继续游戏。4.3游戏的主要流程设计游戏的总体流程图如图4.1所示。图4.1游戏总体流程图28 4Android手机游戏“飞行战”的设计上面是游戏的总体流程图,首先进入的是游戏的加载界面,这时将启动一个线程在后台初始化欢迎界面和菜单界面的资源。然后将进入欢迎界面,进而进入菜单界面,在菜单界面,有四个按钮,分别对应开始游戏、游戏说明、声音设置和退出游戏,选择开始游戏后将加载游戏用到的资源,然后将正式进入游戏。在游戏第一关胜利之后,还设计了短信付费,通过短信付费,才可以继续进行下一关的游戏。程序采用面向对象的设计模式,进入游戏后,在主程序运行的线程中,画面刷新将以一定的频率采用双缓冲技术对屏幕重绘,实时反映整个游戏的进行状态。玩家控制的飞机运行在主线程中,随屏幕刷新的频率而活动。敌机还有各种道具将会从屏幕右边放飞入。在屏幕重绘的主程序中,将在每次的循环中判断若干事件,如玩家飞机与敌机的碰撞,玩家飞机与敌机子弹的碰撞,玩家飞机与道具的碰撞等。下面是玩家飞机生命周期的流程设计。图4.2玩家飞机生命周期4.4游戏的总体架构设计本游戏使用SurfaceView作为主要视图类的基类,从而利用双缓冲技术实现屏幕中的绘图。在设计游戏时,根据功能的不同,把整个游戏的总体功能架构分为了六个功能模块:控制调度模块、逻辑计算模块、数据存储模块、图形界面模块、声音播放模块和短信付费模块,图4.3是游戏的总体功能架构图。图4.3游戏总体功能架构图29 西安科技大学硕士学位论文各功能模块的设计描述如下:(1)控制调度模块是整个游戏的核心模块,它将游戏中的各个模块连为一个整体,起到整体控制调度的作用。控制调度模块将设计由MainActivity类来实现,其要实现的主要功能有:①是整个游戏的入口,在启动游戏时,直接调用MainActivity中的onCreat()函数进入游戏。②获取键盘输入信息,需设计onKeyUp()和onKeyDown()两个回调函数来监听键盘的输入,获得键盘的状态值并将状态值保存到相应变量中。③设计通过Handler机制完成多线程之间的通信,从而实现游戏状态的转换,控制各个界面之间的切换。(2)逻辑计算模块此模块要实现的主要功能有:①根据获得的键盘状态信息,计算出玩家飞机的移动方向和步长,以及子弹的移动。②进行敌我双方飞机之间、玩家飞机与敌机子弹之间以及玩家飞机与道具之间碰撞检测,并根据检测结果做出相应的处理。③为敌机BOSS加上人工智能,使其变得智能化,能感知出玩家飞机的位置,并向玩家飞机移动。所以此处需实现敌机BOSS的跟踪算法。(3)数据存储模块此模块设计由两部分组成,一部分设计通过一个常量类来封装游戏中用到的所有常量;另一部分通过设计实现地图类来存储普通敌机以及所有道具的飞行路线。(4)图形界面模块主要负责各种可视化界面的绘制。在本游戏中,设计的可视化界面主要包括:欢迎界面、菜单界面、游戏说明界面、加载界面、游戏界面、胜利界面以及失败界面。将分别相应的类来实现,并通过MainActivity实现各个界面的控制调度。这些界面的视图类都需继承自SurfaceView类,并都实现SurfaceHolder.Callback接口,从而利用双缓冲绘图技术,以避免屏幕画面的闪烁。在这些类中重点实现onDraw()方法,通过onDraw()方法[27]来实现图形界面的绘制。(5)声音播放模块此模块主要负责声音的播放。设计的欢迎动画过程中,需伴随有背景音乐,在游戏不同情境下,还需实现一些特殊的声音效果,比如爆炸等。此功能模块通过Android提供的SoundPool类和MediaPlayer类来实现。(6)短信付费模块此模块是用来实现短信付费功能的。众所周知,许多通信运营商都是通过短信付费的方式来收取玩家玩游戏的费用,一般在游戏刚开始时,都会有免费试玩的部分,而玩30 4Android手机游戏“飞行战”的设计家想继续玩后面的游戏时,就必须付费了。本游戏就实现了短信付费功能。当第一关结束时,如果玩家想继续下一关的游戏,就必须向服务器发送短信,成功发送后方可进入下一关。4.5本章小结本章主要介绍Android手机游戏“飞行战”的总体设计。本游戏属于动作射击类游戏。首先简要介绍了动作射击类游戏,然后描述了本游戏需要实现的主要功能,接着对本游戏的主要流程进行了设计,并在最后给出了游戏整个功能架构的设计。31 西安科技大学硕士学位论文5Android手机游戏“飞行战”的实现5.1Android游戏开发环境的搭建Android的开发支持主流的操作系统有:Windows、Mac和Linux。本课题所开发的Android游戏在WindowsXP操作系统下进行,因此本文Android开发环境的搭建围绕Windows操作系统展开。5.1.1下载Android开发工具首先需要下载Android开发环境所必需的开发工具,Android开发所需要的开发工具如下:(1)JDK,Java开发工具包,Android应用软件大部分是由Java语言所编写的,所以开发Android应用程序首先需要Java开发包的支持。(2)Eclipse,Java开发环境有许多,但Google只为Android的集成开发环境Eclipse提供了专用的开发插件ADT(AndroidDevelopmentKit),所以Android的开发必须有Eclipse的支持。(3)AndroidSDK,AndroidSDK是Android专属的软件开发包,提供了一系列用于开发应用程序的工具,包括:模拟硬件设备的Emulator、Android资源打包工具AAPT、Dalvik调试监视服务DDMS、Android调试桥ADB和将.class字码文件转换成.dex文件的DX工具[28]等。所以该软件开发包是编写Android应用程序的核心,必不可少。AndroidSDK版本更新很快,现在最新的版本为3.0版本,为保证程序运行的稳定性,本应用程序的设计采用2.2版本的SDK。本应用程序中使用的Android开发工具各版本和下载地址如表5.1所示。表5.1Android开发工具下载地址软件名称所用版本下载地址JDK1.6http://java.sun.com/javase/downloadsEclipseGanymedehttp://www.eclipse.orgAndroidSDKAndroidSDK2.2http://developer.android.com/sdk/index.htmlADT10.0.1http://dl-ssl.google.com/android/eclipse5.1.2配置开发环境下载完Android开发工具后,需要对其进行安装和配置,Android开发平台的搭建32 5Android手机游戏“飞行战”的实现需要进行以下配置:(1)配置JDK,下载完成的JDK安装包是一个可执行文件,双击直接安装即可。Android应用程序的开发过程中,为了使用Java工具进行编译、运行,需要为Java配置环境变量。首先在环境变量中创建一个名为“java_home”的环境变量,变量值为java的安装路径,然后修改环境变量path,将Java的bin目录添加到其中并用分号“;”隔开,如后期安装了更高版本的JDK,则仅需要修改环境变量java_home的值为新的JDK安装路径[28]。(2)配置Eclipse,Eclipse的集成开发环境IDE不需要安装,解压后即可使用。首先为Eclipse配置Android专用开发包ADT,选择“Help->InstallNewSoftware”选项,弹出一个新窗口,然后选择“AddSite”按钮,在弹出的“Location”对话框中输入“http://dl-ssl.google.com/android/eclipse/”点击“确定”,Eclipse会自动寻找最新版本的ADT,点击“Install”安装寻找到的所有DevelopmentTools。(3)配置AndroidSDK,先将下载好的版本为2.2的AndroidSDK开发包解压缩至硬盘,然后打开环境变量配置,修改环境变量path,将AndroidSDK下的tools目录添加到其中并用分号“;”隔开。然后在Eclipse的菜单栏上打开“Preference”选项,成功安装ADT后就可以在左侧列表中看到Android标签,打开并在“SDKLocation”中选择解压缩的AndroidSDK目录,在下面的空白处会显示出当前支持的所有SDK版本,点击“Apply”则AndroidSDK配置完成。5.1.3运行单击Windows->AndroidSDKandAVDManager,在弹出的界面左侧可以看到“VirtualDevices”,选中后单击“New…”,输入Name:superman,Target:选择Android2.2–APILevel8,单击“CreateAVD”创建成功。运行模拟器如图5.1所示。图5.1Android模拟器运行图33 西安科技大学硕士学位论文5.2控制调度模块的实现在本游戏设计中,控制调度模块主要是由MainActivity类来实现的,MainActivity继承自Activity类,它提供了整个游戏的入口。并且在游戏运行过程中也随时需要MainActivity的管理。组成此类的主要成员变量如下所示:intaction=0;GameViewgameViewWelcomeViewwelcomeViewFailViewfailViewHelpViewhelpViewWinViewwinViewProcessViewprocessViewbooleanisSound=trueHandlergameHandler以上是主要的成员变量,其中整型变量action表示键盘的状态,其值由封装在此类中的回调函数onKeyUp()、onKeyDown()来获得。之后都是对各种View类的引用。下面重点介绍下Handler,这里定义了一个Handler类的对象gameHandler,Handler主要负责线程之间的通信,通过接受消息来更新UI线程中的控件。这里使用Handler类主要实现的是根据接收到的消息做出相应的切换视图操作,从而控制调度各个视图的显示。Handler机制使[29]得线程间的通信通过Message和Runnable对象来传递和处理。在此模块的实现中,Handler传递的消息内容被封装到一个Message对象中,Message中包含了消息的描述和任何形式的可以被Handler发送的数据对象,其最主要的字段是what,此字段由用户自己定义,为消息类型码,接收方可以根据该字段的值来确定收到的消息是关于什么的。这里重点实现了Handler类中的handleMessage()方法,此方法用来接收并处理消息,接收的参数为一个Message对象。在这里定义了Message的what字段,根据接收到的what字段的值来切换到不同的界面,从而实现对整个游戏运行的管理。下面再来介绍组成MainActivity类的成员函数,如下图所示。图5.2MainActivity类结构图34 5Android手机游戏“飞行战”的实现主要函数介绍如下:onCreat():此函数是Activity类的入口函数,在此函数中先将手机设置成全屏模式,然后切换到加载界面并在后台初始化欢迎动画界面。toWelcomeView():此函数实现欢迎界面的切换。toGameView():此函数实现游戏界面的切换。initHelpView():此函数初始化帮助界面。initFailView():此函数初试化失败界面。initWinView():此函数初始化胜利界面。onKeyUp()、onKeyDown():这两个函数为手机键盘的监听方法。用来获得键盘的状态值,并把它存到action变量中。上面介绍了实现控制调度模块的MainActivity类,可以看出这里主要通过Android中的Handler机制来控制当前屏幕显示哪一个界面,从而完成控制调度功能。5.3逻辑计算模块的实现逻辑计算模块是游戏开发中需要关键实现的模块,此模块主要完成游戏各种事件的处理以及游戏中的人工智能。手机游戏程序处理事件一般可以分为两类:一类由硬件装置设置产生(如键盘被按下),另一类由游戏程序中的内部对象产生(如游戏对象发生碰[30]撞)。游戏中所有可见的东西都是游戏对象,它们是游戏中实际运动的实体。游戏对象需要定义该类对象对应的图片和能够执行的动作。当指定事件发生时,游戏对象会根据运行逻辑执行相应的动作。除了完成游戏中各种事件的处理,此模块还要实现一些非玩家角色(NPC)的游戏人工智能。所谓游戏人工智能,是指用来控制游戏中各种活动对象行为的逻辑。在游戏中,为了给玩家提供更大的挑战性,从而增加游戏的可玩性,便需要为一些非玩家角色增加人工智能。结合上面的论述,在本游戏的设计中逻辑计算模块主要实现三个功能:飞机移动的计算、碰撞检测以及敌机BOSS的人工智能,下面分别讲述其实现过程。5.3.1飞机移动和发射子弹的实现玩家飞机的移动和发射子弹由玩家通过键盘来控制,属于硬件装置产生的事件。游戏中飞机的移动和发射子弹通过键盘监听线程类来实现,该类将启动一个线程,负责定时检测当前键盘的状态,根据键盘的状态调用相应的代码。在本游戏中,设计实现了键盘监听线程KeyThread类,此类继承自Thread类,重点重新实现了Thread类中的run()方法。首先需要得到当前键盘的状态码,通过action=activity.action语句从MainActivity中得到此状态码,然后检测有哪些按键被按下,并把被按下的按键值设为true,接着判断游戏的状态,当处于正在游戏状态时,便可根35 西安科技大学硕士学位论文据KEY_UP、KEY_DOWN、KEY_LEFT、KEY_RIGHT、KEY_A的值为true还是false来执行相应的操作。run()方法内代码的流程图如图5.3所示。得到当前键盘状态码检测哪些键被按下游戏是否处于游戏中否状态是KEY_UPKEY_DOWNKEY_RIGHTKEY_LEFTKEY_A都为false=true=true=true=true=true不执行向上移动向下移动向右移动向左移动发射子弹任何动作睡眠一定时间图5.3键盘监听流程图5.3.2碰撞检测的实现碰撞是由游戏的内部对象产生的。对于动作射击类游戏来说,碰撞检测技术最为重要,甚至可以把此类游戏看做是碰撞的游戏。因此,在此类游戏的开发中,碰撞检测技术运用的合理与否,直接影响到游戏的运行速度和游戏的真实性。因为手机平台本身的硬件资源有限,过于复杂的碰撞检测技术对手机来说,无疑是巨大的挑战,会直接影响到游戏运行的流畅性甚至能否正常运行,而对于过于简单的碰撞检测方式又可能出现不合理的碰撞效果,从而直接影响玩家参与游戏的兴趣。为实现检测效率与游戏效果的最佳统一,在对碰撞检测的过程中,通常会用到三种检测方法:矩形碰撞检测法、圆形碰36 5Android手机游戏“飞行战”的实现撞检测法和像素碰撞检测法。这三种碰撞检测方法已在第三章中详细论述过,这里就不再赘述,只重点阐述本游戏中碰撞检测方法的应用和实现。首先要确定碰撞检测对象,本游戏中的玩家飞机和敌机都需要碰撞检测,玩家飞机需要检测和敌机的碰撞、和敌机子弹的碰撞以及和道具的碰撞,然后根据碰撞检测结果做相应的处理;敌机需要检测和玩家子弹的碰撞,发生碰撞后敌机生命值减一,生命值为零时将在屏幕上消失。这里重点阐述玩家飞机的碰撞检测。玩家飞机的碰撞检测方法被封装到游戏的玩家飞机类Plane中。Plane类主要封装了玩家飞机的相关信息以及飞机打子弹方法、碰撞检测方法等。Plane类的框架结构和主要方法如下所示。publicclassPlane{publicPlane(intx,inty,inttype,intdir,intlife,GameViewgameView){}publicvoidinitBitmap(){}publicvoiddraw(Canvascanvas){}publicvoidfire(){}publicbooleancontain(Bulletb){}publicbooleancontain(EnemyPlaneep){}publicbooleancontain(ChangeBulletcb){}publicbooleancontain(Lifel){}privatebooleanisContain(intotherX,intotherY,intotherWidth,intotherHeight){}}其中publicPlane()为Plane类的构造器;initBitmap()方法为图片初始化方法,用来初始化玩家飞机的图片;draw()为玩家飞机的绘制方法,根据玩家飞机的飞行状态可绘制朝不同方向飞行的玩家飞机图片;fire()为玩家飞机发射子弹的方法;contain(Bulletb)为玩家飞机与子弹的碰撞检测方法;contain(EnemyPlaneep)为玩家飞机与敌人飞机的碰撞检测方法;contain(ChangeBulletcb)为玩家飞机与换子弹道具的碰撞检测方法;37 西安科技大学硕士学位论文contain(Lifel)为玩家飞机与补血道具的碰撞检测方法;isContain()为判断两个矩形碰撞检测的方法。下面主要讲述isContain()方法的实现。考虑到飞机、道具和子弹的形状都近似于矩形,以及手机硬件资源的有限性和动作射击类游戏对运行流畅性要求很高的特点,这里我们选择了前述三种方法中算法复杂度最低,检测速度最快的方法——矩形检测方法。下面是该检测方法的算法:(1)取两个矩形实体的左上角坐标(x1,y1)和(x2,y2)以及二者的宽度w1、w2和高度h1、h2。(2)判断是否x1=xx&&xd<=xx+width-1&&yd>=yx&&yd<=yx+height-1){//首先判断两个矩形是否重叠doubleDwidth=width-xd+xx;//两矩形重叠区域宽度doubleDheight=height-yd+yx;//两矩形重叠区域高度if(Dwidth*Dheight/(otherWidth*otherHeight)>=0.20)//重叠面积超过矩形框面积的20%则判定为碰撞returntrue;}38 5Android手机游戏“飞行战”的实现contain(Bulletb)、contain(EnemyPlaneep)、contain(ChangeBulletcb)、contain(Lifel)四个方法分别实现玩家飞机和敌机子弹、和敌机、和换子弹道具、和换枪道具的碰撞检测,都需调用之前创建的isContain()方法,并需对发生碰撞的情况做碰撞后的处理。在本游戏开发中,重点实现了碰撞到敌机和敌机子弹后发生的爆炸效果和爆炸音效。爆炸效果即为播放一段爆炸的动画,在第三章中已经给出了爆炸效果动画的实验,这里不再赘述。爆炸音效的实现将在后面的声音播放模块中具体讲述。5.3.3敌机BOSS人工智能的实现当到关口时,会遇到敌机BOSS,为了提高游戏的难度,增加其可玩性,这里给敌机BOSS增加了游戏人工智能。人工智能(简称AI)是一门综合性学科,旨在研究如何利用计算机等现代化工具来模仿人类的智能行为。游戏人工智能(简称游戏AI)可以理解为所有由计算机在游戏中所做的“思考”,它使得游戏表现出与人的智能行为、活动相类似,或者与玩家的思维、感知相符合的特性。在手机游戏的设计和开发中应用人工智能技术,可以提高游戏的可玩[32]性,改善游戏开发的过程,甚至会改变游戏的制作方式。对于非玩家智能角色,首先要有一个和它关联的控制器,该控制器如同角色的“大脑”,其输入是游戏世界的状态信息,其输出是影响游戏世界并导致非玩家角色相应行为的动作选择。大部分玩家并不关心是何种内在机制产生了非玩家角色的外表、运动以及行为,他们仅仅关心最终结果。人们关注非玩家角色的行为,在于考虑非玩家角色行为是否表现“合理”。这里所定义的“合理性”是指:非玩家角色的行为是否与其目的相吻合,包括其目的本身的合理性。非玩家角色的最终目的是为了玩家取得娱乐效果,但这个目的一般是无法直接写入非玩家角色的控制器程序中的。因而,非玩家角色的控[33]-[34]制器大多被设定去执行一些简单的任务。在本游戏中,敌机BOSS作为一个非玩家智能角色,设计的目的是让它可以感知到玩家飞机的位置,从而跟踪玩家飞机移动。对于敌机BOSS的设计,首先应使它具备感知玩家飞机位置的能力,这里通过设计一个线程BossThread,此线程每隔一定时间便能读取玩家飞机此时刻的位置坐标,并把此位置坐标传给敌机BOSS的控制器。敌机控制器主要实现跟踪算法,从而使其向玩家飞机位置处移动。这里的跟踪算法是使跟踪者(敌机BOSS)的方向矢量与从跟踪者的中心到跟踪目标(玩家飞机)的中心所定义的方向矢量靠拢。下面重点描述该算法。敌机BOSS作为跟踪者(tracker)并有以下属性:Position:(tracker.x,tracker.y)Velocity:(tracker.xv,tracker.yv)玩家飞机作为被跟踪对象称作跟踪目标(target),有如下属性:39 西安科技大学硕士学位论文Position:(target.x,target.y)基于上面的定义,下面是调整跟踪者的速度向量的常用逻辑循环。(1)计算从跟踪者到跟踪目标的向量:TV=(tracker.x-target.x,tracker.y-target.y)=(tvx,tvy),规格化TV——也就是说(tvx,tvy)/Vector_Length(tvx,tvy)使得最大长度为1.0,记其为TV*。(2)调整跟踪者当前的速度向量,加上一个按rate比例缩放过的TV*。tracker.xv+=rate*tvx;tracker.yv+=rate*tvy;注意:当rate>1.0时,跟踪向量会合得更快,跟踪算法对目标跟踪得更紧密,并更快地修正目标的运动。(3)跟踪者的速度向量修改过之后,有可能向量的速度会溢出最大值,就是说,跟踪者一旦锁定了目标的方向,就会继续沿着该方向加速。所以,需要设置一个上界,让跟踪者的速度从某处慢下来。在本游戏中做了如下改进:tspeed=Vector_Length(tracker.xv,tracker.yv);if(tspeed>max_SPEED){tracker.xv*=0.5;tracker.yv*=0.5;}在本游戏中经测试最终选择的边界值为0.5。如果追求完美,甚至可以计算出确切的[35]溢出,并从向量中缩去相应的数量。5.4数据存储模块的实现此模块由两部分组成,一部分通过一个常量类Constant来封装游戏中用到所有常量,这些常量在游戏中经常需要用到,主要包括:屏幕宽度、屏幕高度、背景图片数量、游戏中所用到的方向常量以及玩家飞机的生命值等。第二部分通过地图类Maps来存储所有敌机以及道具的飞行路线。所有敌机和道具的飞行路线是通过提前在地图上标注的方法实现的,首先就要定义这些敌机和道具的飞行路径,在实现时需要定义路径中所有点的x坐标、y坐标、还有当前点到下一点之间所走的步数。然后创建相应的方法:getBullet()、getLife()、getEnemey()来分别为相应的关卡添加换子弹道具、补血道具和敌机的飞行路线。40 5Android手机游戏“飞行战”的实现5.5图形界面模块的实现图形的绘制对于游戏来说最为重要,游戏的核心便是不断的绘图。它的基本行为与电影的行为相似。回想一下电影,电影由一幅幅连续记录的画面组成,“一帧”代表了一副画面。在电影播放时,一帧帧画面按照一定的速度放映到屏幕上,就形成了流动的画面。如同电影一样,游戏也是视觉艺术,同样要表现运动的画面。不同的是,游戏同时也是交互艺术,游戏中的世界要根据玩家的不同选择给予不同的响应。因此,游戏在初始化后,大体上就是一个一边处理用户输入,一边按照一定的规则绘制画面的过程。[36]同电影一样,游戏也要保持一定的渲染速度,使游戏的画面运动起来。在本游戏中,各个界面的绘图以及图像的刷帧主要是通过各个界面的视图类来实现。根据游戏的需要,这里实现的视图类有WelcomeView、HelpView、ProcessView、GameView、WinView以及FailView,分别用来实现欢迎界面、游戏说明界面、加载界面、游戏界面、胜利界面以及失败界面。这些类都继承自SurfaceView类,关于SurfaceView类和View类的区别以及使用在第三章中已叙述过。这里重点强调这两个类最本质的区别在于:SurfaceView是在一个新起的单独线程中,可以重新绘制画面。而View必须在UI的主线程中更新画面。因此,对于需要按一定的帧频率不停的刷新界面的动作类游戏,为了不阻碍UI的主线程,这里需使用SurfaceView类。另外SurfaceView还采用了双缓冲技术,双缓冲技术将要处理的图片都在内存中处理好之后,再将其显示到屏幕上,这样显示出来的总是完整的图片,并且避免出现闪烁现象(具体实现过程在前面已做讲述,这里不再赘述)。使用SurfaceView的时候,一般情况下要对其进行创建,销毁,改变时的情况进行监视,这就要用到SurfaceHolder.Callback。下面是SurfaceHolder.Callback接口中需要实现的方法。classXxxViewextendsSurfaceViewimplementsSurfaceHolder.Callback{publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){}//看其名知其义,在surface的大小发生改变时激发。publicvoidsurfaceCreated(SurfaceHolderholder){}//同上,在创建时激发,一般在这里调用画图的线程。publicvoidsurfaceDestroyed(SurfaceHolderholder){}//同上,在销毁时激发,一般在这里将画图的线程停止、释放。}下面将介绍游戏主要界面的实现,其中在实现欢迎界面时,为了实现欢迎动画的动画效果,将通过一个线程类WelcomeTweenThread类配合WelcomeView类来实现;而在实现游戏界面时,为了实现背景的横屏滚动,也将通过一个线程类GameViewBackGroundThread类配合GameView类来实现。41 西安科技大学硕士学位论文5.5.1欢迎界面和菜单界面的实现欢迎界面和菜单界面是通过WelcomeView类实现的。该类继承自SurfaceView类,采用双缓冲机制进行绘图。它可以控制表面的格式,比如大小,显示在屏幕中的位置,最关键是的提供了SurfaceHolder类,使用getHolder方法获取。在用WelcomeView绘制之前必须使用lockCanvas()方法锁定画布,并得到画布,然后在画布上绘制;当绘制完成后,需要使用unlockCanvasAndPost方法来解锁画布,于是才能显示在屏幕上。在WelcomeView类中,publicWelcomeView(MainActivityactivity){}是此类的构造器,主要用来初始化刷帧线程、动画线程、以及初始化图片和声音资源,onDraw()方法主要用来绘制屏幕,按次序分别绘制背景图片、欢迎动画以及菜单界面。onTouchEvent()方法为屏幕的监听方法,该方法通过玩家单击位置的坐标判断出玩家单击的是菜单界面的什么按钮,并根据单击的按钮向Activity的Handler发送消息。这里还定义了内部类TutorialThread,此类为刷帧线程,该类中的run()方法每隔一定时间便调用一次WelcomeView中的onDraw()方法绘制界面。这里的刷帧频率设置为10帧/秒,经测试显示效果良好。为了实现欢迎界面的动画效果,这里设计了WelcomeTweenThread类。下来便介绍下WelcomeTweenThread类的实现。此类继承自Thread类,重写了Thread类里的run()方法。其run()方法的代码如下:publicvoidrun(){while(flag){if(welcomeView.status==1){welcomeView.backgroundY+=8;if(welcomeView.backgroundY>80){welcomeView.status=2;}}elseif(welcomeView.status==2){welcomeView.k++;if(welcomeView.k==11){welcomeView.status=3;}}elseif(welcomeView.status==3){welcomeView.background2Y-=2;42 5Android手机游戏“飞行战”的实现welcomeView.alpha-=2;if(welcomeView.alpha<125){welcomeView.alpha=125;}if(welcomeView.background2Y<-90){welcomeView.status=4;}}try{Thread.sleep(span);//睡眠制定毫秒数}catch(Exceptione){e.printStackTrace();//打印异常信息}}}分析其代码,这里主要控制welcomeView.status值的变化,当其值为1时,结合WelcomeView类里的onDraw()方法,绘制背景图片,然后移动背景图片,当背景图片移动到位时,welcomeView.status值变为2,此时welcomeView.k++,从而控制WelcomeView类里的onDraw()方法,达到换帧的作用,生成欢迎界面的动画效果。welcomeView.status的值继续变化,进而绘制出菜单界面。5.5.2游戏界面的实现首先介绍游戏界面的运行思路,GameView在初始化时会从Maps类中读取当前关卡的地图信息,包括敌机、补血道具、换子弹道具等等。在界面初始化的同时,还需要启动MoveThread线程、GameViewBackGroundThread线程、KeyThread线程以及ExplodeThread线程。然后GameView会在适当的时候从Plane类中读取飞机的信息进行绘制。当主战飞机发射子弹时,会创建Bullet对象并添加到指定的容器中,此时需要MoveThread定时来改变子弹对象的位置。以上的所有过程,都需要MainActivity的管理以及常量类Constant的参与。GameView同样继承自SurfaceView类,其关键也是实现onDraw()方法。onDraw()方法分别绘制游戏界面的滚动背景、玩家飞机、敌人飞机、敌人飞机子弹以及各种道具,并对存放所有我方子弹的容器进行循环,分别进行绘制。游戏界面对刷帧频率要求较高,如果设置太低,画面将延迟,动作不连续,但也不宜设置太高,因为考虑手机硬件资源43 西安科技大学硕士学位论文的有限性,刷帧频率过高的话会占用手机过大的内存,从而影响游戏的正常运行。这里的刷帧频率设置为15帧/秒,经测试,效果良好。这里重点描述游戏界面横屏滚动背景的实现,在手机游戏中,考虑到手机的性能,制作滚动游戏背景时需要灵活选择合适的绘制技术。由于动作射击类游戏的场景一般都大于手机屏幕的尺寸,为了有效降低图片资源对手机内存的占用,通常不直接使用整张图片作为游戏的背景,而是通过几张小图片“拼接”的方式,这种方式不但可以组合出所需背景地图,还能有效的提高图片资源的使用效率。在这里是通过选用一整幅图片,将大的背景图片分割成许多小的背景图片存放在图片数组里,此时根据当前位于屏幕中央的核心图片的标号的值、小图片的宽度以及屏幕的宽度计算出核心图片左边有多少幅小图片以及右边有多少幅小图片,并分别从数组中取出图片绘制。这里为了实现横屏滚动技术,创建了一个专门负责背景滚动的线程类GameViewBackGroundThread,此类继承自Thread类,重点实现了Thread类中的run()方法。其中实现横屏滚动的关键代码如下所示:while(flag){if(gameView.status==1){gameView.backGroundIX-=span;if(gameView.backGroundIX<-ConstantUtil.pictureWidth){gameView.i=(gameView.i+1)%ConstantUtil.pictureCount;gameView.backGroundIX+=ConstantUtil.pictureWidth;}这里通过gameView.backGroundIX-=span来移动背景图片,当滚动过远时再将坐标置回初始值。5.5.3加载界面进度条技术的实现加载界面主要实现进度条技术,在载入的资源过大时,将会出现用户需要长时间等待的情况,这时界面会出现停滞,用户以为程序不响应或是死机了,这就需要提示用户资源的载入情况,表明程序正在进行比较费时的操作。进度条的实现是基于多线程的思想。程序的主线程进行进度条的绘制工作,再开辟一个线程同步进行资源的载入,两个线程同时运行,当资源载入结束时,通知进度条主线程结束。图5.5对进度条技术的实现流程加以描述。该流程完整地展示了在手机载入游戏资源时,进度条与资源载入同步进行的过程。44 5Android手机游戏“飞行战”的实现图5.5进度条技术实现流程图5.5.4其他图形界面的实现除了游戏中的欢迎和菜单界面、游戏界面以及加载界面外,游戏说明界面、胜利界面和失败界面分别由HelpView、WinView和FailView来实现。它们的实现方法和上面叙述的欢迎界面和游戏界面的实现方法类似。都是通过其中的onDraw()方法来绘制界面,其中也都包括刷帧线程,只是刷帧线程设置的刷帧频率有所不同。5.6声音播放模块的实现音效在游戏开发中也占据着重要地位,好的音效能让玩家更加融入游戏的世界。游戏中的音效一般分为如下几类:背景音乐、剧情音乐、音效(动作的音效、使用道具音效、辅助音效)等。背景音乐一般需要一直播放,而剧情音乐只需要在剧情需要的时候播放,音效则是很短小的一段,如爆炸声等等。在本游戏的开发中,为游戏开始时的欢迎动画加入了背景音乐,并且在游戏过程中增加了一些音效(发射子弹音效、遭遇碰撞的爆炸音效)。Android平台中关于音频的播放有两种方式,一种是SoundPool,一种是MediaPlayer。45 西安科技大学硕士学位论文SoundPool最大只能申请1M的内存空间,这就意味着它只能使用一些很短的声音片段,而不能用它来播放歌曲或者游戏背景音乐。MediaPlayer资源占用量较高、延迟时间较长、不支持多个音频同时播放等。这决定了MediaPlayer不适合在对时间精准度要求相对较高的游戏场景开发中使用。在本游戏的开发中,对于欢迎界面的背景音乐采用了MediaPlayer,而对游戏中的音效采用了SoundPool。在开发前,首先要在res目录下创建名为raw的文件夹,将选好的声音资源全部放进该文件夹。在选用音频文件时,首先选用的是WAV格式的音频文件,经反复测试,在音效播放间隔较短的情况下会出现异常关闭的情况,后来通过格式转换器把WAV格式的音频文件转成OGG格式,问题得到了解决。使用MediaPlayer时,需要首先使用creat()方法创建一个MediaPlayer实例,然后便可调用MediaPlayer类中的方法来播放音乐。本游戏中通过MediaPlayer播放欢迎界面背景音乐的关键代码如下所示:MediaPlayerbj=MediaPlayer.creat(this,R.raw.welcome);bj.setLooping(true);try{bj.prepare();}catch(IllegalStateExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}bj.start();下来说明SoundPool在本游戏开发中的使用。SoundPool在本游戏中用来播放游戏过程中的爆炸声和飞机发射子弹的声音。SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作。在使用时,首先创建一个SoundPool实例,soundPool=newSoundPool(4,AudioManager.STREAM_MUSIC,100);这里创建了一个最多支持4个流同时播放的,类型标记为音乐的SoundPool。然后要把多个声音放到HashMap中去。代码如下:soundPoolMap=newHashMap();46 5Android手机游戏“飞行战”的实现soundPoolMap.put(1,soundPool.load(getContext(),R.raw.bulletsound1,1));soundPoolMap.put(2,soundPool.load(getContext(),R.raw.explode,1));这里把加载了发射子弹的声音和爆炸音,并放到了HashMap中,当飞机发射子弹和发生爆炸时,将调用soundPool.play来播放相应的声音。5.7短信付费模块的实现手机游戏的付费方式多种多样,但最常见的方式就是通过向手机运营商发送短信,然后手机运营商扣除一定费用。本游戏的此模块就是对这种短信付费方式的模拟实现。此模块是通过SmsActivity类来实现的,此类继承自Activity类。在开发短信付费模块时,将控制和界面分开,控制部分用Java语言实现,界面设计部分用XML语言来实现。在前面生成游戏的各种界面时,我们都是通过Java代码,调用onDraw()方法来实现。而此模块的界面设计通过在XML中的定义来生成。下面就先来介绍下用XML语言实现界面设计。AndroidSDK中包含有一个android.view的Java包,该包含有绘制用户界面的相关类和接口。在应用程序设计中使用到最多的是View与ViewGroup这两个类,这两个类都属于View类的子类,其中View是android.view.View基础类的对象,Viewgroup是android.view.Viewgroup类的对象。一个View通常占用屏幕上的一个矩形区域,并负责绘图及事件处理。View是所有窗体部件的基类,是为窗体部件服务的,这里的窗体部件即UI控件,如登陆界面的按钮或文本框等。作为一个基类,View为界面组件服务,界面组件是一组用于绘制交互屏幕元素的完全实现子类。可以使用组件快速的构建UI,提高界面编程效率。Viewgroup是特殊的View对象,其功能是去装载和管理一组下层的View和其他ViewGroup,ViewGroup可以为UI增加结构,并将复杂的屏幕元素构成一个独立的实体。作为一个基类,ViewGroup为Layout服务,Layout是一组提供用户界面通用类型的完全实现类。Layout可以为一组View构建一个结构。ViewGroup中,还定义了一个嵌套类ViewGroup.LayoutParams。这个类定义了一个显示对象的位置、大小等属性,View通过LayoutParams中的这些属性值来告诉父级,它们将如何放置。其中继承于ViewGroup的一些主要的布局类有:LinearLayout:线性布局;RelativeLayout:相对布局;AbsoluteLayout:绝对布局;TableLayout:表格布局;FrameLayout:帧布局。在Android平台中,用View和ViewGroup节点来定义一个Activity的UI。这个树可根据需求来简单或者复杂化,并且可以使用Android的预定义Widget和Layout或者自定义的47 西安科技大学硕士学位论文View类型来构建UI。通过View和ViewGroup的组合可以实现许多更复杂、更完美、更满足用户需要的界面。View和ViewGroup的组合布局如图5.6所示。图5.6View和ViewGroup组合布局Android应用程序的基础功能单元就是Activity类中的一个对象。一个Activity可以做很多事,比如界面显示、事件处理等,但是Activity本身并不会显示到屏幕上,需要使用View和ViewGroup控件配以XML样式来完成用户界面的显示。在设计此模块的界面前,首先要在工程目录下的res/layout文件夹下建立了sms.xml文件,用来绘制短信付费界面。然后再创建SmsActivity类,其SmsActivity类中关键的实现代码如下。privateclassOnButtonClickListener1implementsView.OnClickListener{publicvoidonClick(Viewv){inti=5556;Stringnumber=String.valueOf(i);SmsManagersmsManager=SmsManager.getDefault();ArrayListmsgs=smsManager.divideMessage("havepaid");for(Stringmsg:msgs){smsManager.sendTextMessage(number,null,msg,null,null);}Toast.makeText(MainActivity.this,R.string.success,Toast.LENGTH_LONG).show();}}privateclassOnButtonClickListener2implementsView.OnClickListener{publicvoidonClick(Viewv){MainActivity.this.finish();48 5Android手机游戏“飞行战”的实现}}5.8游戏测试和运行5.8.1游戏测试概述当游戏软件制作完成之后,为了验证本游戏是否存在缺陷、能否达到预期的设计目标,我们还需要在预设环境(如:模拟环境或真实移动终端设备)中进行调试和运行,以发现游戏中可能存在的问题和不足、解决这些缺陷,从而完善软件功能并进而提升产品质量。作为软件测试的重要组成部分,游戏测试具备软件测试的一切共同特性,但由于游戏本身又具有一定的特殊性,因而游戏测试主要由两个部分组成:(1)传统的软件测试由于测试是软件开发过程中极为重要的组成部分,因而针对软件本身的测试贯穿于软件存在的整个生命周期。首先,程序员需要在程序设计开发过程中按阶段对产生的模块集中测试,以保证系统各模块能实现各自的功能,在此阶段软件的测试一般主要集中在程序的细节部分。当软件制作开发出来之后,为保证软件整体的完善性,还需要在软件工程理论的指导下对整个系统进行测试,这阶段的测试主要有黑盒测试和白盒测试。所谓黑盒测试就是把要测试的对象当作一个黑盒子,不需要知道里面是怎么处理的,只要对输入和输出数据进行测试,这种测试方案属于高端测试,主要是在操作层面对游戏进行测试;而白盒测试正好相反,基于白盒测试的测试方案属于低端测试,是对各种设计细节方面的测[37]试,测试者必须对测试对象的内部处理过程非常了解,对里面所有的分支和循环进行实验从而达到测试的目的。在进行软件测试的过程中,测试人员应根据需要把墨盒和白盒测试有效的结合,以达到发现软件错误并进而完善软件的目的。(2)对游戏性的测试由于游戏特别是在很大程度上是对现实世界的一种模拟,因而它不但包含了人类社会的一部分特性,同时还涉及娱乐性、可玩性等独有特点,所以针对游戏的测试还包括三个部分:①游戏情节的测试:主要是针对体现游戏主线的故事情节和游戏世界中的任务系统等进行测试。②游戏世界的平衡测试:平衡性主要体现在经济平衡、能力平衡(包含技能、属性等等),测试的目的是为了能保证游戏世界的公平竞争。49 西安科技大学硕士学位论文③游戏文化的测试:比如整个游戏世界的风格,是中国文化主导,还是日韩风格等等,大到游戏整体,小到NPC对话,比如一个书生,他的对话就必需斯文,不可以用江湖语言。目前在游戏开发过程中,对游戏性的测试主要有以下几种实现途径:一是通过内部测试人员对以下的三个方面进行测试,由于他们往往都是经过精选而来的职业玩家,对游戏有很深的认识,因而也能较好完成游戏的测试目标;二是邀请一定数量的玩家或游戏媒体人员对外围系统进行测试,其目的主要是测试游戏的可玩性和易用性,及一些外[38]围的Bug;三是通过大范围的内测和公测,让更多的玩家进行试玩。5.8.2测试环境本游戏的测试环境包括两种,一种是基于Android虚拟设备AVD的测试,在测试之前,首先要创建一个AVD。图5.7是创建的AVD。图5.7AVDManager所创建的AVD截图这里创建了三个AVD,在测试游戏时选用的是基于Android2.2的AVD。还有一种便是基于Android手机的测试,在测试之前,需要首先将游戏文件夹下的bin目录下的游戏的apk文件通过数据线传到Android手机上,然后通过Android手机上的第三方文件浏览器找到需要安装的apk文件,即可安装。本人在基于Android手机的测试时,选用的手机为HTCG3,HTCG3的主要参数为:主屏尺寸:3.2英寸;主屏色彩:彩屏,26万色;主屏像素:320×480像素(HVGA);CPU:QualcommMSM7200A528MHz;内存容量:288MBRAM,512MBROM;系统平台:Android2.2,可升级至更高版本。5.8.3游戏运行结果在测试本游戏时,需要首先把游戏的apk文件下载到Android手机上并安装,安装通过文件浏览器查找到本游戏的apk文件,然后双击即可安装。图5.8所示是其安装过程。50 5Android手机游戏“飞行战”的实现(a)(b)(c)图5.8游戏安装过程安装好本游戏的apk文件后,在主菜单里就可以显示本游戏的图标,如图5.9所示。图5.9Android手机主菜单截屏点击plane图标,接下来将启动游戏,并相继进入欢迎界面和菜单界面,图5.10是游戏的菜单界面。图5.10游戏菜单界面截屏51 西安科技大学硕士学位论文点击游戏说明,将进入游戏的说明界面。说明界面如图5.11所示。图5.11游戏说明界面截屏退出游戏说明界面后,在菜单界面点击开始游戏,将首先进入游戏加载界面,之后便进入游戏界面,可以开始玩游戏了。图5.12和图5.13分别是加载界面和游戏界面。图5.12游戏加载界面截屏图5.13游戏界面截屏52 5Android手机游戏“飞行战”的实现上面分别是加载界面和游戏界面,加载界面中通过进度条来显示加载的进度。进入游戏,按A键,飞机正常发射子弹;按上、下、左、右键,飞机分别向上、下、左、右移动。飞机若吃到补血道具,在生命值不满的情况下将加一;吃到换子弹道具时,发射的子弹会发生变化。若撞到敌机或敌机子弹,生命值会减一,当生命值减小到零时,游戏失败,进入失败界面。图5.14为游戏的失败界面。图5.14游戏失败界面截屏这时,点击重新游戏将重新开始游戏,点击退出游戏按钮将直接退出游戏。当顺利通过本关时,将进入游戏的胜利界面。图5.15为游戏的胜利界面。点击退出游戏按钮将直接退出游戏,点击继续游戏将进入游戏的短信付费模块。图5.16为短信付费界面。图5.15游戏胜利界面截屏53 西安科技大学硕士学位论文图5.16短信付费界面截屏在短信付费界面中,如果玩家想继续游戏,必须向服务器发送短信,从而收取玩家一定的费用。在这里,玩家如果点击“是”,便发送短信付费,如果发送成功,将会提示玩家付费成功,从而可以继续下一关的游戏。如果玩家不想付费,只能点击否,将直接退出游戏。图5.17是玩家点击“是”付费成功后显示的画面。图5.17短信付费成功截屏上面给出了游戏的运行效果,在测试时,首先在Android模拟器AVD上测试游戏的运行流程。经测试,游戏运行流程符合预先设计的游戏总体流程,各个界面之间的切换都正确。还重点测试了游戏过程中各种功能的实现,经测试,玩家飞机能正常移动并发射子弹,在吃到道具后,玩家飞机的属性变化也正确。在遇到敌机BOSS时,敌机BOSS能感知到玩家飞机位置并始终向玩家飞机靠近,但游戏难度过高,很难打败敌机BOSS,最后对敌机BOSS的属性做了三处修改,第一修改了敌机BOSS的最大速度54 5Android手机游戏“飞行战”的实现max_SPEED,使其最大速度减小;第二减小了敌机BOSS的感知器读取玩家飞机坐标的频率,使其反应慢一些;第三减小了其生命值。经修改,能较为轻易的打败敌机BOSS。测试碰撞检测时,碰撞检测效果较好,只是对碰撞后的处理还较为粗糙,爆炸效果单一,真实感不强。在向手机移植后,对游戏的性能做测试,主要包括游戏画面显示和运行的稳定性测试。经测试,图片色彩正常,无偏色和缺色,比例适当,但画面不够流畅,有轻微停顿感,经修改刷帧频率,把游戏界面的刷帧频率从20帧/秒降为15帧/秒,再次在手机上运行后画面流畅。对稳定性测试,经试玩,无死机、花屏、非正常退出等非正常游戏状态出现。5.9本章小结本章是对Android手机游戏“飞行战”的开发实现。首先简要介绍了开发环境的搭建,然后分别叙述了各个模块的实现,其中主要介绍了最重要的控制调度模块、逻辑计算模块和图形界面模块,并重点叙述了关键技术的实现。在最后给出了游戏的测试环境和运行的结果。55 西安科技大学硕士学位论文6结论6.1总结本文首先介绍了Android操作系统,重点论述了Android操作系统的系统架构和应用程序构成,并分析了Android应用程序的生命周期。接着研究了Android平台上手机游戏开发的关键技术,包括Android游戏开发多线程技术,Android游戏开发图形处理技术和手机游戏开发中用到的碰撞检测技术。本文通过对Android游戏的研究,还提出了Android游戏开发的基本框架。在基于上述对Android游戏开发技术研究的基础上,最后设计实现了“飞行战”游戏。本游戏模仿PC机上经典的动作射击类游戏“雷电”,并把“雷电”游戏的竖屏滚动改为横屏滚动。在本文中,首先叙述了本游戏的总体功能架构,然后对各个功能模块的具体实现进行了详尽的介绍。并重点介绍了本游戏开发中用到的许多关键技术,主要包括Android游戏开发中通过Handler机制实现各个界面的控制调度,游戏开发中人工智能和碰撞检测的具体实现,通过地图类提前标注游戏中NPC的运动路线,Android游戏开发中通过SurfaceView双缓冲绘图机制来实现视图界面,加载界面进度条技术的设计实现等等。由于现阶段研究Android游戏开发的人数还很少,所有这些游戏开发关键技术基于Android平台的实现,为Android游戏开发提供了一定参考价值。6.2展望本课题最终实现的“飞行战”游戏是基于Android平台的2D单机游戏,由于课题时间仓促,人力资源有限,研究的深度还不够,现对今后进一步的工作做如下规划:(1)对于Android平台要继续深入研究和学习,一些关键技术的掌握和运用上还有待提高。(2)要更多的关注Android手机的发展趋势和市场前景,也继续关注Android游戏的发展前景和发展趋势。(3)本人只是完成了2D单机游戏的设计,下一步需要继续学习OpenGL,研究Android3D游戏的开发技术。还要进一步为游戏加入网络,实现“玩家排行榜”等功能。(4)需要进一步学习游戏中的物理学和游戏AI,学习游戏引擎的知识,研究Android游戏引擎的设计开发。56 致谢致谢本课题得以顺利完成,首先要向我的导师孙弋教授致以衷心的感谢!在研究生学习期间,孙老师一直对我孜孜教诲、严格要求,本文从选题、撰写、修改到定稿,孙老师都给予了精心指导和帮助。孙老师踏踏实实的工作作风、谦虚谨慎的治学态度、渊博的知识、不断创新的精神和耐心宽厚的师长风范,使我受益匪浅,也将是我今后的生活和事业发展中最宝贵的财富。这三年来,实验室的同门在工作和学习生活中给予了我很大的帮助,从他们身上我不仅学到了很多的知识和技能,还学会了很多为人处事的道理,在这里我向他们表示感谢。还要感谢信号与信息处理专业的所有同学,和他们在一起愉快的相处了三年,在各方面他们都给予了我帮助。还要深深感谢通信与信息工程学院各位老师在生活上的关心和学业上的帮助。感谢我的家人和我的朋友在学习和生活上给予我多方面的关心,他们的鼓励与支持,永远是我不断前进的动力。最后衷心的感谢在百忙之中评审本论文并提出宝贵意见的各位专家和教授。57 西安科技大学硕士学位论文参考文献[1]邸烁.Android揭秘和未来发展趋势.http://publish.itpub.net/zt/android/,2008[2]ContiJP.TheAndroidsarecoming.Engineering&Technology,2008,3(9):153~156[3]靳岩,姚尚朗.GoogleAndroid开发入门与实战.北京:人民邮电出版社,2009.5~7[4]张利国,代闻,龚海平.Android移动开发案例详解.北京:人民邮电出版社,2010.3~9[5]AndroidDevelopers.http://developer.android.com/[6]GoogleAndroidForum.http://www.androidl.net/[7]姚显昊,刘卫国.Android的架构和应用开发研究.计算机系统应用,2008,11(3):51~56[8]张波,高朝勤,杨越译著.GoogleAndroid基础教程.北京:人民邮电出版社,2009.6~8[9]韩超,梁泉.Android系统原理及开发要点详解.北京:电子工业出版社,2010.23~27[10]AndroidPorting.http://www.android123.com.cn/androidyizhi/[11]GoogleAndroidLoverForum.http://www.loveandroid.com/[12](美)罗杰等著,李耀亮译.Android应用开发.北京:人民邮电出版社,2010.55~58[13]ThompsonT.TheAndroidMobilePhonePlatform.TheWorldofSoftwareDevelopment,2008,33(9):77~80[14]胡昭民.游戏设计概论.北京:清华大学出版社,2008.95~99[15]张鹏.JAVA手机游戏50例.北京:海洋出版社,2007.15~28[16]施铮.J2ME无线移动游戏开发.北京:人民游戏出版社,2006.49~53[17]杨丰盛.Android应用开发揭秘.北京:机械工业出版社,2010.110~117[18]结城浩.Java多线程设计模式.北京:中国铁道出版社,2005.38~51[19]王森.Java手机程序设计入门.北京:电子工业出版社,2004.9~11[20]郭宏志.Android应用开发详解.北京:电子工业出版社,2010.238~250[21]吴湛微,孔繁强.计算机动画基础.上海:上海交通大学出版社,2008.59~97[22]杨文志.GoogleAndroid程序设计指南.北京:电子工业出版社,2009.211~215[23]余志龙等.GoogleAndroidSDK开发范例大全.北京:人民邮电出版社,2009.370~382[24]于晓霞.碰撞检测技术在游戏中的应用与实现:[学位论文].太原:太原理工大学,2007[25]DavidM.Bourg.PhysicsforGameDevelopers.O’ReillyAssociates,Sebastopol,58 参考文献CA.2001.101~175[26]艾萱.基于J2ME的手机游戏开发——雷电风暴:[学位论文].济南:山东大学,2009[27](美)席尔瓦著,王恒等译.精通Android游戏开发.北京:人民游戏出版社,2011.112~118[28]张利国,龚海平,王植萌.Android移动开发入门与进阶.北京:人民邮电出版社,2009.39~42[29]LaurenDarcey,ShaneConder.AndroidWirelessApplicationDevelopment.Addison-WesleyProfessional,2009.210~213[30]DanielSanchez-CrespoDalmau,邱仲潘译.游戏核心算法编程内幕.北京:北京希望电子出版社,2004.27~33[31]杨传亿.基于移动设备的教育游戏的设计与开发.[学位论文].上海:华东师范大学,2010[32]方约翰著,李睿凡等译.游戏人工智能——计算机游戏中的人工智能.北京:北京邮电大学出版社,2007.5~11[33](美)布金,西曼著,OReillyTaiwan公司译.游戏开发中的人工智能.南京:东南大学出版社,2006.7~59[34]WoodcodkSteven.GameAI:TheStateofIndustry:It’sNotJustArt,It’sEngineering.GameDevelopermagazine,August2001,11(2):203~207[35]付朝晖等.游戏编程中的寻路算法研究.湖南工业大学学报,2007,7(5):38~41[36]詹建飞.J2ME开发精解.北京:电子工业出版社,2006.162~188[37](美)佩腾著,张小松等译.软件测试.北京:机械工业出版社,2006.3~26[38]赵剑平等.电脑游戏设计教程.北京:清华大学出版社,2007.11~87[39]EricLengyel.Mathematicsfor2DGameProgramming&ComputerGraphics.CharlesRiverMediaPublicers,2005.220~227[40]SunMicroSystems.Java2PlatformMicroEdition(J2ME).http://java.sun.com/j2me/,2004.[41]Huizinga.TheartofgameForeignLanguage.TeachingandResearchPress,2000.5~130[42]顾晓刚,谢义军,林锐.高质量Java程序设计.北京:电子工业出版社,2003.2~57[43]AlexJ.Champandard.AIGameDevelopment.NewRiders,Indianapolis,IN,2003.5~109[44]BruceEckel.ThinkinginJava.北京:机械工业出版社,2002.2~481[45](美)韦斯著,冯瞬玺译.数据结构与算法分析Java语言描述.北京:机械工业出版社,2009.3~11959 基于Android平台的手机游戏的设计与实现作者:崔浩然学位授予单位:西安科技大学本文链接:http://d.g.wanfangdata.com.cn/Thesis_D155963.aspx

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
大家都在看
近期热门
关闭