• 3.55 MB
  • 2022-04-22 13:37:17 发布

基于安卓平台的飞机大战游戏毕业设计.doc

  • 50页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'基于安卓平台的飞机大战游戏毕业设计目录第1章绪论11.1系统研究的背景及意义11.2国内外的发展现状11.3主要研究的内容21.4本文的组织结构21.5本章小结3第2章用户需求分析42.1系统的架构描述42.2系友好的用户界面52.3技术选型62.4系统的开发环境62.5关键技术和工具简介72.6本章小节8第3章系统概要设计93.1模块的划分93.1.1软件模块设计93.1.2软件功能模块103.2主界面设计123.3游戏界面设计133.4系统包及其资源规划133.4.1系统包管理如下133.4.2Sqlite数据库143.4.3Runable接口以及与Thread的区别163.5本章小结20第4章系统功能的实现214.1主界面的功能实现214.1游戏界面的功能实现264.3子弹类的设计394.3敌机类的设计40II 4.5本章小结42第5章系统测试435.1软件测试的概念435.2系统的功能和安全测试435.3测试总结45第6章总结46致谢47参考文献48II第一章绪论1 第一章绪论第1章绪论1.1系统研究的背景及意义在手机游戏的早期,大多数开发者都是想要玩转设备、学习技巧和快速攻关的狂热分子。但是,随着更多的开发者加入这个行业,手机游戏已经进化成涉及到专业设计师、构造师、开发者、产品经销商、律师、和艺术家在内的主导产品。这是行业走向成熟的必然趋势。尽管在某人的业余时间内要开发和推销简单的游戏更加困难,但是更多的专业商店将为许多人提供更多的就业机会。从手机软件的平台的种类,游戏玩家的心理,未来移动通信服务终端的发展,3G手机网络对手机软件游戏的影响,还有从J2ME手机游戏开发平台介绍的手机游戏的趋势和未来这种游戏的运营模式,这几方面的内容来看,手机游戏是未来游戏发展的趋势,其移动性、互连性,必定会带来网络游戏的风暴,这就使我们对这一个新兴的领域有了一定的概念,对指导我们建立一个手机软件开发培训的知识结构有一定的帮助,也是我们的一个发展契机。本文基于Android系统设计一种轻松休闲的游戏软件,让用户可以使用手机轻松娱乐,因此项目研究和软件开发具有重要的实际应用价值。1.2国内外的发展现状手机游戏(MobileGame或WirelessGame),是指消费者利用随身携带并具有无线网络联机功能的智能移动终端设备,能随时随地来进行的游戏。手机游戏最大的特点是其随时随地进行游戏的便利性。这些年来,手机游戏市场有了很大的发展,手机游戏已成为使用率最高的手机娱乐应用,占到各种手机娱乐应用比例的78.4%。在日本,手机游戏市场经历多年的稳定增长,市场规模已经超过了850亿日元[1]。在美国,手机游戏作为美国手机用户最喜欢的移动应用之一,在iPhone和Android等智能终端推出后发展迅速。而在中国,根据易观智库产业数据库最新发布的《2010年第4季度中国手机游戏市场季度监测》数据显示,我国2010年手机游戏市场规模已达到32.9亿元,继续保持了较快的发展。2011年以来Android实现了计算机诞生以来最快速度的增长,目前Android以每天85万新增激活数的速度快速征服世界,成为世界范围内占有率最高的智能手机操作系统。根据comScore的统计,2012年第一季度Android在北美的市场占有率又增长了3.7%达到51%;而根据赛诺的调研报告,Android系统在中国47第一章绪论47 西安工程大学学士学位论文的市场份额高达74.7%,而Android游戏在诞生之处就被很多人看好,便宜的价格,小巧的外观,游戏资源丰富,相对于传统主机来说,这些都是Android游戏机的优点,于是一批Android游戏陆续出现了,但事实证明Android游戏并非当初描绘的那样美好,开放的Android开发平台,导致了游戏质量和数量不那么尽如人意,所以在游戏的设计与研发过程中游戏的质量关一定要把好。1.3主要研究的内容本设计项目主要完成一种基于Android开发的一款游戏软件。项目研究和软件设计遵循软件工程的方法,从需求分析,系统分析,概要设计,详细设计,软件编码调试,到验证测试,完成本软件整个过程的设计开发。项目研究和软件设计的具体任务包括:(1)加深面向对象编程思想,巩固Java语言的设计模式,掌握Android开发的环境搭建。(2)学习和研究Android平台环境和软件接口的设计。(3)学习和研究Android平台多线程。(4)学习和研究Android系统中用户界面的动态显示。(5)学习并掌握Sqlite数据库。(6)学习并掌握Android平台下动态游戏开发的重要知识点:SurfaceView。1.4本文的组织结构第1章绪论本章主要介绍了课题的研究背景,课题研究的目的与意义,以及该项目所在领域国内外发展状况等,最后指出了本文工作内容及论文的组织结构。第2章软件需求分析和技术介绍本章主要介绍了本系统的技术构架及课题的需求分析与说明,简单的介绍了项目应用的平台和开发环境,并解析了关键技术的含义。第3章系统概要设计本章是本文比较重要的章节,详细的划分了整个项目的开发模块,及各个模块的功能设计,最后对整个项目的包结构和项目资源路径做了简单的剖析和介绍。第4章系统功能的实现详细介绍开发流程,从建一个Android项目开始到最终完成软件开发的详细过程,介绍怎样检测飞机碰撞事件,怎样动态管理界面,怎样实现飞机飞行的效果。47 西安工程大学学士学位论文第5章系统测试详细介绍了测试的概念、目的和方法,并介绍如何利用Android自带的测试工具了系统测试。第6章总结。1.5本章小结详细介绍了Android游戏开发的国内外现状,以及本论文主要研究的方向和论文的整体结构,从本章中能够清楚的了解本论文的整体架构,对以后的各细节描述都有清晰的认识。47第2章用户需求分析47 第2章用户需求分析第2章用户需求分析2.1系统的架构描述本项目主要面向游戏爱好者,要求项目不会占用太大的资源,并能够尽量沿用原有的相对成熟的java技术,与Android系统进行良好的整合。本设计主要讲述了飞机大战游戏的基本功能和基于Android平台的软件开发、接口的设计方法。设计最终达成了开始游戏、关闭音效、查看得分、退出游戏等Android游戏的基本功能。并且系统能够正常运行,各个页面交互性较好。在整个设计中基本运用基础的Android进行功能编程,其中主要利用了SurfaceView实现了动态界面显示,实现了飞机飞行和发射子弹等效果。在系统规划中先后系统功能结构图分析了系统所需的各种数据,详细的展现了系统的各个功能模块并给出了主要功能运行界面图。该游戏软件目前已有比较完善的管理与使用功能。对学习和工作中的学生和工作人员在闲暇时间放松的好软件。本系统主要采用模型-视图-控制器MVC架构的设计模式。MVC架构是"Model-View-Controller"的缩写,中文翻译为"模型-视图-控制器"。MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者属性,所有依赖的View都会自动更新。类似的,只要Controller改变了View,View会从潜在的Model中获取数据来刷新自己。整个系统的物理架构如下:界面SurfaceVIe,模型为常用的子弹飞机类,Controller为SurfaceHolder.callback结构中的回调函数。本系统是应用Android平台,Android是一个移动设备的软件平台,由Linux+Java构成的开源软件,提供包括SDK、KeyApps、Middleware、LinuxKernel四个部分在内的全套手机软件方案。开放了基于Linux内核以上的开发工具,从而保证了内容的可移植性和多样性。Android平台为我们开发应用程序提供了一套很好的框架,我们可以在这个平台的基础上开发不同的应用程序,也可以开发新的组件供应用程序调用。Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的,本项目也是由java语言编写。开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用。任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件47 第2章用户需求分析。Android系统架构图如2-1图所示。47西安工程大学学士学位论文图2-1android系统架构图2.2友好的用户界面本游戏是直接面对用户的, 要求游戏能够提供良好的用户接口,易用的人机交互界面。要实现这一点,就要求软件应该尽量使用用户熟悉的术语和提示消息;针对用户可能出现的使用问题,要提供足够的提醒帮助功能,缩短用户对软件熟悉的过程。本项目采用Android平台,从Android的角度分析,Android的开发概括为两类:一是系统开发,包括底层Linux内核的裁剪和扩展、硬件驱动的开发和系统移植等,从业人员主要在工作在硬件厂商的公司里。47 西安工程大学学士学位论文二是应用开发,主要包括游戏开发、Android互联网客户端开发和工具软件开发。业内人士预言Android系统将成为手机操作系统领域的“windows”。一个好的功能强大系统,必须要进行完善而且全面的系统分析和友好设计。本项目中,之所以能够有计划地进行下去,的确也是缘于良好的系统分析,如若省略这一步直接编程,那难度必然加大,以至于在编程过程中又不得不回过头来进行系统分析,此时必然拖慢进度,打乱整个系统逻辑,其最终的成品也充满变数。本系统在性能功能上应达到如下需求:(1)操作简单、界面友好:完全控件式的页面布局。(2)游戏的安全性,正在游戏中对可能发生的突发事件做出处理,例如,电话来了,或者有信息等。(3)软件的响应速度要快,保证用户不会应为等待反馈时间过长而放弃本软件。(4)软件的可靠性,能够真正的带给游戏者乐趣。(5)在结构上应具有很好的可扩展性,便于将来的功能扩展和维护。根据以上功能,该系统主要以Android为操作平台,它提供了很大的自由空间,采用Java为开发语言,使系统开发更加方便快捷,本软件的目标即为成功、完整的体现该系统,让客户满意。2.3技术选型项目整体技术选型是这样的,飞机大战游戏开发过程中应用了java技术和AndroidSDK提供的类库,动态界面采用SurfaceView和一些XML文件-,后台控制使用了SurfaceHolder.callback接口的回调方法。常用的资源文件如子弹,和敌机,战机,背景图都通过ps自己处理,系统开始时就启动新线程,一直运行游戏,知道用户关闭为止。如下为整体流程图如下图2-2所示。2.4系统的开发环境2.4.1开发硬件要求硬件平台:PIVCPU,主频2.8G,内存2G,的PC机或PC服务器。操作系统:MicrosoftWindows72.4.2系统的软件开发环境集成开发环境:Eclipse3.6+JDK6.0+SDK2.1数据库:MySQL5.0编程语言:java47 西安工程大学学士学位论文开发模式:MVC模式音效资源文件surfaceCreatedR.java回调方法子弹,敌机类文件SurfaceHolderCallback接口SurfaceVIew界面图片资源文件图2-2技术选型模型图2.5关键技术和工具简介(1)IntentIntent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。(2)ADT与SDKADT为Android开发工具(AndroidDevelopmentTools)简称,是在强大的、集成的环境EclipseIDE中构建Android应用程序插件。ADT扩展了Eclipse的功能,让您快速建立新的Android项目,创建一个应用程序的用户界面,加上Android框架的API组件、调试应用程序使用AndroidSDK工具,以便APK分发给应用程序。SDK即SoftwareDevelopmentKit的缩写,中文即“软件开发工具包”。广义上指辅助开发某一类软件的相关文档、范例和工具的集合。它可以简单的为某个程序设计语言提供应用程序接口API的一些文件,但也可能包括能与某种嵌入式系统通讯的复杂的硬件。(3)SQLite数据库47 西安工程大学学士学位论文SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。至今已经有14个年头,SQLite也迎来了一个版本SQLite3已经发布。(4)ActivityActivity是Android开发中非常重要的一个基础类。Activity提供了和用户交互的可视化界面,创建一个Activity一般是继承Activity类,并覆盖Activity的onCreate()方法。(5)Eclipse与JDKEclipse是一个集成开发环境简称“IDE”,在Eclipse环境下开发JAVA程序可以大大提高效率,它提供的核心框架和可扩展的插件机制给广大的程序员提供了无限的便捷。JDK(JavaDevelopmentKit)是SunMicrosystems针对Java开发人员的产品,JDK是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。JDK是学好Java的第一步。(6)SurfaceViewSurfaceView由于可以直接从内存或者DMA等硬件接口取得图像数据,因此是个非常重要的绘图容器,这次我就用两篇文章来介绍SurfaceView的用法。网上介绍SurfaceView的用法有很多,写法也层出不同,例如继承SurfaceView类,或者继承SurfaceHolder.Callback类等,这个可以根据功能实际需要自己选择,我这里就直接在普通的用户界面调用SurfaceHolder的lockCanvas和unlockCanvasAndPost。2.6本章小节本章主要介绍了本系统的技术构架及在实际开发中的用户需求分析,简单的介绍了项目应用的平台和开发环境,并介绍了关键技术的含义。47 第3章系统概要设计第3章系统概要设计系统的概要设计主要是针对系统的总体功能如何设计,如何划分模块,系统的数据库如何设计进行研究。它为系统的详细设计做铺垫。在系统的设计过程中起着非常重要的作用。系统设计是信息开发过程中的另一个重要阶段,在这一阶段中将根据前一阶段逻辑分析的结果,在系统分析报告的基础上,按照逻辑模型的要求,科学合理地进行新系统的设计。系统设计包含两个方面:首先是总体结构设计,其次是具体物理模型的设计。这个阶段的主要目标是将反映用户信息需求的系统逻辑方案转换成可以实施的基于计算机的物理方案,并为下一阶段的系统实施提供必要的技术资料。本系统采用结构化设计的方法来实现系统总体功能,提高系统的各项指标,即将整个系统合理的划分成各个功能模块,正确地处理模块之间和模块内部的联系以及它们之间的调用关系和数据联系,定义各模块的内部结构,通过对模块的设计和模块之间关系的系统来实现整个系统的功能。3.1模块的划分本系统整体划分为三个模块,分别为主界面,即Android游戏软件登录界面,游戏模块,游戏运行中的界面模块,用来处理用户触摸响应,还有得分统计模块,用来存储获的分数。3.1.1软件模块设计用户界面是使用者最直接接触的东西,包括是否能够让客户很轻松、方便的使用,操作响应时间、主机连接时间、图片综合质量、首页布局质量、首页信息类型等。一般来说,一个界面主要由下面几个因素构成:(1)文字:文字元素是信息传达的主体部分。界面中的文字主要包括标题、信息、文字链接几种主要形式。标题和传统媒体中信息传达的基本作用相同,是内容的简概说明,一般比较醒目、优先编排。文字作为占据页面重要比率的元素,同时又是信息重要载体,它的字体、大小、颜色和排布对页面整体设计影响极大。(2)图形:图形在界面中具有重要作用。合理的运用图形,可以生动直观、形象地表现设计主题。网页中常用的图形格式包括jpg和png,这两种格式压缩比高,得到了Android平台的支持,图形元素包括标题、背景、主图、链接图标47 西安工程大学学士学位论文四种。(3)界面版式:版式是界面设计的重要组成部分,它将文字、图形等视觉元素进行组合配置,使页面整体视觉效果美观和谐,便于阅读,操作,实现信息传达的最佳效果。Android游戏系统的界面设计也是综合了文字,图形等元素。使每一个功能有文字与图片的共同描述,达到看图就大概知道此键是什么功能的目的,最终的目的还是为了使用者能够快速上手,不至于因为操作的不得当而放弃此系统。3.1.2软件功能模块图3-1整体结构图A)游戏模块:负责游戏运行的主线程,在一个Android程序开始运行的时候,47 西安工程大学学士学位论文会单独启动一个Process。默认的情况下,所有这个程序中的Activity或者Service(Service和Activity只是Android提供的Components中的两种,除此之外还有ContentProvider和BroadcastReceiver)都会跑在这个Process。一个Android程序默认情况下也只有一个Process,但一个Process下却可以有许多个Thread。在这么多Thread当中,有一个Thread,我们称之为UIThread。UIThread在Android程序运行的时候就被创建,是一个Process当中的主线程MainThread,主要是负责控制UI界面的显示、更新和控件交互。在Android程序创建之初,一个Process呈现的是单线程模型,所有的任务都在一个线程中运行。因此,我们认为,UIThread所执行的每一个函数,所花费的时间都应该是越短越好。而其他比较费时的工作(访问网络,下载数据,查询数据库等),都应该交由子线程去执行,以免阻塞主线程。那么,UIThread如何和其他Thread一起工作呢?常用方法是:诞生一个主线程的Handler物件,当做Listener去让子线程能将讯息Push到主线程的MessageQuene里,以便触发主线程的handlerMessage()函数,让主线程知道子线程的状态,并在主线程更新UI。B)页面布局模块(图形模块):虽然有的游戏不需要不断的重新绘制屏幕,但是假设你想要的游戏需要不间断的绘制屏幕,这是个简单的概念并且你不需要去关注任何脏标记或者去关注在某些游戏状态改变的情况下重新绘制屏幕。我们已经知道UI线程不是一直不间断的运行的,而是在事件的驱动下有操作系统调度运行的。这就是我们为什么实例化第二个线程,也就是我们通常说的渲染线程,这个线程是由Graphics模块所创建,Graphics模块本身由应用模块在程序启动的时候实例化。渲染线程执行一个无限循环,由于应用程序的生命周期事件,它可能会被暂停或者恢复。作为开发者,你可以通过注册一个RenderListerner将这个线程与图形模块连接起来.在我们进入这些方法的详解之前,我先给你介绍一些细节:libgdx使用OpenGlES,这个是移动设备上硬件加速图像渲染的工业标准。OpenGLES同一个叫做EGL的东西一起使用,EGL负责设立一个窗口系统和图像硬件的链接,它创建一个渲染表面,用户可以添加一个用户界面组件到上面,图形硬件可以不通过使用UI工具包直接渲染。OpenGLES自身额外的添加了一个叫做图形上下文的东西,他用于管理驻留在显存中的图形资源,举个例子:这些资源可以是一个纹理,它从本质上来说就是一张位图,OpenGLES将其建立在EGL的表面和背景,通过图形处理处理器获得高质量的图片。C)游戏配置模块:对于音效的管理。D)游戏介绍模块:游戏有智力游戏和活动性游戏之分,前者如下棋、积木、打牌等,后者如追逐、接力及利用球、棒、绳等器材进行的活动,多为集体活动,并有情节和规则,具有竞赛性。当前日常用语中的“游戏”47 西安工程大学学士学位论文多指各种平台上的电子游戏。电子游戏有单机版和网络游戏。3.2主界面设计飞机大战开始游戏退出游戏功能块音效管理关于我们历史记录图3-2主界面设计图A)开始游戏:其中一个Activity,在其调用SetContentView()时,调用我们自己定义的游戏界面,该游戏界面使我们自己通过一个类实现的游戏界面,在该类中继承了SurfaceView,并实现了SurfaceHolder.callBack接口和runnable接口,在该类的回调函数surfaceCreated()中启动游戏线程并一直进行游戏直到出现失误时就关闭该线程。B)退出游戏,关闭该应用,当我们玩游戏时,想休息会或者想退出游戏时点击该按钮,退出游戏C)音效管理:可以管理在玩游戏时对背景音乐的管理D)描述该软件的开发时间,开发人员和本软件的一些基本信息介绍。47 西安工程大学学士学位论文3.3游戏界面设计采用分层管理,具体效果如3-3图所示:图3-3游戏界面图3.4系统包及其资源规划在软件项目管理过程中一个关键的活动是制定项目计划,它是软件开发工作的第一步。项目计划的目标是为项目负责人提供一个框架,使之能合理地估算软件项目开发所需的资源、经费和开发进度,并控制软件项目开发过程按此计划进行。在做计划时,必须就需要的人力、项目持续时间及成本作出估算。这种估算大多是参考以前的花费作出的。软件项目计划包括二个任务:研究和估算。即通过研究确定该软件项目的主要功能、性能和系统界面。47 西安工程大学学士学位论文3.4.1系统包管理如下本游戏采用Eclipse中开发Android项目的默认框架,采用Eclipse开发的框架图如图3-4结构所示图3-4项目资源包管理3.4.2Sqlite数据库SQLite数据库是一款轻型的数据库,它嵌入在Android系统中,由于没有数据库操作的图形界面和客户端,所以我们只能通过命令进入Android系统中,进行数据库的操作。Android给我们提供了一系列系统工具可以访问SQLite数据库。AndroidDebug47 西安工程大学学士学位论文Bridge(ADB)是Android的一个通用调试工具,它可以更新设备或模拟器中的代码,可以管理预定端口,可以在设备上运行shell命令,我们知道android是基于Linux内核,它的内部文件结构也是采用Linux文件组织方式,因此访问它的文件结构需要使用shell。这次我们就会用shell来访问android应用中的SQLite数据库文件。1、运行cmd,切换到android-sdk目录,运行adb.exe,加上参数shell,出现#号就代表进入了shell命令模式,注意adb要在Android模拟器运行时才能进入shell。执行如下图3-5所示。图3-5进入shell命令模式2、shell命令记住两个基本命令ls和cd,类似windows命令提示行中的dir和cd,代表列出当前目录下文件列表和进入到指定目录。了解这两个命令之后,就可以找到data/data/项目包名/databases。找到数据库文件,接下来就是使用sqlite管理工具来进行操作了。键入sqlite3+数据库名就进入了sqlite管理模式了。执行过程如下图3-6所示。47 西安工程大学学士学位论文图3-6进入sqlite管理模式3.4.3Runable接口以及与Thread的区别在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。下面看例子:packageorg.thread.demo;classMyThreadextendsThread{privateStringname;publicMyThread(Stringname){super();this.name=name;}publicvoidrun(){for(inti=0;i<10;i++){System.out.println("线程开始:"+this.name+",i="+i);}}}packageorg.thread.demo;47 西安工程大学学士学位论文publicclassThreadDemo01{publicstaticvoidmain(String[]args){MyThreadmt1=newMyThread("线程a");MyThreadmt2=newMyThread("线程b");mt1.run();mt2.run();}}但是,此时结果很有规律,先第一个对象执行,然后第二个对象执行,并没有相互运行。在JDK的文档中可以发现,一旦调用start()方法,则会通过JVM找到run()方法。下面启动start()方法启动线程:packageorg.thread.demo;publicclassThreadDemo01{publicstaticvoidmain(String[]args){MyThreadmt1=newMyThread("线程a");MyThreadmt2=newMyThread("线程b");mt1.start();mt2.start();}};这样程序可以正常完成交互式运行。那么为啥非要使用start();方法启动多线程呢?在JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread中的start()方法的定义,可以发现此方法中使用了privatenativevoidstart0();其中native关键字表示可以调用操作系统的底层函数,那么这样的技术成为JNI技术(javaNativeInterface)Runnable接口在实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口完成。publicinterfaceRunnable{publicvoidrun();}例子:packageorg.runnable.demo;47 西安工程大学学士学位论文classMyThreadimplementsRunnable{privateStringname;publicMyThread(Stringname){this.name=name;}publicvoidrun(){for(inti=0;i<100;i++){System.out.println("线程开始:"+this.name+",i="+i);}}};但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。此时观察Thread类,有一个构造方法:publicThread(Runnabletarger)此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。(start()可以协调系统的资源):packageorg.runnable.demo;importorg.runnable.demo.MyThread;publicclassThreadDemo01{publicstaticvoidmain(String[]args){MyThreadmt1=newMyThread("线程a");MyThreadmt2=newMyThread("线程b");newThread(mt1).start();newThread(mt2).start();}}两种实现方式的区别和联系:在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:避免点继承的局限,一个类可以继承多个接口。适合于资源的共享以卖票程序为例,通过Thread类完成:packageorg.demo.dff;classMyThreadextendsThread{privateintticket=10;47 西安工程大学学士学位论文publicvoidrun(){for(inti=0;i<20;i++){if(this.ticket>0){System.out.println("卖票:ticket"+this.ticket--);}}}};下面通过三个线程对象,同时卖票:packageorg.demo.dff;publicclassThreadTicket{publicstaticvoidmain(String[]args){MyThreadmt1=newMyThread();MyThreadmt2=newMyThread();MyThreadmt3=newMyThread();mt1.start();//每个线程都各卖了10张,共卖了30张票mt2.start();//但实际只有10张票,每个线程都卖自己的票mt3.start();//没有达到资源共享}}如果用Runnable就可以实现资源共享,下面看例子:packageorg.demo.runnable;classMyThreadimplementsRunnable{privateintticket=10;publicvoidrun(){for(inti=0;i<20;i++){if(this.ticket>0){System.out.println("卖票:ticket"+this.ticket--);}}}}packageorg.demo.runnable;publicclassRunnableTicket{47 西安工程大学学士学位论文publicstaticvoidmain(String[]args){MyThreadmt=newMyThread();newThread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一newThread(mt).start();//个实例化对象mt,就会出现异常newThread(mt).start();}};虽然现在程序中有三个线程,但是一共卖了10张票,也就是说使用Runnable实现多线程可以达到资源共享目的。Runnable接口和Thread之间的联系:publicclassThreadextendsObjectimplementsRunnable发现Thread类也是Runnable接口的子类。3.5本章小结本章详细的划分了整个项目的开发模块,及各个模块的详细设计,最后对整个项目的包结构和项目资源路径做了简单的剖析和介绍。47第4章系统功能的实现47 第4章系统功能的实现第4章系统功能的实现界面是呈现给用户的,一个界面呈现的友好性会决定用户是否会接受该系统,对于Android系统而言,界面的友好布局,信息的简单明了都至关重要。4.1主界面的功能实现主界面的设计如下图4-1所示:图4-1系统主界面在工程的reslayout目录下,创建了一个名称为”activity_main.xml”的布局文件,该文件主要为生成主界面做配置,其布局文件代码如下:1.8.15.22.29.3.主界面布局文件主界面中有四个按钮分别为开始游戏,退出游戏,关闭音效,关于我们,其中每个按钮都绑定了一个监视器,当按下该按钮时,该监视器将触发点击事件,其中为开始按钮绑定的监视器如下:1.publicclasslistenerimplementsView.OnClickListener{2.@Override3.publicvoidonClick(Viewv){4.intent=newIntent(this,viewActivity.class);5.startActivity(intent);6.}7.}Intent对象介绍:Intent(意图)主要是解决Android应用的各项组件之间的通讯。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。例如,在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后,希望能够跳出此联系人的详细信息屏幕(假设对应的Activity为detailActivity)为了实现这个目的,listActivity需要构造一个Intent,这个Intent用于告诉系统,我们要做“查看”动作,此动作对应的查看对象是“某联系人”,然后调用startActivity(Intentintent),将构造的Intent传入,系统会根据此Intent中的描述,到ManiFest中找到满足此Intent要求的Activity,系统会调用找到的Activity,即为detailActivity,最终传入Intent,detailActivity则会根据此Intent中的描述,执行相应的操作。其中startActivity(intent)将启动一个新的意图对象,代表一个新的Activity;在这里将启动游戏主Activity。关闭音效的监视器如下:1.publicclasscloseimplementsView.OnClickListener{47 西安工程大学学士学位论文1.@Override2.publicvoidonClick(Viewv){3.if(parameter.getSoundflag()){4.parameter.setSoundflag(false);5.Toast.makeText(getApplicationContext(),"音效已近关闭",Toast.LENGTH_SHORT).show();6.}else{7.parameter.setSoundflag(true);8.Toast.makeText(getApplicationContext(),"音效已近打开",Toast.LENGTH_SHORT).show();9.}10.}11.}在这里,我们通过配置文件的参数改变是否需要播放背景音乐,当有音乐时,点击时将会关闭音效,当没音效时,点击一下将会开启音效。其效果展示如下图图4-2和图4-3所示:47 西安工程大学学士学位论文图4-2关闭音效界面图4-3打开音效界面Toast是一个View视图,快速的为用户显示少量的信息。Toast在应用程序上浮动显示信息给用户,它永远不会获得焦点,不影响用户的输入等操作,主要用于一些帮助/提示。Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失。退出游戏按钮的监视器:1.publicclasslistener1implementsView.OnClickListener{2.@Override3.publicvoidonClick(Viewv){4.try{5.MainActivity.this.finish();6.}catch(Throwablee){7.//TODO自动生成的catch块8.e.printStackTrace();9.}47 西安工程大学学士学位论文1.}2.}其中finish()方法将关闭当前正在运行的Activity。图4-4关于我们的界面关于我们按钮主要介绍了本软件的性质和软件编码者和其指导老师的简介,并标明了软件的版本号和开发的时间信息如图4-4所示,浏览全部的信息之后,用户可以点击返回主界面返回,或者使用手机自带的返回键返回到主界面。关于我们按钮的监视器:1.publicclassaboutimplementsView.OnClickListener{2.@Override3.publicvoidonClick(Viewv){4.startActivity(aboutIntent);5.}6.}在该点击事件里将启动管我们介绍的activity。4.1游戏界面的功能实现实现的效果如下图图4-5所示:47 西安工程大学学士学位论文图4-5游戏运行界面主界面的实现是通过SurfaceView实现的,SurfaceView继承自View,但它与View不同?View是在UI的主线程中更新画面,而SurfaceView是在一个新线程中更新画面。我们不可能写一个方法让主线程自己运动。View的特性决定了其不适合做动画,因为如果更新画面时间过长,那么主UI线程就会被正在画的函数阻塞。所以Android中通常用SurfaceView显示动画效果。在对SurfaceView进行操作前Android为我们提供了一个十分好用的接口:SurfaceHolder.Callback接口。该接口中有三个抽象方法,这三个抽象方法是SurfaceView的三个生命周期:abstractvoidsurfaceChanged(SurfaceHolderholder,intformat,intw,inth)这个方法被回调,当SurfaceView界面发生改变时。abstractvoidsurfaceCreated(SurfaceHolderholder)这个方法被回调,当SurfaceView界面被创建时。abstractvoidsurfaceDestroyed(SurfaceHolderholder)这个方法被回调,当SurfaceView界面被销毁时。控制SurfaceView的SurfaceHolder介绍47 西安工程大学学士学位论文上一节的Surface概述中我曾经说过每一个Surface都有一个Canvas,而Surface自身控制自己的大小等等属性。但是Surface是如何控制自己的呢?在SurfaceView中一般通过使用SurfaceHolder类来控制Canvas在其surface上的操作。如何得到SurfaceHolder?其实很简单,在SurfaceView中提供了getHolder()方法。如果该surfaceView中还需要实现回调生命周期,那么holder还需要调用addCallback()方法为其添加回调声明周期。API如下:abstractvoidaddCallback(SurfaceHolder.Callbackcallback)AddaCallbackinterfaceforthisholder.SurfaceHolder中还有几个十分重要的方法:lockCanvas():该方法用于锁定画布,这样Surface中就可以指定backbuffer中的画布是那一块了。之后就可以在画布上进行绘画,该方法的API如下:abstractCanvaslockCanvas()开始编辑像素在界面之上lockCanvas()方法是对整个Surface进行重绘,但是很多情况下,我们只需要对Surface的一小部分进行重画时,则使用lockCanvas(Rectdirty)更为明智。lockCanvas(Rectdirty)通过其中的参数也可以看出,其只更新Rect部分的画面。API入下:abstractCanvaslockCanvas(Rectdirty);以上两个方法是对Canvas进行锁定,当Canvas绘制完毕之后,Surface的frontbuffer就需要这个Surface进行显示。如果此时Canvas还在锁定状态,则Surface的frontbuffer将不能得到Canvas。所以此时应该在canvas绘画完毕之后,释放锁定。unlockCanvasAndPost(Canvascanvas):用于释放出于锁定状态的Canvas。API如下:Java代码abstractvoidunlockCanvasAndPost(Canvascanvas);当完成在界面上的绘制时调用该方法解除画布锁定。GameView的实现如下:1.packageorg.example.airplane;2.importjava.io.InputStream;3.importjava.util.Random;4.importandroid.app.Dialog;5.importandroid.content.Context;6.importandroid.content.Intent;7.importandroid.graphics.Bitmap;47 西安工程大学学士学位论文1.importandroid.graphics.BitmapFactory;2.importandroid.graphics.Canvas;3.importandroid.graphics.Color;4.importandroid.graphics.Paint;5.importandroid.view.MotionEvent;6.importandroid.view.SurfaceHolder;7.importandroid.view.SurfaceHolder.Callback;8.importandroid.view.SurfaceView;9.importandroid.widget.Toast;10.publicclassGameViewextendsSurfaceViewimplementsCallback,Runnable{11.//游戏结束的回调接口12.publiconEndOfGameInterfaceendinterface;13.publicstaticlonggrade=0;//屏幕宽和高14.publicintscreenwidth=0;15.publicintscreenheight=0;16.//判断线程是否在运行17.publicbooleanisrun=true;18.//两张背景图的y坐标19.publicinty0=0;20.publicinty1=0;21.22.//背景图23.publicBitmapbackground=null;24.25.//飞机坐标,飞机位图26.publicintairx=0;27.publicintairy=0;28.publicBitmapmyairplane=null;29.//子弹30.publicbulletBullet[]=null;31.publicintbullet_maxnum=15;32.publicintindex=0;33.publicintinterval=100;47 西安工程大学学士学位论文1.publiclonglasttime=0;2.publicBitmapbitbullet[]=null;3./**/4.//敌机5.publicBitmapbitenemy[]=null;6.publicenemyEnemy[]=null;7.publicintenemy_maxnum=12;8.//游戏线程9.publicThreadthread=null;10.//画笔11.publicPaintpaint=null;12.publicPaintpaint1=null;13.//画布常量14.publicCanvascanvas=null;15.//为了得到一个画布,增加回调函数16.publicSurfaceHoldersurfaceholder=null;17.18.//上下文环境变量19.publicContextmcontext;20.intbx,by,ex,ey;21.publicGameView(Contextcontext){22.super(context);23.}24.publicGameView(Contextcontext,intwidth,intheight){25.super(context);26.//屏幕宽和高27.screenwidth=width;28.screenheight=height;29.//画笔常量30.paint=newPaint();31.paint1=newPaint();32.paint1.setTextSize(40);33.paint1.setColor(Color.RED);34.//环境变量47 西安工程大学学士学位论文1.mcontext=context;2.surfaceholder=getHolder();3.surfaceholder.addCallback(this);4.//TODO自动生成的构造函数存根5.init();6.}7./**8.*读位图9.*10.*@paramcontext11.*@paramid12.*@return13.*/14.publicvoidsetOnEndOfGame(onEndOfGameInterfaceendInterface){15.this.endinterface=endInterface;16.}17.publicBitmapreadBitmap(Contextcontext,intid)18.{19.BitmapFactory.Optionsopt=newBitmapFactory.Options();20.opt.inPreferredConfig=Bitmap.Config.RGB_565;21.opt.inInputShareable=true;22.opt.inPurgeable=true;23.24.InputStreamis=context.getResources().openRawResource(id);25.returnBitmapFactory.decodeStream(is,null,opt);26.}27.publicvoidinit()28.{29.background=readBitmap(mcontext,R.drawable.map);30.myairplane=readBitmap(mcontext,R.drawable.myairplane);31.y1=background.getHeight();32.airx=screenwidth/2;33.airy=screenheight-100;34.//敌机47 西安工程大学学士学位论文1.Enemy=newenemy[enemy_maxnum];2.bitenemy=newBitmap[enemy_maxnum];3.for(inti=0;i=background.getHeight())10.y0=-background.getHeight();11.if(y1>=background.getHeight())12.y1=-background.getHeight();13./*14.**/15.for(inti=0;i=screenheight||Enemy[i].dieflag==true)23.{24.Randomr=newRandom();25.Enemy[i].init(r.nextInt(12)*65,0);26.Enemy[i].dieflag=false;27.}28.}29.30.longcurrenttime=System.currentTimeMillis();31.if(index=interval)34.{47 西安工程大学学士学位论文1.Bullet[index].init(airx+20,airy-20);2.if(Bullet[index].dieflag){3.Bullet[index].dieflag=false;4.}5.index++;6.lasttime=currenttime;7.}8.}9.else10.{11.index=0;12.}13.14.Collision();15.16.}17.publicvoidCollision()18.{19.for(inti=0;i2.6.47 西安工程大学学士学位论文1.6.9.10.11.12.13.14.16.17.19.20.22.23.24.4.5本章小结主要介绍了主界面和游戏界面设计和实现,并在各个部分内容插叙讲述了各功能的具体实现点和实现技术,并成功的完成了软件的开发部分,能够在真机上流畅运行。47 第5章系统测试第5章系统测试5.1软件测试的概念软件测试就是利用测试工具按照测试方案和流程对产品进行功能和性能测试,甚至根据需要编写不同的测试工具,设计和维护测试系统,对测试方案可能出现的问题进行分析和评估。执行测试用例后,需要跟踪故障,以确保开发的产品适合需求。软件测试的目的决定了如何去组织测试。如果测试的目的是为了尽可能多地找出错误,那么测试就应该直接针对软件比较复杂的部分或是以前出错比较多的位置。如果测试目的是为了给最终用户提供具有一定可信度的质量评价,那么测试就应该直接针对在实际应用中会经常用到的商业假设。不同的机构会有不同的测试目的,相同的机构也可能有不同测试目的,可能是测试不同区域或是对同一区域的不同层次的测试。软件测试的方法和技术是多种多样的,甚至研发和测试在实际工作中都是分开进行,由于本人能力有限,只对系统进行了功能和安全健壮方面进行了测试。5.2系统的功能和安全测试由于Android自带了测试工具和Debug模式,Android的编译和测试工具需要测试项目组织符合预订的结构:分别为Testcase类,Testcase包以及测试项目。JUnit为Android的测试的基础,一般来说,一个JUint测试为一个用来测试一个应用某一部分的语句。你可以将多个测试Test方法组织起来构成一个测试用例(Testcase),多个测试用例可以构成TestSuites。每个Test方法相对独立,一个测试类Testclass包含一组相关的Test或其它辅助方法。在系统安全方便我采用Android单元测试的方法,测试过程如下。① Menifest.xml中加入测试需要的功能包和加入测试权限1中加入:23外面加入:45① 编写单元测试代码:测试类必须继承自AndroidTestCase类1packagename.feisky.android.test;23importandroid.test.AndroidTestCase;4importjunit.framework.Assert;5publicclassMyTestextendsAndroidTestCase{6privatestaticfinalStringTag="MyTest";78publicvoidtestSave()throwsThrowable{9inti=4+8;10Assert.assertEquals(5,i);11}12publicvoidtestSomethingElse()throwsThrowable{13Assert.assertTrue(1+1==12);14}15}② 执行测试过程截图如5-1、5-2、5-3所示。图5-1声明单元测试图5-2测试代码方法的响应时间47 西安工程大学学士学位论文图5-3测试结果显示本游戏测试的主要是检验在游戏运行的过程中是否能够按照Activity的生命周期正常运行,例如退出后,重新进入是否能够保存退出前的状态并继续运行;在游戏对战中是否能够正常产生敌机和发射子弹;战机死亡后是否能够正常关闭线程等。5.3测试总结通过单元测试发现如果用户输入数据不合理比如数据输成自己或不存在数据程序会报各种错误及异常,直接导致软件崩溃。因此根据可能出现的问题进行了相关判断和提示,使系统更加强壮和友好。项目测试结果表明,所设计软件各项功能模块都能正常运行,满足项目设计要求,项目研究和软件设计达到了预期目的。47 西安工程大学学士学位论文第6章总结基于Android的飞机大战游戏是采用Android应用的核心技术及java语言常用开发模式完成,本系统实现了游戏流程中的所有功能,界面布局更加人性化,并有着良好的可扩展性。整体模式采用C/S架构开发,Android客户能够处理常用数据及业务逻辑,减轻了服务器端的压力。由于Android迅猛的发展,在Android平台开发的应用也将会成为主流,因此,该系统在这种大环境下应运而生,有着广阔的商业前景。本系统从构思,设计到代码的实现与测试历时近三个月,通过对项目的思考与编码实现,使我对Android和java技术有了更深层次的了解,自己也清楚的感觉到自己对知识掌握的局限,尤其是在Android开发方面还要投入更多的精力去学习。通过大量的查阅资料和书籍让我对软件开发的流程有了一定的掌握,明白了软件开发的原理、流程和模式。这次的项目设计开发为今后的学习和工作产生了积极的意义。由于还是初学者,在项目设计中还有欠缺和考虑不周的地方,游戏还有待进一步研究和改善。47 西安工程大学学士学位论文致谢论文完成之际,衷心感谢所有关心、帮助过作者的老师、同学、朋友们,尤其要向作者的导师黄国兵老师致以衷心的感谢。在项目运行和论文撰写工作中,黄老师对作者严格要求,认真指导,给予了很多鼓励和帮助,并提供了很多指导性的意见。在黄国兵老师的亲切关怀和悉心指导下作者顺利的完成了的项目设计和论文撰写。他严肃的科学态度,严谨的治学精神,精益求精的工作作风,对学术一丝不苟的高尚品德和人格魅力深深地感染和激励着作者,今后也会成为作者生活和工作追求的标榜。最终也要感谢在设计期间给予作者帮助的同学,他们帮助解答了许多技术上的问题。同时也感谢其他老师在此期间的关怀和帮助,以及学院为作者提供良好的毕业设计环境。47 西安工程大学学士学位论文参考文献[1]RickRogers,BlakeMeike,ZigurdMednieks.Android应用开发李耀亮译.人民邮电出版社.2010.9.[2]余志龙、陈昱勋、郑名杰AndroidSDK开发范例大全[M].北京人民邮电出社,2010[3]田珂,谢世波,方马.J2EE数据持久层的解决方案[J].计算机工程,2003[4]李刚,疯狂Android讲义第二版电子工业出版社2013年7月[5]明日科技,Java从入门到精通清华大学出版社2012年9月[6]高焕堂.Android应用框架原理与程式设计36(第三版)[M].北京:清华大学出版社,2007.1[7]张利国,龚海平,王植萌.Android移动开发入门与进阶[M].北京:人民邮电出版社,2009.12[8]崔尚森,张白一.面向对象程序设计—Java(第二版)西安电子科技大学出版社,2006.1[9]黄德才.数据库原理及其应用教程(第二版).科学出版社,2006[10]张桂珠刘丽陈爱国Java面向对象程序设计(第2版)北京邮电大学出版社[11]毕广吉.Java程序设计实例教程[M].北京:冶金工业出版社,2007年[12]王保罗.Java面向对象程序设计[M].北京:清华大学出版社,2003年[13]林邦杰.彻底研究java.北京:电子工业出版社,2002年[14]王珊.萨师煊.数据库系统概论(第四版)[M].北京:高等教育出版社,2006[15]李飞.最新实用网络技术教程[M].西安:西安电子科技大学出版社47 西安工程大学学士学位论文西安工程大学本科毕业设计(论文)诚信声明禀承学校优良传统学风,保持我校学生一贯诚信风尚,本人郑重声明:所呈交毕业设计(论文)是在指导老师的指导下独立完成的,无抄袭和剽窃现象。特此声明。学生:赵兵指导教师:黄国兵2012年6月15日47'