![基于android平台的飞机游戏设计_第1页](http://file4.renrendoc.com/view11/M01/0F/09/wKhkGWWj1YCADG6yAACtQBIiqRs192.jpg)
![基于android平台的飞机游戏设计_第2页](http://file4.renrendoc.com/view11/M01/0F/09/wKhkGWWj1YCADG6yAACtQBIiqRs1922.jpg)
![基于android平台的飞机游戏设计_第3页](http://file4.renrendoc.com/view11/M01/0F/09/wKhkGWWj1YCADG6yAACtQBIiqRs1923.jpg)
![基于android平台的飞机游戏设计_第4页](http://file4.renrendoc.com/view11/M01/0F/09/wKhkGWWj1YCADG6yAACtQBIiqRs1924.jpg)
![基于android平台的飞机游戏设计_第5页](http://file4.renrendoc.com/view11/M01/0F/09/wKhkGWWj1YCADG6yAACtQBIiqRs1925.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
绪论Android系统最初由安迪·鲁宾(AndyRubin)制作,最初主要支持手机。2005年8月17日被Google收购。2007年11月5日,Google与84家硬件制造商、软件开发商及电信营运商组成开放手持设备联盟(OpenHandsetAlliance)来共同研发改良Android系统并生产搭载Android的智慧型手机,并逐渐拓展到平板电脑及其他领域上。随后,Google以Apache免费开源许可证的授权方式,发布了Android的源代码。同时,一个负责进一步发展和维护Android操作系统的Android开源项目也被建立(AOSP)。Android的内核基于Linux,除了内核之外,则是中介层、数据库元和用C/C++编写的API以及应用程序框架。Android的应用程序通常以Java数据库元为基础编写,运行程序时,应用程序的代码会被即时转变为Dalvikdex-code(DalvikExecutable),然后Android操作系统通过使用即时编译的Dalvik虚拟机来将其运行。除了开放手持设备联盟之外,Android还拥有许多由全球各地开发者组成的开源社区来专门负责开发Android应用程序和第三方Android操作系统来延长和扩展Android的功能和性能。截止至2011年10月,AndroidMarket(现为GooglePlay)上拥有超过30万个认证的应用程序,AndroidMarket的应用程序下载量也在2011年12月达到100亿次。由于Android是开放的,因此它还可以通过第三方网站来下载安装GooglePlayStore上所没有的应用程序。2010年末数据显示,仅正式推出两年的Android操作系统在市场占有率上已经超越称霸十年的诺基亚Symbian系统。2011年8月,Android操作系统在全球智能手机操作系统的市场份额已达48%,成为全球第一大智能手机操作系统。东华理工大学长江学院毕业设计Android开发环境1.Android系统简介命名由来Android一词最早出现于法国作家利尔亚当(AugusteVilliersdel'Isle-Adam)在1886年发表的科幻小说《未来夏娃》(L'Èvefuture)中。他将外表像人的机器人取作Android。Logo来源Android的Logo是由Ascender公司设计的。其中的文本使用了Ascender公司专门制作的称之为“GoogleDroid字型”的字型。Android是一个全身绿色的机器人,绿色也是Android的标志。颜色采用了PMS376C和RGB中十六进制的#A4C639来绘制,这是Android操作系统的品牌象征。有时候,它们还会使用纯文本的Logo。Linux内核Android操作系统的内核属于Linux内核的一个分支,具有典型的Linux周期和功能,除此之外,Google为了能让Linux在移动设备上良好的运行,对其进行了修改和扩充。Android去除了Linux中的本地XWindowSystem,也不支持标准的GNU库,这使得Linux平台上的应用程序移植到Android平台上变得困难。2008年,PatrickBrady于GoogleI/O演讲“Anatomy&PhysiologyofanAndroid”,并提出的AndroidHAL架构图。HAL以*.so档的形式存在,可以把Androidframework与Linuxkernel隔开,这种中介层的方式使得Android能在移动设备上获得更高的执行效率。这种独特的系统结构被Linux内核开发者GregKroah-Hartman和其他内核维护者称赞。Google还在Android的内核中加入了自己开发制作的一个名为“wakelocks”的移动设备电源管理功能,该功能用于管理移动设备的电池性能,但是该功能并没有被加入到Linux内核的主线开放和维护中,因为Linux内核维护者认为Google没有向他们展示这个功能的意图和代码。2010年2月3日,由于Google在Android内核开发方面和Linux社区方面开发的不同步,Linux内核开发者GregKroah-Hartman将Android的驱动程序从Linux内核“状态树”(“stagingtree”)上除去。2010年4月,Google宣布将派遣2名开发人员加入Linux内核社区,以便重返Linux内核。2010年9月,Linux内核开发者RafaelJ.Wysocki添加了一个修复程序,使得Android的“wakelocks”可以轻松地与主线Linux内核合并。2011年,LinusTorvalds说:“Android的内核和Linux的内核将最终回归到一起,但可能不会是4-5年。”特点显示布局Android操作系统支持更大的分辨率,VGA,2D显示,3D显示都给予OpenGLES2.0标准规格,并且支持传统的智能手机。数据存储Android操作系统内置SQLite小型关联式资料库管理系统来负责存储数据。网络Android操作系统支持所有的网络制式,包括GSM/EDGE、IDEN、CDMA、EV-DO、UMTS、Bluetooth、Wi-Fi、LTE、NFC和WiMAX。信息作为原设计给手机使用的操作系统,Android操作系统原生支持短信和邮件,并且支持所有的云端信息和服务器信息。语言Android操作系统支持多语言。浏览器Android操作系统中内置的网页浏览器基于WebKit内核,并且采用了ChromeV8引擎。在Android4.0内置的浏览器测试中,HTML5和Acid3故障处理中均获得了满分,并且于2.2版及之后能原生支持Flash。支持Java虽然Android操作系统中的应用程序大部分都是由Java编写的,但是Android却是以转换为Dalvikexecutables的文件在Dalvik虚拟机上运行的。由于Android中并不自带Java虚拟机,因此无法直接运行Java程序。不过Android平台上提供了多个Java虚拟机供用户下载使用,安装了Java虚拟机的Android系统可以运行J2ME的程序。媒体支持Android操作系统本身支持以下格式的音频/视频/图片媒体:WebM、H.263,H.264(in3GPorMP4container)、MPEG-4SP、AMR,AMR-WB(in3GPcontainer)、AAC,HE-AAC(inMP4or3GPcontainer)、MP3、MIDI、OggVorbis、FLAC、WAV、JPEG、PNG、GIF、BMP。如果用户需要播放更多格式的媒体,可以安装其他第三方应用程序。流媒体支持Android操作系统支持RTP/RTSP(3GPPPSS,ISMA)的流媒体以及(HTML5<video>)的流媒体,同时还支持Adobe的Flash,在安装了RealPlayer之后,还支持苹果公司的流媒体。硬件支持Android操作系统支持识别并且使用视频/照片摄像头,多点电容/电阻触摸屏,GPS,加速计,陀螺仪,气压计,磁强计,键盘,鼠标,USBDisk,专用的游戏控制器,体感控制器,游戏手柄,蓝牙设备,无线设备,感应和压力传感器,温度计,加速2D位位块传输(硬件方向,缩放,像素格式转换)和3D图形加速。多点触控Android支持原生的多点触摸,在最初的HTCHero手机上即有这个功能。该功能是内核级别(为了避免对苹果公司的触摸屏技术造成侵权)。蓝牙Android支持A2DP,AVRCP,发送文件(OPP),访问电话簿(PBAP),语音拨号和发送手机之间的联系。同时支持键盘,鼠标和操纵杆(HID)。语音功能除了支持普通的电话通话之外,Android操作系统从最初的版本开始就支持使用语音操作来使用Google进行网页搜索等功能。而从AndroidOSv2.2开始,语音功能还可以用来输入文本、语音导航等功能。无线共享功能Android操作系统支持用户使用本机充当“无线路由器”,并且将本机的网络共享给其他手机,其他机器只需要通过WiFi寻找到共享的无线热点,就可以上网。而在AndroidOSv2.2版本之前的操作系统则需要通过第三方应用或者其他定制版系统来实现这个功能。截图功能从AndroidOSv4.0版本开始,Android操作系统便支持截图功能,该功能允许用户直接抓取手机屏幕上的任何画面,用户还可以通过编辑功能对截图进行处理,还可以通过蓝牙/E-mail/微博/共享等方式发送给其他用户或者上传到网络上,也可以拷贝到电脑中。2.Android的相关技术介绍及分析2.1Android系统架构研究Android是一个包含操作系统、中介架构层及应用程序所产生出来的软件堆栈架构。由下而上,其核心为嵌入式Linux2.6作业系统,向上搭配Google为Android开发的类库及Android运行时,再配合应用程序架构,来开发各种不同的应用程序。2.1.1Android的功能特征(l)应用程序架构:在应用程序架构内已经具备多种不同的基础组件,在开发应用程序时,就可以直接调用这些组件来使用,可以节省开发应用程序的心力及时间。(2)Dalvik虚拟机器:在Android平台上所使用Java虚拟机,不是Sim公司的标准Java虚拟机,而是使用Google自主开发的代号为Dalvik的虚拟机,它在保证API方面的兼容的同时,针对移动手机进行了大幅优化,占用资源更小,运行效率更高。(3)集成的浏览器:集成的浏览器是Android内建的浏览器,是以WebKit的浏览引擎为基础所开发成的。WedKit是一个开源浏览器网页排版引擎,目前使用WebKit引擎的浏览器主要有:Safari,Midori,Epiphany等。配合Android手机的功能,可以在浏览网页时,达到更好的效果,例如:局部性的缩放网页上的资讯、触控式的操作等效果。(4)优化的绘图能力:在程序里可以用到的绘图功能分为2D与3D两个方面。在2D方面,Android提供了一套特有的类库(SGL;而在3D方面则是使用OpenGLES1.0(openGLforEmbeddedsystems)规范的类库。它们是一种非常快的图形引擎,并且支持硬件加速。(5)SQLite数据库:SQLite提供结构化的数据存取。SQLite是一款轻型的数据库,它的设计目标是嵌入式的,目前已经在很多嵌入式产品中使用了它,它占用的资源非常低。它能够支持Windows/Linux/Unix等主流的操作系统,同时能够跟很多程序语言相结合,比如php,Java等,还有ODBC接口,同样比起Mysql,PostgreSQL来讲,它的处理速度比它们都快。它无需安装和管理配置,它是一个储存在单一磁盘文件中的完整数据库,体积小只有250KB但支持数据库大小至2TB。它虽然很小巧,但是支持的SQL语句毫不逊色于其它开源数据库。同时它还支持事务功能和并发处理等等。SQLite也是一套开放性的关联式资料库,其特点在于轻量性方面的设计结构,更适合在手机上使用。(6)多媒体的支持能力:主要用于播放媒体文件。这同时包括对音频(如播放MP3或其他音乐文件等)和视频(如播放从网上下载的视频)的支持,并支持“播放URI地址”(Note:URI即是统一资源识别地址)模式—在网络上直接播放的流媒体。另外支持各种通用的静态图像格式,例如:JPG、PNG、GIF等格式。(7)GSM技术:GlobalSystemforMobileCommunications,即全球移动通讯系统,俗称”全球通”,是一种起源于欧洲的移动通信技术标准,是第二代移动通信技术,其开发目的是让全球各地可以共同使用一个移动电话网络标准,让用户使用一部手机就能行遍全球。GSM技术是属于手机硬件方面的展现,也是在开发Android应用程序时可以突出的特点之一。(8)蓝牙、EDGE、3G及Wi-Fi:蓝牙是一种新型、开放、低成本、短距离的无线连接技术,可取代短距离的电缆,实现话音和数据的无线传输。EDGE(EnhancedDataRateforGSM,Evolution),即增强型数据速率GSM演进技术。EDGE是一种从GSM到3G的过渡技术,它主要是在GSM系统中采用了一种新的调制方法,即最先进的多时隙操作和SPSK调制技术。由于8PSK可将现有GSM网络采用的GMSK调制技术的信号空间从2扩展到8,从而使每个符号所包含的信息是原来的4倍。Wi-Fi(WirelessFidelity),即无线保真技术,与蓝牙技术一样,同属于在办公室和家庭中使用的短距离无线技术。该技术使用的是2.4GHz附近的频段,该频段目前尚属没用许可的无线频段。其目前可使用的标准有两个,分别是IEEE802.lla和IEEE802.11b。这些通讯能力也是属于手机硬件方面的展现,也是在开发Android应用程序时可以突出的特点之一。(9)GPS:GlobalPositioningSystem,即全球定位系统,它是一个由覆盖全球的24颗卫星组成的卫星系统。这个系统可以保证在任意时刻和任何地点都可以同时观测到4颗卫星,以保证卫星可以采集到该观测点的经纬度和高度,以便实现导航、定位、授时等功能。这项技术可以用来引导飞机、船舶、车辆以及个人。这个同样也是属于手机硬体方面的体现,也是在开发Android应用程序是可以突出的特点之一。2.2Android架构分析图2-1中显示的是Android架构的五个主要部分。图2-1安卓架构的五个部分2.2.1应用程序框架在AndroidSDK中,定义了让开发者使用与核心应用程序相同API的权限应用程序框架是为了要简化组件的重新利用而设计的,应用程序可以发布功能为其它应用程序所使用。但是,这要受限于应用程序架构的安全机制,使用者以用同样的机制来新增、置换组件。目前所有的应用程序是由服务及系统来组成,包含有:(l)一套强大和可扩展的视图系统:用来建构一个应用程序的基本组件,包了在开发系统画面时,常用的列表、网格、文本框、按钮等控制项,甚至是内嵌的Web浏览器。(2)内容提供者:使应用程序可以访问另一个应用程序的数据(如联系人数库),或者共享它们自己的数据。(3)资源管理器:提供各种非程序代码的资源让应用程序去使用。例如:本字符串、图形文件或排版相关的布局文件。(4)通知管理器:提供应用程序在状态栏中显示应用程序自定义的提示信息。(5)活动管理器:管理所有应用程序的生命周期及提供常用的导航回退功能。例如:启动应用程序要用到的资源准备及关闭应用程序时释放内存及相关资源等工作。(6)视窗管理器:用来管理所有启动程序的视窗。(7)位置管理器:用来管理地图服务的相关功能。(8)电话管理器:用来管理用户拨打与接听电话的相关功能。(9)包管理器:管理所有安装在Android系统内的包。2.2.2类库在Android中包含一些C/C++的类库,这些类库能被Android系统中不同的组件来使用。开发者可以通过应用程序框架使用这些功能。部分核心类库列表如下:(1)surfaceManager:主要的功能是让开发者可以去存取/显示系统及管理的功能,在[显示]与[存取操作]间的对应、互动以及实现无接缝的2D/3D多应用程序之间的整合。例如:在2D、2D显示上的合成、叠合动作。(2)3Dlibraries:主要是依openGLES1.0规范所定义的3D绘图引擎。该库使用硬件加速(当硬件可用时),可以将硬件的3D功能做最佳化的处理显示。(3)SGL:主要是处理有关显示2D方面的绘图引擎。(4)MediaFramework:主要是以packetVideo公司的OpenCORE为基础所发展的多媒体类库,该库支持回放和录制大量流行的音视频格式和静态图片。例如:MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF等格式(5)FreeType:主要是用来显示点阵图和处理向量字形的。(6)SSL:(secureSocketsuyer),中文名为“安全套接层协议层”,它是网景公司提出的基于WEB应用的安全协议,当前版本为3.0。SSL协议指定了一种在应用程序协议(如HTTP、Telenet、NMTP和FTP等)和TCP/IP协议之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。SSL协议位于TCP胆协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSLRecordProtocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSLHandshakeprotocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。SSL协议提供的服务主要有:①认证用户和服务器,确保数据发送到正确的客户机和服务器;②加密数据以防止数据中途被窃取;③维护数据的完整性,确保数据在传输过程中不被改变。(7)SQLite:SQLite是一套开放性的关联式资料库,能够被所有应用程序使用的轻量级的关系数据库引擎。(8)webKit:是一个先进的网页浏览器引擎,被用来构建Android浏览器和内嵌的web视图,也可以让开发者利用这个引擎来做不同的应用。(9)libc:就是一个BSD标准C类库。但是,针对Linux嵌入式装置进行过最佳化的调整。2.2.3Android运行时组件虽然Android是用Java语言来开发、撰写应用程序,但却不使用Java运行时组件来执行Java程序,而是使用了由Google自行研发的Android运行时组件来执行程序。Android运行时组件包括两个重要的部分,一个是核心类库,另一个是Dalvik虚拟机。2.3Android应用的构成和工作机制对于一个Android应用程序来说,是由Activity、IntentReceiver、Service、ContentProvider四部分组成,但并不是每一个Android应用程序都必须由这四部分组成。在应用程序中使用时,需要在配置文件AndroidManifest.xml中进行配置。这个配置文件是每个Android应用程序所必需的,用于定义应用程序的组件、组件的功能以及必要条件等。Android应用的构成和工作流程如图2-2:图2-2Android的构成和工作流程3.Android开发环境3.1下载JDK6首先需要的是JDK。AndroidSDK需要JDK5或更高的版本,我们使用JDK6来开发。以windows默认windows环境下为例,从Sun网站(/javase/downloads/)下载JDK6并安装。默认windows环境下接下来,设置JAVA_HOME环境变量以指向JDK安装文件夹。右键单击“计算机”选择“属性”,选择“高级系统设置”,然后单击“环境变量”。单击“新建”添加JAVA_HOME变量,如果该变量已存在,单击“编辑”修改它。JAVA_HOME的值类似于“C:\ProgramFiles\Java\jdk1.6.0_16”。3.2下载Eclipse3.5安装JDK之后,可以从/downloads/下载EclipseIDEforJavaDevelopers。将下载的.zip的文件解压到任何位置。首次启动Eclipse时,它将要求为工作区间提供一个位置。为了简化操作,可以选择一个简单的位置,比如D:\workspaces。3.3下载AndroidSDKAndroidSDK是开发android应用程序的基本要求,没有AndroidSDK,android应用开发无从谈起。AndroidSDK中包含一个模拟器,所以无需带有Android操作系统的移动设备就能开发Android应用程序。AndroidSDK可以从/sdk下载。AndroidSDK同eclipse一样以.zip文件的形式发布,所以将其解压到合适的位置。AndroidSDK包含一个tools目录,需要将它添加到PATH中。3.4安装ADTADT这个Eclipse插件对开发Android应用程序有很大的帮助。它提供了一些工具来创建、测试、和调试Android应用程序。ADT需要使用Eclipse中的InstallNewSoftware工具来执行安装。(1)选择Help菜单项并选择InstallNewSoftware…选项。这个选项在以前的Eclipse版本中为“SoftwareUpdates”。(2)选择“Workwith”字段,输/android/eclipse/。Eclipse将连接该网站并生成列表,如图3-1所示。然后选择父节点DeveloperTools,并确认同事选中所有子节点,然后单击Next。(3)更具提示安装所有的工具,并安装ADT所需工具的许可协议。单击“Iaccept…”,然后单击Finish按钮。图3-1使用Eclipse中的InstallNewSoftware功能安装ADT在Eclipse中安装ADT的最后一步是将他指向AndroidSDK。选择windows菜单并选择Preferences。在Preferences对话框中,选择Android节点并将SDKLocation字段设置为AndroidSDK的路径(参见图3-2)然后单击Apply按钮。东华理工大学长江学院毕业设计图3-2将ADT指向AndroidSDK4.Android应用程序结构剖析4.1Android的APIAndroidAPI主要包含了以下几个部分:AndroidManifest.xmlAndroidManifest.xml是系统的控制文件,它告诉系统如何处理所创建的所有应用组件(尤其是活动(Activity),服务(Service),意图接收器(IntentReceiver)和内容提供者(ContentProvider))。举例来说,控制文件就是把活动和要接收的意图(Intents)连接在一起的“胶水”。活动活动就是一个有生命周期的对象。一个活动就是完成某些工作的代码块,这部分工作还可能包括对用户UI界面的显示。不过这不是必须的,有些活动从不显示UI界面。视图视图可以将其自身绘制到屏幕上。Android的用户界面由一系列的视图树构成。接口都是由一组以树的形式出现的视图组成的。开发者可以通过创建一个新的视图的方法来使用自定义的图形处理技术(比如开发游戏,或者是使用了不常用的用户图形窗口界面)。意图意图是一个简单的消息对象,它表示程序想做某事的“意图”。比如应用程序想要显示一个网页,那么它可以通过创建一个Intent实例并将其传递给系统来表示意图浏览这个URI。系统将定位到能处理这一Intent的代码(在当前情况下就是浏览器),并运行之。意图也可以用于广播系统范围内的有效事件(例如通知事件)。服务服务是运行在后台的一段代码。它可以运行在它自己的进程,也可以运行在其他应用程序的进程里,这取决于自身的需要.。其它的组件可以绑定到一个服务上来,通过远程过程调用(RPC)来调用这个方法。例如媒体播放器的服务,当用户退出媒体选择的界面时,仍然希望音乐依然可以继续播放,这时就可用服务来保证当用户界面关闭时音乐还继续播放着。通知通知将以小图标的形式呈现在状态栏里,用户通过与图标的交互来接收消息。最常见的通知包括短信息、通话记录和语音邮件,但是应用程序也可以创建它们自己的通知事件。内容提供者内容提供者是用来提供对设备上数据进行访问。典型的例子就是使用内容提供者来访问联系人列表。应用程序也可以使用其它程序通过内容提供者提供的数据,同时也可以定义自己的内容提供者来向其它应用提供数据访问服务。4.2Android应用程序结构解析通常由以下四个组件来构建一个完整的Android应用程序。①活动②意图接收器③服务④内容提供者然而,并不是所有的Android应用程序都必须具备上面的四个组件,可以由上面的一个或几个来组建。当决定使用以上哪些组件来构建Android应用程序时,需要将它们注册在AndroidManifest.xml文件中,这是一个XML配置文件,在这个文件中可以声明应用程序组件以及它们的特性和要求。这个配置文件是每个Android应用程序所必需的。4.2.1ActivitiesActivities是一个程序的组件之一。它的主要功能是提供界面。一个程序一般由多个Activity组成,各activities之间关系很松散,它们之间没有直接的关联。必须有一个activity被指定为主activity,它是程序启动时首先显示的界面。每个activity都可以随意启动其它的activity。每当一个activity被启动,则前一个activity就被停止。一个程序中的所有启动的activity都被放在一个栈中,所以被停止的activity并没有销毁,而在存于棧中。新启动的activity先被存放于栈中,然后获得输入焦点。在当前活动的activity上点返回键,它被从棧中取出,然后销毁,然后上一个activity被恢复。当一个activity因为新的activity启动而被停止时,它会收到状态变化的通知,这样的变化有多个,每个都会引起系统调用一个相应的回调方法以通知activity,这些回调方法被统称为“生命周期回调方法”。这些回调方法分别在Activity被创建、停止、恢复、销毁时被调用。如图4-1,介绍各个“生命周期回调方法”,以及其各个方法之间的关系:onCreate:当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。onCreate方法有一个参数,该参数可以为空(null),也可以是之前调用onSaveInstanceState()方法保存的状态信息。onStart:该方法的触发表示所属活动将被展现给用户。onResume:当一个活动和用户发生交互的时候,触发该方法。onPause:当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。onStop:当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活动,而不会触发onStop方法。所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。onRestart:当处于停止状态的活动需要再次展现给用户的时候,触发该方法。图4-1Android生命周期onDestroy:当活动销毁的时候,触发该方法。和onStop方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。4.2.2ServiceService是android
系统中的一种组件,它跟Activity的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。Service的启动有两种方式:context.startService()和context.bindService()。使用context.startService()启动Service经历:context.startService()
->onCreate()->onStart()->Servicerunningcontext.stopService()|->onDestroy()->Servicestop
如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。
stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。所以调用startService的生命周期为:onCreate-->onStart(可多次调用)-->onDestroy使用使用context.bindService()启动Service会经历:
context.bindService()->onCreate()->onBind()->Servicerunning
onUnbind()->onDestroy()->ServicestoponBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。
所以调用bindService的生命周期为:onCreate-->onBind(只一次,不可多次绑定)-->onUnbind-->onDestory。在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。
service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等。4.2.3ContentProviderContentProvider属于Android应用程序的组件之一,作为应用程序之间唯一的共享数据的途径,ContentProvider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的借口。Android系统为一些常见的数据类型(如音乐、视频、图像、手机通信录联系人信息等)内置了一系列的ContentProvider,这些都位于vider包下。持有特定的许可,可以在自己开发的应用程序中访问这些ContentProvider。让自己的数据和其他应用程序共享有两种方式:创建自己的ContentProvier(即继承自ContentProvider的子类)
或者是将自己的数据添加到已有的ContentProvider中去,后者需要保证现有的ContentProvider和自己的数据类型相同且具有该ContentProvider的写入权限。对于ContentProvider,最重要的就是数据模型(datamodel)和URI。数据模型ContentProvider将其存储的数据以数据表的形式提供给访问者,在数据表中每一行为一条记录,每一列为具有特定类型和意义的数据。每一条数据记录都包括一个"_ID"数值字段,改字段唯一标识一条数据。URIURI,每一个ContentProvider都对外提供一个能够唯一标识自己数据集(dataset)的公开URI,如果一个ContentProvider管理多个数据集,其将会为每个数据集分配一个独立的URI。所有的ContentProvider的URI都以"content://"开头,其中"content:"是用来标识数据是由ContentProvider管理的schema。在几乎所有的ContentProvider的操作中都会用到URI,因此一般来讲,如果是自己开发的ContentProvider,最好将URI定义为常量,这样在简化开发的同时也提高了代码的可维护性。首先来介绍如何访问ContentProvider中的数据,访问ContentProvider中的数据主要通过ContentResolver对象,ContentResolver类提供了成员方法可以用来对ContentProvider中的数据进行查询、插入、修改和删除等操作。以查询为例,查询一个ContentProvider需要掌握如下的信息:唯一标识ContentProvider的URI,需要访问的数据字段名称,该数据字段的数据类型。4.2.4BroadcastReceiverIntent广播的“消费者”。通过创建和注册一个BroadcastReceiver,应用程序可以监听符合特定条件的广播的Intent。BroadcastReceiver会自动的启动你的Android应用程序去响应新来的Intent。BroadcastReceiver是事件驱动程序的理想手段。BroadcaseReceiver不执行任何任务,仅仅是接受并响应广播通知的一类组件。大部分广播通知是由系统产生的,例如改变时区,电池电量低,用户选择了一幅图片或者用户改变了语言首选项。应用程序同样也可以发送广播通知,例如通知其他应用程序某些数据已经被下载到设备上可以使用。一个应用程序可以包含任意数量的BroadcaseReveiver来响应它认为很重要的通知。所有的BroadcastReceiver都扩展自类BroadcastReceiver。BroadcastReceiver不包含任何用户界面。然而它们可以启动一个Activity以响应接受到的信息,或者通过NotificationManager通知用户。可以通过多种方式使用户知道有新的通知产生:闪动背景灯、震动设备、发出声音等等。通常程序会在状态栏上放置一个持久的图标,用户可以打开这个图标并读取通知信息。在使用BroadcastReceiver前,先要注册BroadcastReceiver,而注册BroadcastReceiver有两种方式,一种是在静态的AndroidManifest.xml中注册,另一种是动态的在代码中注册,以下是两种注册BroadcastReceiver的实例:1)在AndroidManifest.xml中注册Xml代码<receiverandroid:name="Receiver1"><intent-filter><!--和Intent中的action对应--><actionandroid:name="com.forrest.action.mybroadcast"/></intent-filter></receiver>2)在代码中注册Java代码IntentFilterfilter=newIntentFilter("com.forrest.action.mybroadcast");//和广播中Intent的action对应MyBroadcastReceiverbr=newMyBroadcastReceiver();registerReceiver(newMyBroadcastReceiver(),filter);4.3Intent的详细解析在一个Android应用中,主要是由四种组件组成的,这四种组件可参考上一节的内容。而这四种组件是独立的,它们之间可以互相调用,协调工作,最终组成一个真正的Android应用。在这些组件之间的通讯中,主要是由意图协助完成的。意图负责对应用中一次操作的动作、动作对应的数据、附加数据进行描述,Android则根据此意图的描述,负责找到相应的组件,将意图传递给它,并完成组件的调用。因此,意图在这里起着一个媒体中介的作用,专门提供组件之间互相调用的相关信息,实现调用者与被调用者之间的解耦。例如,在一个联系人维护的应用中,当在一个联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后,希望能够调出此联系人的详细信息,为了实现这个目的,listActivity需要构造一个Intent,这个Intent用于告诉系统,要做“查看”动作,此动作对应的查看对象是“某联系人”,然后调用startActivity(intentintent),将构造的Intent传入,系统会根据此intent中的描述,到AndroidManifest.xml中找到满足此Intent要求的Activity。系统会调用找到的Activity,即为detailActivity,最终传入Intent,detailActivitv则会根据此Intent中的描述,执行相应的操作。4.3.1Intent的抽象描述在Android参考文档中,对意图的定义是执行某操作的一个抽象描述。该抽象描述的具体内容如下:首先,它是要执行的动作的一个简要描述,如查看、修改等,Android定义了一套标准动作。此外,还可以根据应用的需要,定义自己的动作,并可定义相应的活动来处理自定义的动作。其次,是执行动作要操作的数据,Android采用指向数据的一个URI方式来实现。另外,除了动作和数据这两个重要属性外,还有一些附加属性:类别:被执行动作的附加信息。例如LAUNCHER_CATEGORY表示意图的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVECATEGORY表示当前的意图是一系列的可选动作中的一个,这些动作可以在同一个数据上执行。数据类型:显式指定意图的数据类型。一般意图的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用指定的类型。组件:指定意图的目标组件的类名称。通常Android会根据意图中包含的其它属性的信息,比如动作、数据/数据类型、类别进行查找,最终找到一个与之匹配的目标组件。附加信息:是其它所有附加信息的集合。使用附加信息可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在附加信息里,传给电子邮件发送组件。总之,动作、数据/数据类型、类别和附加信息一起形成了一种语言。这种语言使系统能够理解诸如“查看某联系人的详细信息”之类的短语。随着应用不断的加入到系统中,它们可以添加新的动作、数据/数据类型和类别来扩展这种语言。应用也可以提供自己的活动来处理已经存在的这样的“短语”,从而改变这些“短语”的行为。4.3.2Android如何解析Intent在应用中,可以以两种形式来使用Intent:(l)直接意图:指定了组件属性的意图。通过指定具体的组件类,通知应用启动对应的组件。(2)间接意图:没有指定组件属性的意图。这些意图需要包含足够的信息,这样系统才能根据这些信息,在所有的可用组件中,确定满足此意图的组件。对于直接意图,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接意图,通过解析,将意图映射给可以处理此意图的活动、意图接收器或服务。意图解析机制主要是通过查找己注册在AndroidManifest.xml中的所有意图过滤器及其中定义的意图,最终找到匹配的意图。在这个解析过程中,Android是通过意图的动作、数据类型、类别这三个属性来进行判断的,判断方法如下:如果意图指明定了动作,则目标组件的意图过滤器的动作列表中就必须包含有这个动作,否则不能匹配。如果意图没有提供数据类型,系统将从数据中得到数据类型。和动作一样,目标组件的数据类型列表中必须包含意图的数据类型,否则不能匹配。如果意图中的数据不是content:类型的URI,而且意图也没有明确指定它的数据类型,将根据意图中数据的格式(比如http:或者mailto:)进行匹配。同上,意图的格式必须出现在目标组件的格式列表中。如果意图指定了一个或多个类别,这些类别必须全部出现在组建的类别列表中。比如意图中包含了两个类别:LAUNCHER_CATEGORY和ALTERNATIVEC_CATEGORY,解析得到的目标组件必须至少包含这两个类别。5.飞机游戏设计5.1研究目标在如今社会,人们的工作学习压力逐渐增大,生活节奏逐渐加快,大多数人没有足够的时间去休闲娱乐,放松自己。这款小型的手机游戏,可以让我们随时随地都能享受游戏,。让我们从繁重的日常生活中解脱出来。游戏的主界面应该力求美观,爽心悦目,以提高玩家对游戏的兴趣。游戏的控制模块应该做到易懂、易操作,以给玩家一个很好的游戏环境。(1)了解Android应用程序的设计和开发过程;(2)使用多种组件进行Android平台校园资讯软件的开发。本软件是基于Eclipse的开发环境,在Android平台上的手机游戏软件。5.2需求细则1、 飞机1) 移动属性:必选描述:能够监听玩家操控。完成下列情况的任一种即可:● 玩家可以通过触摸屏触点的位置不同来控制飞机;● 键盘上的方向键控制飞机;● 点击屏幕上自己绘制的方向键控制飞机。2) 子弹属性:必选描述:飞机能够发射子弹。完成下列情况的任一种即可:● 飞机连续发子弹,只要飞机出现,就持续发射;● 玩家通过某个按键(例如空白键)发射,按一下发射一次。3) 血条属性:必选描述:飞机要有血条,玩家能够根据血条来判断飞机剩余血量。血条必须具有下列特征:● 每被击中,血条都要变短;● 当血条为空时,即判定为死亡。4) 多样性属性:任选描述:飞机具有多样性供玩家选择,完成下列情况的任一种或多种即可:● 飞机可以升级子弹威力;● 飞机可以改变子弹类型;● 可选不同类型的飞机;● 大招:飞机有清屏炸弹等;● 其它更有创意的设计。5) 特殊属性属性:任选描述:飞机多种灵活的特性,完成下列情况的任一种或多种即可:● 飞机有多条命,没死一次就扣除一条命;● 飞机有能量,能量可以用来发大招,可以用来做护罩……;● 复活功能,飞机死亡后可以消耗能量、分数或其它属性来复活;● 其它更有创意的设计。2、 敌机1) 移动属性:必选描述:能够移动。完成下列情况的任一种即可:● 上下飞行;● 斜着飞行;● 画圆、涡旋飞行;● 其它更有创意的设计。2) 子弹属性:必选描述:敌机能够发射子弹3) 碰撞●飞机子弹击中敌机属性:必选判定:子弹只要出现在敌机图片的范围内,即判定为击中描述:敌机被飞机击中,死亡或掉血;玩家加分。● 敌机子弹击中飞机属性:必选判定:子弹只要出现在飞机图片的范围内,即判定为击中描述:飞机被击中,掉血。● 爆炸效果属性:必选描述:发生上述1.3.1时,界面显示爆炸动画。● 敌机和飞机相撞属性:任选判定:只要飞机图片和敌机图片有重叠,即判定为相撞描述:敌机死亡,飞机掉血。● 飞机子弹和敌机子弹相撞属性:任选(此项无分)判定:飞机子弹图片和敌机子弹图片有重叠,即判定为相撞描述:飞机子弹和敌机子弹都消失4) BOSS● 移动属性:必选描述:能够左右移动。● 子弹属性:必选描述:BOSS能够发射子弹。完成下列情况的任一种即可:子弹威力更强;发射更多子弹;子弹路线复杂;其它更有创意的设计。● 血条属性:必选描述:BOSS必须有血条,每被即可即掉血。5) 界面● 开始界面和结束界面属性:必选描述:必须有开始界面和结束界面(当玩家胜利或失败,要输出一个消息“Win”或“GameOver!”)。完成下列情况的任一种即可:仅仅输出输赢信息;显示一张或一些图片;设计一些有创意的动画。● 排行榜属性:必选描述:保存用户自第一次玩本游戏开始到最近一次为止的6次最高分。要求:必须用数据库做。● 设置属性:必选描述:主要记录是否打开音效,游戏难度,操控方式、是否自动发射子弹等。要求:关机后再次开机,部分设置的内容还在(例如音效是否开启),用preference做。6) 音效属性:任选描述:在游戏过程中,有音乐效果。完成下列情况的任一种即可:● 背景音乐;● 发射子弹;● 爆炸;● BOSS发射子弹;● 玩家吃到奖励;● 其它更有创意的设计。5.3UI界面设计游戏总共分为4个界面,分别为游戏开始界面、游戏界面、游戏设置界面、游戏排名界面;如图5-1至5-6:图5-1游戏开始页面设计图5-2游戏页面设计图5-3遇到boss页面设计图5-4排行榜页面设计图5-5游戏设置页面设计图5-6玩家记录页面设计5.4文件结构与用途在程序开发阶段,首先确定“飞机游戏软件”的工程名为Surface_view,据程序模块设计的内容,建立Surface_view工程。Surface_view工程源代码的结构如图5-7所示。为了使源代码文件的结构更加清晰,Surface_view工程设置了多个命名空间,分别用来保存用户界面、数据库和工具实体的源代码文件,源代码文件的名称以及说明,如表5-1:表5-1源代码文件的名称以及说明包名称文件名说明.iotek.Surfacebullet.java我方飞机子弹类.iotek.SurfaceBullet2.java敌机子弹类.iotek.SurfaceBullet3.javaboss子弹类.iotek.Surfacefirst_activity.java图5-1开始页面.iotek.Surfacegameover.java结束的A.iotek.Surfacehistoryscore.java排行榜的A.iotek.Surfaceplanes.java飞机的A.iotek.SurfacesetActivity.java图5-5游戏设置.iotek.SurfaceSurface_viewActivity.java主线程的Activity图5-7工程源代码结构图5.5功能模块图飞机游戏主要功能划分:从启动游戏应用开始到游戏开始主界面的功能选择选择:游戏功能、游戏设置功能、游戏排行榜的查看以及退出游戏。图5-8功能模块图6.各模块设计游戏的主要运用android的Surfaceview功能实现,将背景图片以滚轴的形式在界面匀速滚动实现飞机前进的效果,然后再将飞机和子弹画到Surfaceview上实现游戏的基本功能。游戏主要模块为一个主线程的Activity、一个子弹类、一个飞机类、游戏开始界面的Activity、游戏结束的Activity、游戏设置的Activity和游戏结束的Activity。界面设置运用android自带的XML画出运行界面可以看到的各种画面,主要有按钮button、列表listview,按钮用来运行游戏的点击操作,列表用来存储游戏得分的数据。各界面之间运用Intent进行通信,通过按钮button来进行各个界面的切换:Intentintent1=newIntent(gameover.this,first_activity.class);6.1XML界面布局设计6.1.1游戏开始界面设计主要运用Button按钮来实现,在画布布局上画出4个功能按钮,定义按钮的属性(height和width)并进行按钮功能的关联选择,分别给4个按钮划分4个id,分别为:button1、button2、button3、button4。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android" android:orientation="vertical" android:layout_height="wrap_content" android:layout_width="match_parent" android:background="@drawable/menu"> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/button1" android:text="开始游戏" /> <Button android:text="游戏排名" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:text="游戏设置" android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:text="退出游戏" android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>6.1.2游戏得分记录界面设计主要采用了ListView功能,来实现用户姓名的录入,这里的ListView是一个单行列表框,用来存储游戏记录的用户。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="@drawable/rank"><ListView android:id="@+id/list_view" android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_weight="1" /> <Button android:id="@+id/but_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="返回"/></LinearLayout>6.1.3游戏设置界面设计主要运用CheckBoxPreference控件来实现功能的选择,这里的CheckBoxPreference是一个是否选择按钮,并用android:key="CheckBox1"来关联是否选项。<?xmlversion="1.0"encoding="utf-8"?><PreferenceScreenxmlns:android="/apk/res/android"><PreferenceCategoryandroid:title="声音设置"><CheckBoxPreferenceandroid:key="CheckBox1"android:title="声音选择"android:summaryOn="声音:开启"android:summaryOff="声音:关闭"android:defaultValue="true"/></PreferenceCategory><PreferenceCategoryandroid:title="难度设置"><CheckBoxPreferenceandroid:key="CheckBox1"android:title="难度选择"android:summaryOn="超级模式:开启"android:summaryOff="超级模式:关闭"android:defaultValue="true"/></PreferenceCategory></PreferenceScreen>6.1.4玩家记录界面设计采用TextView来显示姓名栏,在用EditText来关联数据库存储的游戏得分,并把刚刚在ListView输入的用户姓名关联进来,这里的EditText是一个单行文本框。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="@drawable/over"><TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="性名" /> <EditText android:id="@+id/name_txt" android:layout_width="match_parent" android:layout_height="wrap_content" /><Button android:id="@+id/but_ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="确定"/> <Button android:id="@+id/but_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="取消"/></LinearLayout>6.2游戏各功能实现代码6.2.1飞机类定义自己定义的飞机类,定义了飞机的坐标px和py,以及飞机的图片Bitmap;然后通过nextInt(n)来控制飞机的数量,这里用的random.nextInt(3)表示1-3之间的随机飞机架数,子弹类定义参照飞机类。publicclassplanes{ privateintpx; privateintpy; privateBitmapbitmap; publicplanes(){ super(); } publicplanes(intpx,intpy,Bitmapbitmap){ super(); this.px=px; this.py=py; this.bitmap=bitmap; } publicBitmapgetBitmap(){ returnbitmap; } publicvoidsetBitmap(Bitmapbitmap){ this.bitmap=bitmap; }publicvoidplane(Canvascanvas){ Randomrandom=newRandom(); canvas.drawBitmap(bitmap,px+=random.nextInt(3),py+=random.nextInt(5),null);//控制飞机出现的数量}}6.2.2飞机移动设计飞机的移动设计采用触屏和按键两种操作方式,运用安卓自带的封装类onTouchEvent(触屏)和onKeyDown(按键)来实现。触屏操作为手指点击屏幕,则飞机直接飞到手指触发的那一个坐标上,按键操作为点击上下左右,飞机以坐标10的间距上下左右移动,整个屏幕的坐标以像素为主,本游戏采用的是320*480.//触屏控制 @Override publicbooleanonTouchEvent(MotionEventevent){ x=(int)event.getX(); y=(int)event.getY(); returnsuper.onTouchEvent(event); } //键盘的控制 @Override publicbooleanonKeyDown(intkeyCode,KeyEventevent){ switch(keyCode){ caseKeyEvent.KEYCODE_DPAD_UP: y-=10; break; …… } returnsuper.onKeyDown(keyCode,event); }6.2.3子弹的绘制运用安卓自带的Surfaceview功能,使用bul.add调用子弹类,add里面的函数newbullet(…)定义子弹的初始位置,把子弹一个个图片画在画布上(循环滚动的背景图片),用2个自定义的时间参数firsttime、twotime来控制子弹发射的频率,(参数pla1为敌机,参数pla2为敌方boss)。//我方子弹的绘制 if(firsttime-twotime>800){ bul.add(newbullet(x+bmp_air.getWidth()/4,y -bmp_air.getHeight(),bmp_bullet_blue)); twotime=firsttime; }//敌机子弹的绘制 if(firsttime-fivetime>5000){ for(planesp:pla1){ bul2.add(newbullet2(p.getPx()+bmp_plane2.getWidth() /2,p.getPy()+bmp_plane2.getHeight(), bmp_bullet_red)); } for(planesp:pla2){ bul2.add(newbullet2(p.getPx()+bmp_plane2.getWidth() /2,p.getPy()+bmp_plane2.getHeight(), bmp_bullet_red)); } fivetime=firsttime; }6.2.4飞机碰撞设计碰撞设计运用坐标x和y来实现,当子弹的坐标x、y等于飞机的坐标x、y时触发条件:子弹碰撞敌机时,子弹消失bul.remove(n),敌机消失pla1.remove(m);子弹撞击我方飞机时,子弹消失bul2.remove(n),我方飞机血量减少(血量运用安卓里面的Rect函数,根据起始坐标跟长度来定义矩形,先在底层画一条红色矩形,然后在红色矩形上画黄色,通过黄色长度的变化来体现血量的变化,每次子弹打中我方飞机,黄色rect3长度-10)。//子弹打BOSS for(n=0;n<bul.size();n++){ if(Hit(bmp_boss,bul.get(n).getBx(),plane_x1,bul .get(n).getBy(),plane_y1)){ canvas.drawBitmap(bmp_bomb,plane_x1,plane_y1, null); number1--; }}//子弹打敌机 for(n=0;n<bul.size();n++){ for(m=0;m<pla1.size();m++){ if(Hit(bmp_plane2,bul.get(n).getBx(),pla1.get(m) .getPx(),bul.get(n).getBy(),pla1.get(m) .getPy())){ canvas.drawBitmap(bmp_bomb,pla1.get(m).getPx(), pla1.get(m).getPy(),null); pla1.remove(m); bul.remove(n); score+=200; n--; m--; break; } } }//敌方子弹打我 if(number2>0){ //我方血条 intbloodair=(int)(screenWidth*(number2/10.0)); Rectrect1=newRect(0,screenHeigh-10,bloodair, screenHeigh); Rectrect3=newRect(0,screenHeigh-10,screenWidth, screenHeigh); canvas.drawRect(rect3,paint4); canvas.drawRect(rect1,paint1); for(n=0;n<bul2.size();n++){ if(Hit(bmp_air,bul2.get(n).getBx2(),x,bul2.get(n) .getBy2(),y)){ canvas.drawBitmap(bmp_bomb,x,y,null); bul2.remove(n); n--; number2--; //info(number2+""); } } //敌方敌机1撞我 for(m=0;m<pla1.size();m++){ if(Hit(bmp_air,pla1.get(m).getPx(),x,pla1.get(m) .getPy(),y)){ canvas.drawBitmap(bmp_bomb,x,y,null); pla1.remove(m); m--; number2-=2; break; } } //敌方敌机2撞我 for(m=0;m<pla2.size();m++){ if(Hit(bmp_air,pla2.get(m).getPx(),x,pla2.get(m) .getPy(),y)){ canvas.drawBitmap(bmp_bomb,x,y,null); pla2.remove(m); m--; number2-=4; break; } } } //BOSS子弹打我 for(m=0;m<bul3.size();m++){ if(Hit(bmp_air,bul3.get(m).getBx3(),x,bul3.get(m) .getBy3(),y)){ canvas.drawBitmap(bmp_bomb,x,y,null);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国银杏树数据监测研究报告
- 《心脏讲课用》课件
- 《路基路面定额》课件
- 海洋知识竞赛复习测试卷含答案
- 《担当的命题作文》课件
- 银行保险衔接训练课件-客户类型分析
- 《功率高中物理》课件
- 《高等数学A习题课》课件
- 【语文】《促织》课件++2024-2025学年统编版高一语文必修下册
- 《POP字体书写》课件
- DBJ41-139-2014 河南省基坑工程技术规范-(高清版)
- 幼儿园讲座地铁小知识介绍
- 隐蔽工程工验收记录(表C5-1)
- T-CAMET 04017.7-2019 城市轨道交通 全自动运行系统规范 第7部分:运营管理
- 小升初、小学生满分优秀作文汇编100篇
- 次声波在临床医学及麻醉中的作用 次声波在临床麻醉中的作用
- 完整版新能源汽车充电站应急预案
- TS16949五大工具:SPC
- 五年级下册-综合实践教案
- 依据FEM9851所作堆垛机循环时间计算
- 牛津大学剑桥大学介绍课件
评论
0/150
提交评论