基于Android的飞机大战游戏设计与开发.doc_第1页
基于Android的飞机大战游戏设计与开发.doc_第2页
基于Android的飞机大战游戏设计与开发.doc_第3页
基于Android的飞机大战游戏设计与开发.doc_第4页
基于Android的飞机大战游戏设计与开发.doc_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于android的飞机大战游戏设计与开发luoyang normal university 2013届本科毕业设计基于android的飞机大战游戏设计与开发院(系)名称信息技术学院专 业 名 称 软件工程 学生姓名学号指导教师xxx副教授完 成 时 间2013年5月摘要相信android(安卓)已经为人们熟知,经过2011年的洗礼,android智能手机火速上位,甚至说现在手机系统由ios和android平分也不为过。随着android智能手机在中国内地的风靡,基于android平台的应用开发也逐渐成为it开发的一大热门。游戏是智能机不可或缺的应用之一,“水果忍者”、“愤怒的小鸟”等android游戏应用的成功,让人看到手机游戏在android平台上的巨大发展空间。基于此,采用eclipse和android adt作为集成开发平台,开发本android游戏app。本应用为android飞机大战游戏,主要有6个操作界面分别为开始界面,游戏界面,设置界面,得分界面,win界面,lose界面。玩家可以选择自己进入设置界面对游戏进行设置,或进入的分界面查看自己本次操作是否在前六名等操作。作为游戏背景音乐的存在是不可或缺的,本应用在不同的操作界面演奏不同的背景音乐,玩家还可以在设置界面设置背景音乐的大小。由于android控件activity的生命周期的特点,本应用会在被点击“exit”按钮的activity中发送一个exit的广播,所有的本应用的activity收到广播后会自动结束,使得本应用能够完全的退出系统。本应用采用android的surfaceview绘制游戏界面,游戏的主界面美观,赏心悦目,以提高玩家对游戏的兴趣。游戏的控制模块应该做到易懂、易操作,以给玩家一个很好的游戏环境。关键词:android开发;手机游戏;java;sqliteiabstractandroid has been known for people, after 2011 years of baptism, android smartphone developing fast . android occupies a large share in the market . android game application is successful, it make a person see that mobile games on the android platform of the huge development space. based on this,we using eclipse and android adt as integrated development platform, to develop the android game application.this application for android plane war games include six operating interface, respectively as the start screen, the game interface and set interface, win interface, lose interface. players can choose interface to play the game. as the mobile phone game background music is indispensable, the application play different background music in different interface, players can also set the size of the background music in setting interface.this application using the android surfaceview to draw game interface, game interface pleasing to the eye by people to play. i n order to give players a good game environment , the control module of game should be simple, easy to operate.keywords : android programing; mobile phone games ; java programing ;sqlite目 录第1章 绪论11.1 系统开发背景11.2 系统研究目的和意义11.3 可行性分析1第2章 系统需求分析22.1 用户功能需求分析22.2 系统性能要求32.3 业务流程分析3第3章 系统总体设计43.1 系统功能模块分析43.1.1系统管理43.1.2 app应用设置43.1.3 玩家信息管理43.2 系统类关系图43.3 系统总体设计6第4章 系统详细设计84.1 开发工具简介84.2 数据库设计84.2.1 dao(数据库访问对象)94.2.2 sqlite数据库124.3 游戏界面设计124.3.1开始界面124.3.2游戏界面194.3.3设置界面264.3.4 得分界面344.3.5 win界面414.3.6 lose界面46第5章 软件测试和调试515.1 白盒测试法515.2 黑盒测试法52第6章 工作总结和展望53参考文献54致 谢55iii第1章 绪论1.1 系统开发背景 随着科技的发展,现在手机的功能已不仅仅是简单的接打电话、收发短信了。更多的手机用户希望在工作、学习之余通过方便灵巧可随身携带的仪器休闲娱乐。因此,为了迎合众多用户的需求并适应现在手机的规模,我们开发出一套适合各阶层人士的具有很强的娱乐性和交互性的飞机小游戏。虽然现在市面上存在着各种各样的游戏版本,可是飞机游戏其市场还是相当大的。因为它的特殊在于人们在玩游戏的时候的过程中使爱不释手。随着游戏关卡不断提高,其难度也更大,刺激性也更强。可以说该游戏的优势在于它的简单易行,不论是手机,还是小游戏机,都能很快顺利的运行。对于在外忙碌的人,不可能花费大量时间在娱乐上,大型游戏是行不通的。这样的小游戏刚好迎合了他们的需求。1.2 系统研究目的和意义在如今社会,人们的工作学习压力逐渐增大,生活节奏逐渐加快,大多数人没有足够的时间去休闲娱乐,放松自己。这款小型的手机游戏,可以让我们随时随地都能享受游戏,从繁重的日常生活中解脱出来。游戏的主界面应该力求美观,赏心悦目,以提高玩家对游戏的兴趣。游戏的控制模块应该做到易懂、易操作,以给玩家一个很好的游戏环境。1.3 可行性分析该系统采用eclipse集成android adt为开发平台进行app开发。eclipse是一个开放的源代码的、基于java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。虽然大都数用户很乐于eclipse当作java集成开发环境(ide)来使用,但eclipse的目标却不仅限于此。eclipse还包括插件开发环境,这个组件主要针对希望扩展eclipse的软件开发人员,因为它允许他们构建与eclipse环境无缝集成的工具。由于eclipse中的每样东西都是插件,对于eclipse中的每样东西都是插件,对于给eclipse提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。基于eclipse的应用程序的插件开发诸如siemens公司的plm产品teamcenter的插件级开发。android专门针对eclipse开发做了adt(android developer tools)开发插件,因此该应用使用eclipse开发完全可行。55基于android的飞机大战游戏设计与开发第2章 系统需求分析2.1 用户功能需求分析由于本程序简单易操作,交互性好,对用户没什么特别要求。一般用户经过几分钟练系都可以熟悉本游戏的规则。 图2-1 功能界面示例图 图2-2 游戏界面示例图2.2 系统性能要求1.实时性本应用为手机游戏因此对于用户的操作必须做出立即响应,否则本游戏即为失败。2.易操作性单机手机游戏的最大特点即为易操作性,用户在不看说明的情况下也能够玩,并且在玩过几遍之后即熟悉本游戏的规则。这是本应用对于操作性的要求。2.3 业务流程分析依据系统的需求分析,得到系统的流程图如图2-3所示:图2-3 系统流程图第3章 系统总体设计3.1 系统功能模块分析当前应用使用的surfaceview来绘制的页面因此相对来说大部分逻辑都是由activity来做处理的。本系统的功能模块也根据activity的不同来划分成6个功能模块。3.1.1系统管理 各个操作界面布局适当,颜色搭配等要美观。各个activity之间的切换要快速(ps:它们各自的背景音乐也要随之切换,给用户以顺畅、自然的感觉)。用户在任何一个activity点击“exit”按钮或contextmenu中的“退出”都要成功的将当前应用挂起的多个acitivity和当前android虚拟机显示的activity顺利的停止,并销毁。3.1.2 app应用设置设置应用系统背景音乐声音大小和游戏难度。使用seekbar来控制系统音量,使用radiogroup来控制飞机难度。3.1.3 玩家信息管理在游戏结束时对于玩家的名称和得分进行记录,并在玩家查看排名情况时,以倒序形式显示前六名玩家的得分和姓名等信息。3.2 系统类关系图系统实体类、边界类、控制类之间的关系如图3-1所示:图3-1 实体类、控制类、边界类之间的关系各个界面类之间的关系如图3-2所示:图3-2 app边界类关系3.3 系统总体设计系统的中只有玩家一种用户,不必向其他的网站或者是教务系统一样进行身份验证等操作。玩家点击应用图标直接进入应用的开始界面。用户的操作总体可以归并成如3-3玩家用例图所显示的内容,子弹的用例图如图3-4所示,飞机的用例图如图3-5所示。用户的操作基本可以划分为“开始游戏”,“设置游戏”,“玩游戏”,“查看分数”,“退出游戏”这五个用例。图3-3 玩家用例图图3-4 子弹用例图图3-5 飞机用例图第4章 系统详细设计4.1 开发工具简介android开发工具(adt)是一个插件的eclipse ide,目的是给开发人员提供一个强大的、集成的环境中构建android应用程序。扩展能力的eclipse adt让你迅速建立新的android项目,创建一个应用程序的用户界面,添加基于安卓框架的api,调试您的应用程序使用android sdk工具,生成apk文件在使用eclipse运行android应用的时候eclipse会自动的将生成的apk文件自动的注册到android虚拟机中。在eclipse adt发展与高度推荐,是一种最快的方式开始。与引导项目设置它提供,以及工具集成、定制xml编辑器和调试输出窗格,adt给了你极大的提高在发展中android应用程序。使用eclipse集成android adt做android应用开发是目前企业中常用的android应用开发方式。本项目在开发环境:l jdk 1.7 l eclipse 3.7.0l android adt4.03 4.2 数据库设计本应用使用的是android虚拟机做开发,因此使用的为android虚拟机中自带的数据库sqlite。本应用只是在针对用户得分及用户姓名等基本信息进行存储,因此数据库非常简单,仅仅是设计了一个用来存储用户排名信息的表结构。用来存储用户基本信息的compositor_table的字段信息如图4-1所示。create table compositor_table (id integer primary key,name varchar(40) not null,score integer not null)图4-1 compositor表android中自带的sqliteopenhelper 作用:一个帮助类,帮助创建数据库和数据库版本管理。本应用直接创建一个skygamedatabasehelper类继承android自带的数据库操作类sqliteopenhelper。在oncreate()方法中创建表compositor_table。public void oncreate(sqlitedatabase db) / todo auto-generated method stubstring create_table = this.context.getresources().getstring(r.string.create_compos_table);/ create table compositor_table (id integer primary key,name varchar(40) not null,score integer not null);db.execsql(create_table);4.2.1 dao(数据库访问对象)本应用中的数据库访问对象skygamedatabasedao采用了单例模式,以保证当前应用中只存在一个dao数据库访问对象。使用了最简单的单例,并未从线程安全的角度进行进一步的限制,原因在于考虑到当前应用中只有3个activity使用了dao,由图4-2可知activity之间的切换类似于进程对于cpu的占用一样,当前显示在界面上的activity是活动状态而其他activity则是挂起状态,因此不必担心它们的线程同时去创建dao对象以引起当前系统中多个dao对象的状况。public class skygamedatabasedao private static skygamedatabasedao instance = null;private sqlitedatabase database = null;private context context = null;private skygamedatabasehelper helper = null;public static skygamedatabasedao getinstance (context context)if(instance = null)instance = new skygamedatabasedao(context);return instance;private skygamedatabasedao(context context)this.context = context;helper = new skygamedatabasehelper(context,1);while(this.database = helper.getwritabledatabase()=null);public void insertplayer(skygameplayer player)string sql = context.getresources().getstring(r.pos_table);contentvalues values = new contentvalues();values.put(score,player.getscore();values.put(name, player.getname();if(!this.database.isopen()this.helper.onopen(this.database);try this.database.begintransaction();this.database.insert(sql, null, values);this.database.settransactionsuccessful(); catch (exception e) / todo auto-generated catch blocke.printstacktrace();finallythis.database.endtransaction();public arraylist getplayers()arraylist players = new arraylist();string sql = context.getresources().getstring(r.string.select_form_compos_table_count);cursor cursor = database.rawquery(sql, null);cursor.movetofirst();if(cursor.getcount() 0)int count = 0;count+;players.add(new skygameplayer(count,cursor.getstring(1),cursor.getint(2);while(cursor.movetonext()count +;players.add(new skygameplayer(count,cursor.getstring(1),cursor.getint(2);return players;public void delete()string sql = context.getresources().getstring(r.string.delete_from_compos_table);if(!this.database.isopen()this.helper.onopen(this.database);try this.database.begintransaction();this.database.execsql(sql);this.database.settransactionsuccessful(); catch (sqlexception e) / todo auto-generated catch blocke.printstacktrace();finallythis.database.endtransaction();public void close()if(this.database.isopen()this.database.close();图4-2android中activity生命周期状态图4.2.2 sqlite数据库sqlite,是一款轻量级的关系型数据库。由于它占用的资源非常少,所以在很多嵌入式设备都是用sqlite来存储数据。android作为目前主流的移动操作系统,完全符合sqlite占用资源少的优势,故在android平台上,集成了一个嵌入式关系型数据库sqlite。由于sqlite是轻量级的关系型数据库,它支持的sql语句也是有限的,在使用sql语句获得前6名玩家的信息时直接使用了sqlite不支持的top语句引起了异常。在查阅相关资料后才发现sqlite不支持top语句,因此使用语句desc limit来代替top达到了自己想要的只获得表compositor_table中的score字段值最大的前六个记录信息。select * from compositor_table order by score desc limit 64.3 游戏界面设计4.3.1开始界面使用surfaceview将图4-3中的未被按下的按钮和图4-5游戏开始界面背景图片绘制成游戏开始界面图4-6。图4-3 未被按下的按钮图标集图4-4 被按下的按钮图标集图4-5 开始界面背景图片图4-6 开始界面 androidmanifest.xmlandroid应用程序中,并没有像c+和java这样有main函数来作为应用程序的入口。android应用程序提供的是入口activity,而非入口函数。androidmanifest.xml文件中定义了整个android应用所包含的activity.在androidmanifest.xml中将skygamestartactivity设置为当前skygame启动时,默认加载的activity,代码如下: activity中注册layout在skygamestartactivity的oncreate方法中设置要显示的layout,方法如下所示:protected void oncreate(bundle savedinstancestate) / todo auto-generated method stubsuper.oncreate(savedinstancestate);setcontentview(r.layout.sky_game_start_layout);/设置当前activity调用的layout/其他操作 broadcastreceiver由于本应用是有多个activity为了解决多个activity在其中任意一个activity结束时都会相应一起退出系统,因此针对每一个activity设置一个broadcastreceiver来接收广播,一旦接收到广播当前activity自动退出。activity接收到广播后退出的代码如下所示:private broadcastreceiver exitreceiver = new broadcastreceiver()overridepublic void onreceive(context context, intent intent) / todo auto-generated method stubskygamescreenrollactivity.this.finish(); 发送广播而当前activity在被按下“exit”或者“退出”按钮时,会向外界发送一个广播,之后结束自己:activity activity = (activity)context;intent intent = new intent(exit);intent.setaction(exit);activity.sendbroadcast(intent);activity.finish(); mediaplayer(媒体播放器)本应用使用android的mediaplayer来演奏每一个页面的背景音乐。背景音乐可以存放在两个位置,一个是当前工程的/res/raw目录下,如果是存放在该目录下的话,在install当前android工程时,需要耗费非常的时间将此类音频文件上传到android虚拟机中。另一个存放位置是直接将音频文件上传到ddms的/mnt/sdcard/music文件夹下,这相当于将该音频文件放入到了android手机的sd卡上了,相对于存放位置一来说,该方法在加载android工程时消耗的时间比较少。具体向虚拟机中上传文件如图4-7所示:图4-7 ddms向android虚拟机中上传文件mediaplayer使用方法:private mediaplayer startsound = null;startsound = new mediaplayer();try /* * 从sdcard中获得音频文件的路径 */startsound.setdatasource(/mnt/sdcard/music/start.mp3);startsound.prepare(); catch (illegalargumentexception e) / todo auto-generated catch blocke.printstacktrace(); catch (securityexception e) / todo auto-generated catch blocke.printstacktrace(); catch (illegalstateexception e) / todo auto-generated catch blocke.printstacktrace(); catch (ioexception e) / todo auto-generated catch blocke.printstacktrace();startsound.setlooping(true) ;/设置循环由于当前应用针对不同的显示界面(activity)有不同的背景音乐,因此当前activity挂起时,对应的背景音乐也要挂起(startsound.pause())。而在当前activity销毁(destory)时,需要对背景音乐进行停止(startsound.stop())和回收(startsound.release())操作。 layout中调用surfaceview普通的layout设置与直接调用surfaceview的layout有所不同,一下列出调用surfaceview的layout的格式: 此处使用自定义surfaceview的绝对路径来编写开始页面的layout文件,使得开始页面直接使用该surfaceview绘制的bitmap作为背景图片来显示。surfaceview所需要设置下它的surfaceholder 和monitor(实现callback接口)属性holder = getholder();monitor = new monitor();holder.addcallback(monitor);monitor类的方法:方法surfacecreated(surfaceholder holder)的主要作用是:在surfaceview创建的绘制surfaceview的内容。方法surfacedestroyed(surfaceholder holder)的主要作用是:在surfaceview销毁时对于当前surfaceview中的一些对象做销毁处理。surfaceview的方法:ontouchevent(motionevent event)可以捕获鼠标对于屏幕的触碰事件,在该方法中对于鼠标触碰的区域做出判断如果点击的为按钮图片的位置则会调用图4-4中对应的被按下按钮来显示,如此显示使用户有一个可感受的按钮被按下的动态即视感,用户体验更好。public boolean ontouchevent(motionevent event) / todo auto-generated method stubint action = event.getaction();float eventx = event.getx();float eventy = event.gety();if(eventx = start_x)&(eventx = start_y)&(eventy = option_x)&(eventx = option_y)&(eventy = score_x)&(eventx = score_y)&(eventy = exit_x)&(eventx = exit_y)&(eventy = exit_y + exitbutton.getheight()if(action = motionevent.action_down)scorebutton = bitmapfactory.decoderesource(getresources(), r.drawable.exit_button_2);drawexitbutton();if(action = motionevent.action_up)scorebutton = bitmapfactory.decoderesource(getresources(), r.drawable.exit_button_1);drawexitbutton();activity activity = (activity)context;intent intent = new intent(exit);intent.setaction(exit);activity.sendbroadcast(intent);activity.finish();return true;4.3.2游戏界面本界面与开始界面都是使用surfaceview绘制的界面,由于本界面相对于开始界面更加复杂在主线程外创建了子线程来负责对于surfaceview的绘制工作,主线程负责对于各类对象的控制计算等计算工作。由于游戏界面涉及到的类比较多,且逻辑复杂,所以在这里只介绍下使用的空间、技术以及业务逻辑,粘贴部分技术代码。绘制的游戏界面如图4-8所示:图4-8游戏界面 activity中注册surfaceview游戏界面并没有像开始界面那样注册surfaceview,而是直接在oncreate方法中使用代码注册的自定义surfaceview,如下:private skygamescreenrollview sr = null;/自定义surfaceviewprotected void oncreate(bundle savedinstancestate) / todo auto-generated method stubsuper.oncreate(savedinstancestate);sr = new skygamescreenrollview(this);sr.setlayoutparams(new layoutparams(layoutparams.match_parent, layoutparams.match_parent);sr.setid(0x000101);setcontentview(sr); contextmenu控件游戏界面使用了android的contextmenu,contextmenu显示的具体效果见图4-9。图4-9 contextmenu效果contextmenu针对某个控件,一旦为某个控件设置了contextmenu,那么程序员将不能再实现该控件的长按事件处理了。contextmenu的使用步骤:1. contextmenu针对的是控件而不是窗体,构建完contextmenu后需要与一个控件实施绑定。绑定的代码为:super.registerforcontextmenu(控件对象)。2.构建contextmenu的方法如下:a.创建一个res/menu/*_context.xml的菜单(当前应用使用的该方法)。b.重写oncreatecontextmenu()回调函数。c.super.registerforcontextmenu(控件对象)。3.为每个菜单项编写事件。具体操作方法重写oncreatemenuitemselected回调函数。游戏界面的contextmenu的playing_game_option_menu.xml内容如下: 在游戏界面的skygamescreenrollactivity的方法oncreateoptionsmenu(menu menu)中注册playing_game_option_menu.xml文件,具体方法如下所示:public boolean oncreateoptionsmenu(menu menu) / todo auto-generated method stubmenuinflater inflater = new menuinflater(this);inflater.inflate(r.menu.playing_game_option_menu, menu);return true;在游戏界面的skygamescreenrollactivity的方法onoptionsitemselected(menuitem item)中为每个菜单选项编写响应事件,具体使用方法如下所示:public boolean onoptionsitemselected(menuitem item) / todo auto-generated method stubintent intent = null;switch(item.getitemid()case r.id.pg_option_exit:intent = new intent();intent.setaction(exit);this.sendbroadcast(intent);this.finish();break;case r.id.pg_option_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论