毕业论文基于Android平台的坦克大战游戏设计17015.doc

上传人:laozhun 文档编号:2394303 上传时间:2023-02-17 格式:DOC 页数:27 大小:153KB
返回 下载 相关 举报
毕业论文基于Android平台的坦克大战游戏设计17015.doc_第1页
第1页 / 共27页
毕业论文基于Android平台的坦克大战游戏设计17015.doc_第2页
第2页 / 共27页
毕业论文基于Android平台的坦克大战游戏设计17015.doc_第3页
第3页 / 共27页
毕业论文基于Android平台的坦克大战游戏设计17015.doc_第4页
第4页 / 共27页
毕业论文基于Android平台的坦克大战游戏设计17015.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《毕业论文基于Android平台的坦克大战游戏设计17015.doc》由会员分享,可在线阅读,更多相关《毕业论文基于Android平台的坦克大战游戏设计17015.doc(27页珍藏版)》请在三一办公上搜索。

1、摘 要本设计采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。在开始游戏后,可以对游戏的进行一些初始设置。在游戏按钮主页面上面有三个按钮,这三个按钮分别是开始游戏,设置音效和积分榜。设置音效分为背景音乐的设置还有音效的设置,这里的设置主要是开关。音乐是背景音乐,音效是当发射子弹时,带的声音还有当子弹击中敌方坦克时,发出的爆炸声。积分榜是玩家的得分展示,游戏最后可以根据积分来判断玩家是否破纪录,如果破纪录,则游戏结束时界面会显示恭喜你破纪录了,如果没有破纪录,则会显示请再接再厉。开始游戏,玩家可以通过主界面上面的虚拟按钮来控制主角的左右移动,通过触屏来控制坦克炮筒的角度,并且发射子

2、弹。敌方单位随机的出现在屏幕上,然后经过一段弧形的路径,如果在移动过程中被子弹击中,子弹和坦克会消失,如果没有被子弹击中,则会判断该坦克是否在屏幕上面,在屏幕上面就会继续移动,不在屏幕上面该目标就会消失。分数的记录是在60秒内,主角坦克击中敌方坦克的数量。关键词:面向对象 坦克大战 Java Socket 类AbstractThis design uses an object-oriented design patterns, all objects in the game to give the concept of objects and attributes. At the beginn

3、ing of the game, the game can make some initial setup. Button home side in the game with three buttons, which are three buttons to start the game, set the audio and standings. Set audio settings and background music into sound settings, set the main switch here. Music is background music, sound effe

4、cts when firing bullets, the bands sound as well as the bullet hit enemy tanks, the issue of the explosion. Standings show the players score, the game can eventually points to determine whether the player according to the record, if the record, the game is over when the screen displays Congratulatio

5、ns on your record, if not record-breaking, it will display your persistent efforts. Start the game, players can virtual buttons above the main interface to control and move around the protagonist, through the touch screen to control the angle of the tank barrel and firing bullets. Enemy units random

6、ly appear on the screen, and then after a curved path during the move if hit by a bullet, bullets and tanks will disappear, if not hit by a bullet, it will determine whether the screen above the tank , will continue to move in the screen above, not on the screen above the target disappears. Scores r

7、ecord is within 60 seconds, the protagonist hit enemy tanks tank number.Keywords:Object-oriented Tankedaizhan Java Socket class目 录第1章 绪论11.1 系统开发背景11.2 相关技术介绍1 1.2.1 Eclipse 1 1.2.2 ADT2 1.2.3 Android SDK21.2 Android、C语言、C+三种主流编程技术比较2第2章 需求分析32.1 游戏设计的需求分析32.2 功能上需解决的问题3第3章 概要设计53.1 系统功能设计5 3.1.1主角5

8、 3.1.2背景音乐和音效5 3.1.3敌方坦克63.2 系统功能设计流程63.3 坦克大战相关功能联系设计7第4章 详细设计104.1 坦克大战主要类基本功能分析104.1.1 主类104.1.2 欢迎界面104.1.3 按钮主页面114.1.4主角124.1.5 子弹124.1.6音乐和音效134.1.7敌方坦克144.1.8最高分数144.1.9 游戏结束154.1.10其他一些相关的线程和类154.2 重要算法的实现154.2.1 敌方坦克出现消失路径算法154.2.2 最高分数类存储算法164.2.3坦克炮筒角度的计算算法17总结与展望19致 谢21参考文献23第1章 绪 论1.1

9、系统开发背景 游戏软件业是一个新兴行业,存在着巨大的生存和发展空间,同时它也是一个存在社会争议的行业。 游戏的完整定义可以归纳为:一种由道具和规则构建而成、由人主动参与、有明确目标、在进行过程中包含竞争且富于变化的以娱乐为目的的活动,它与现实世界相互联系而又相互独立,能够体现人们之间的共同经验,能够体现平等与自由的精神。游戏产业准确地讲应该叫做电子娱乐业,是指基于电子技术、计算机技术、软件技术、网络技术和无线技术的新型娱乐产业,分为单机游戏、网络游戏和无线游戏等几个部分。电子游戏业从诞生至今已经有几十年的时间,可仅仅在这短短的几十年的时间里,它却在发达国家的经济发展中发挥了显著的作用。 游戏软

10、件业从诞生到现在,历经几代的发展,已进入了一个非常成熟的时期。对于我国而言,游戏软件业也有快速的发展,但是因为很多原因阻碍了这个产业的发展,如游戏软件研发人才缺乏,软件开发投入不足;对青少年的负面影响,一些不健康的游戏软件导致了社会对游戏软件的偏见;技术滞后等情况。坦克大战游戏是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个坦克大战时代。究其历史,坦克大战最早还是出现在FC机上,现在又重新掀起这股让人沉迷的坦克大战风潮,它的规则简单,容易上手,且游戏过程变

11、化无穷,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。这次练习的是在VisualstudioC+2003上生成坦克大战游戏。MicrosoftVisualC+是一个非常好的windows软件开发程序,很多的windows平台下的软件都是把它作为辅助工具编写出来的。现在使用得比较多的是6.0版和.NET版,随着版本的提高,Microsoft给我们提供的函数数据库也越来越方便,越来越丰富了。当完成时,觉得自己在不知不觉中已跨入了它的大门。使用MicrosoftVisualstudioC+几乎可以做出一切东西来,从即时战略到三维RPG游戏。当然还有各种应用软件了。如果要开发

12、出更复杂的游戏,就还需要学习更多的东西,为了提高显示速度,需要使用DirectX,为了制作3D图像,又要使用Direct3D。由于游戏的流程和内部原理很复杂,所以需要学习数据结构、图形学学习这么多专业知识需要很大的努力,不过我心中有一个梦想,那么再难的目标也能实现。“千里之行,始于足下”,尤其是在迈出了坦克大战的第一步之后,实际上,已经走进了软件开发,尤其是游戏开发的大门,前面的世界是美丽多彩而又充满挑战的。 1.2相关技术介绍1.2.1 EclipseEclipse是著名的跨平台的自由集成开发环境(IDE)。其本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的I

13、DE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE,因此得到众多组织定力支持。1.2.2 ADT这是Eclipse插件,作用是关联Android SDK,使Eclipse能够新建Android工程。1.2.3 Android SDKAndroid SDK全称为Android Software Development Kit,它提供在Windows/Linux/Mac平台上开发Android应用的开发组件。包含在Android平台上开发移动应用程序的各种工具集,主要是由以下5个部分组成:Andriod模拟器(AVD Manager.exe):运行在计算机上的虚拟移动模

14、拟器,可以使用模拟器来在一个实际的Android运行环境下设计,调试和测试应用程序。调试监视服务(ddms.bat):它集成在Dalvik(Android平台虚拟机)中,用于管理运行在模拟器或设备上的进程,并协助进行调试。可以用它来去除进程,选择一个特定程序来调试,生成跟踪数据,查看堆和线程数据,对模拟器或设备进行屏幕快照等。Android调试(sb.exe):它用于向模拟器或手机设备安装应用程序的apk文件和从命令行访问模拟器或手机设备。也可以用于将标准的调试器连接到运行在android模拟器或手机设备上的应用代码。SQLite数据库(sqlite.exe):Android应用程序可以创建和

15、使用SQLite数据文件,开发者和使用者也可以方便的访问这些数据文件。创建SD卡工具(mksdcard.exe):主要用于模拟手机SD卡。在创建AVD中,可以选择该工具作为SD卡。 1.2 Android、C语言、C+三种主流编程技术比较Android(Java) 语言是一种跨平台,适合于分布式计算环境的面向对象编程语言。JAVA现在主要用在WEB开发,手机游戏及一些平台游戏的开发,因为它具有很好的跨平台性,在手机等各种电子产品上应用非常广泛。C语言是一种面向过程编程,这就使得Java具有重用的特性,在开发速度上比C语言更快,但是在运行速度上却是C更快,因为C属于底层语言,它比JAVA更加亲近

16、机器,所以在许多系统开发上一般是用C语言,比如我们常用的XP系统、LINUX系统,都是C语言开发的。跨平台的服务器端的嵌入式脚本语言。C+多用于游戏引擎、反病毒、硬件驱动以及一些对运行效率要求比较高的应用程序,比如数据库管理系统。 C+语言在提供强大的功能的同时也提高了程序含BUG的可能性。 C+为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性。 第2章 需求分析2.1 系统的功能需求 坦克大战是一款经典的游戏本游戏在学习继承前辈的同时尝试性的进行一些创新下面是对系统主要功能的简要概述。 整体上说,本游戏分为敌我双方,主战坦克由玩家控制,

17、敌方坦克能够智能化的随机出现在屏幕上,并且移动但是不会发射子弹。 玩家的控制:游戏打开的时候,玩家可以选择音乐音效的开关还可以查看积分榜,然后进入游戏,玩家可以通过屏幕上面的虚拟键控制坦克的运行,可以通过触屏来控制坦克的炮筒方向并且打出炮弹,当坦克打中敌方坦克,子弹和地方坦克都死亡,分数会加一。游戏过程中,玩家不可以暂停游戏,然后再开始游戏。当倒计时结束时,则游戏结束。 敌方坦克的智能运行:敌方坦克由于需要具有一定的智能性,随机的出现在屏幕上,并且消失在屏幕以外,撞到主角坦克时,也不会发生爆炸。使之具有一定的可玩性。敌人可以自动行走,但是应当在以下适当的情况下转向:首先是是否超出界面的边界,其

18、次是是否与地图障碍物发生了碰撞,再次是是否与用户坦克发生了碰撞。 子弹的运行:主战坦克是有玩家控制打出的,通过控制炮筒的方向,向不同的方向发射子弹,如果击中目标就会爆炸消失,如果没有击中目标,出了屏幕也会消失。音乐音效的设置:玩家可以根据自己的喜好来通过开关按钮,控制音乐音效。积分榜:玩家的得分会在积分榜上面显示,主要显示六个最高分。主角击中一个敌方坦克分数就会增加一,直到60秒结束,所得的分数,就是该次游戏的最终得分,所得的分数要和数据库里面的分数进行比较的,看看是否能够显示在积分榜上面。2.2 功能上需解决的技术问题 游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时运行

19、的最终作品,每秒都会运行成千上万行程序、绘图事件、键盘事件都会以极高的频率在后台等待响应。若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误甚至崩溃死机。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。 游戏中为了美观和适用性强,就需要采用外部文件引入的png图片有关贴图,屏幕刷新的双缓冲等都有较好的解决方案。这里应当减少手工画图,从而是程序能更高效的运行。 己方坦克的运行可以通过监听键盘控制,但由于敌方是自动运行就需要有较强的智能性同时屏幕上的敌方可能会有较多的数量这需要为每个敌方开辟一个线程以便能让其独立运行。还需要在坦克死亡的时候终止线程。Andro

20、id的多线程能力为实现这样的游戏提供了可能。敌人坦克的运行算法也需要进行适当的设置以免游戏过于简单、单调或者过于繁杂。 对于双方坦克发出的子弹的控制也需要对其跟踪控制,为了避免子线程太多的现象,子弹不应当成为独立的线程。这里就需要一个单独的线程来控制子弹或者是由子弹所属的坦克来控制子弹。这需要对所有的对象有较好的控制。另外子弹在运行过程中也需要实时扫描是否碰撞敌方坦克或屏幕边界。如果子弹由产生自己的坦克控制,就需要特别这一子弹类和坦克类之间的关系。 碰撞检测是坦克大战的最重要的环节之一。主角坦克在运动过程中需要考虑到是否碰子弹本身或对方坦克,以免重叠运行,造成许多逻辑上不可能的情况。每一次刷新

21、页面、每一次的移动都要考虑整体以及个体与个体的变化。 游戏的结束、开始、动态信息画面作为构成一个完美程序都是必不可少的重要部分。良好的用户界面更是吸引用户的硬指标相关的美术构图也需要有一定的考虑。游戏中敌方坦克的路径专门类,这个类中存储着的三维数组就是敌方坦克的经过的坐标和时间。用户运行游戏时需要有分数记录的可能。如何采用合理的记分标准需要进行适当的设计。记录分数的存储方式也需要有较好的解决方案。手机中由于处理器和内存空间、存储空间都十分有限,其数据库系统与普通PC大相径庭。 Android是基于虚拟机的半解释型编译系统,其执行效率较C+等完全编译后的程序会低很多,程序如果不进行精简和优化,将

22、可能导致运行的不流畅。除开发过程中对结构上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(Obfuscator)进行程序打包后的优化。 第3章 概要设计3.1 系统功能设计3.1.1 主角 在人机对战时,主角的主要功能是点击左右虚拟按钮,坦克会向左向右移动,但是通过按住按钮的时间,来控制坦克的移动速度,按住时间长,坦克的速度就会加快,按住的时间短,坦克就会移动的比较慢。通过触屏来控制坦克炮筒的方向,并且发射子弹。当子弹打中目标时,子弹和目标都会爆炸,当子弹没有打中目标时,子弹走出屏幕,子弹消失。该游戏主要是控制在60秒内,倒计时为零则游戏结束,打中目标数就是该次游戏的分数。 如图3.

23、01所示,左右移动子弹发射时间控制分数虚拟按钮炮筒位置 主角 图3.1 主角功能图3.1.2 背景音乐和音效 当游戏进入到游戏按钮主页面时,可以对游戏进行音乐音效的设置,音乐是当游戏开始时,加的背景音乐;而音效设置是指挡子弹发射或者子弹击中目标时,所加的音效。按钮主页面的音效设置包括两方面的内容,音效的设置和背景音乐的设置。音效分为开,关;音乐也分为开和关。背景音乐从游戏的开始直到游戏的结束,而音效主要是在游戏的60秒内才有并且要有子弹的发射或者子弹及中敌方坦克,敌方坦克发生爆炸才能听到音效的。如表3.2所示表3.2 音乐音效用例图用例名称背景音乐音效功能简述控制游戏背景音乐的开关;发射子弹时

24、的音效;子弹打中目标时,爆炸音效前置条件游戏开启,音乐音效打开后置条件游戏没有结束,子弹打中目标或者有子弹发射基本流1、 在主按钮界面中,设置音效音乐2、 设置音乐的开关3、 设置音效的开关4、 设置成功,返回主按钮界面3.1.3 敌方坦克 敌方坦克在游戏开始以后才开始出现,并且没有什么太大的规律,都是从屏幕的最右面出现,然后消失在屏幕以外或者被子弹击中消失。敌方坦克走的路线是有轨道的,从屏幕的右上方出现后,会走一段轨迹,在运动过程中如果被子弹打中就会爆炸消失,如果没有被击中,则会消失在屏幕以外的地方。如表3.3所示,表3.3 敌方坦克用例图用例名称敌方坦克功能简述坦克随机出现,被击中或者离开

25、屏幕前置条件游戏开始,并且在60秒之内后置条件游戏没有结束基本流1、在主按钮界面中点击开始游戏2、敌方坦克就会在屏幕上随机的出现3、如果被子弹打中就会爆炸如果没有,则会消失在屏幕以外3.2 系统功能设计流程我把整个游戏分为了两部分游戏开始欢迎界面,游戏功能选择。而游戏功能选择又分为三部分:游戏开始,音乐的开关,积分榜。游戏首次运行时,会有动画界面的播放,动画界面分为两个画面,动画画面1、动画画面2。游戏开始时,可通过虚拟键的来控制坦克的左右移动,通过在屏幕上面点击来调整炮筒的角度并且发子弹,如果击中敌方坦克,就会有相应的音效和动画。音乐开关设置分为游戏背景音乐的设置和游戏音效的设置。分数的最高

26、纪录主要记录的是时间和分数。时间设置为一分钟,在一分钟内打的坦克数量就是玩家该次游戏的得分,得分与数据库中的分数进行比较,如果是最高的则为破纪录,则显示恭喜你打破记录,如果没有破纪录则显示为加油,再接再厉,同时还要和其他的分数进行比较,是否在最高分的五个分数之中,如果在这五个当中就会删除原来五个分数中最低的那个,并且获取当时玩家游戏的时间,显示在积分榜中。如图3.4开始游戏主界面结束界面欢迎界面破纪录积分榜开始游戏动画图片1动画图片2鼓励界面设置音效分数记录背景音乐时间记录游戏音效主角坦克敌方坦克背景移动最高记录左右移动子弹发射随机出现音乐开关音效开关 图3.4 总体功能结构图3.3 坦克大战

27、相关功能联系设计 Android(java)主要是面向对象的编程语言,也就是坦克大战中的每一个类都有各自的动作和功能。例如子弹类,子弹类主要就是发射子弹和子弹的碰撞爆炸效果。这些类表面上都是各自独立,没有什么太大的关系。但是整个程序的运行要所有的类之间互相配合才能完成。通过点击开始游戏按钮,游戏就会进入到欢迎动画界面,播放完动画后进入按钮主界面,选择游戏开始按钮就会进入游戏机面,通过控制主角的移动和炮筒的方向来控制子弹的发射方向,并且判断是否击中目标,一分钟后,游戏结束进入到结束界面。如图 3.5 所示。 开始欢迎界面玩家坦克通过虚拟键控制坦克发射炮弹碰撞检测(坦克和子弹)不处理同角色坦克产生

28、爆炸不同角 色坦克判断记录结束 图3.5主类设计流程GameActivity类Dapao类Target类参数1参数2调用Bullet类打中调用Explosion类产程爆炸判断Score虚拟键盘控制移动自动随机出现打击 图3.6主类相关流程图GameActivity类是主类,通过调用其他类中封装的方法来使整个系统运行起来实现相应的功能,下面显示GameActivity类与各个类之间的关系,并且展示个各类之间调用关系,类完成的主要动作,还有各个动作之间是怎么配合,通过什么函数实现。其中坦克的Daoao 类还有Target类是主角坦克和敌方坦克出现的类,主角发射子弹通过调用Bullet类还有expl

29、osion类来实现的。主角发射子弹,击中敌方坦克并且发生爆炸,最后通过score类,判断是否破纪录,并且是否能够显示在积分榜上面。如图3.6所示 第4章 详细设计4.1 坦克大战主要类基本功能分析4.1.1 主类 GameActivity类,把游戏分为八个界面,在不同的状态下进入到不同的界面来完成不同的功能和动作,这八个界面主要是欢迎界面(WellcomeSurfaceView),主菜单界面(MainMenuSurfaceView),游戏界面(GameView),音效控制界面(SoundControlsSurfaceView),积分榜界面(HighScoreSurfaceView),胜利界面(

30、WinSurfaceView),失败界面(FailSurfaceView),游戏结束界面,高分记录界面。其中对数据库也做了定义用SQL数据库,把分数存储到数据库。当游戏处于不同的状态或者动作时就会转到相应的界面,来完成相应的动作或者功能。 定义了一个类为class WhatMessage()包含了这八个方法,新定义一个控制器,还定义了向Handler发送信息的方法。当Handler接收到发送来的不同的信息,并采用Case来进行判断是哪一个界面并且转到该界面,来实现和完成相应的功能。并且还定义了触屏,当触到了不同的功能也会转到相应的类来实现这个功能。一样也是使用了switchcase语句来实现的

31、。 数据库的初始化也在这里完成了,主要是数据库的创建方法,数据库的关闭,插入记录的方法和查询方式。 全屏的设置,设置全屏的操作主要就两点:隐去状态栏部分,包括电池等图表;把应用的名字也隐去不显示。隐去标题栏(应用程序的名字)用:this.requestWindowsFeature(Window.FEATURE_NO_TITTLE)来实现的。隐去状态:this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN)代码来实现的。还有另一种

32、方法来实现这个功能,可以通过在项目的AndroidManifest.xml文件中对Activity的属性中进行配置来实现,隐去标题:android:theme=“android:style/Theme .NoTitleBar”;设置全屏(隐去状态栏和应用标题):android:theme=“android:style/Theme.NoTitleBar.Fullscreen”4.1.2 欢迎界面 WellcomeSurfaceView类,该类主要实现了游戏开始时进行的动画加载,主要分为两个画面,并且这两个画面只播放一次。这两个画面播放完毕之后,就进入到了MainMenuButton界面。而该类的

33、实现主要是通过以下几个方法实现的。首先是图片的引用,定义了一个logo图片数组,并且获得屏幕的宽和屏幕的高,目的是让图片容易实现占满整个屏(好设置)。其次是把图片加载到系统中应用。在引用过程中要对图片做一些处理,为了让图片美观的显示,设置抗锯齿:Paint.setAntiAlias(true);还有图片资源的加载使用BitmapFactory.decodeResource(Activity.getResources(),R.drawable.name),其中n为数字,name为图片的名字。 使用onDraw(Canvas canvas)来对画布和画笔进行设置,背景的设置使用画笔Paint,设置

34、画笔的颜色和绘制黑填充矩形背景:paint.setColor(color.BLACK)Canvas.drawRect(0,0,screenWidth,screenHeight,paint),这个矩形的大小就是屏幕的大小即该矩形覆盖整个屏幕。然后向这个矩形贴图,也就是用图片覆盖整个屏幕。canvas.drawBitmap(currentLogo,currentX,currentY,paint)使用这段代码来实现的。最后使用run()函数来实现图片的动画显示。先计算一下图片的位置,在横坐标上currentX=screenWidth/2-bm.getWidth()/2,计算出屏幕的中间坐标,还有图片

35、的中间坐标;在纵坐边上currentY=screenHeight/2-bm.getHeight()/2获得图片的纵坐标还有屏幕的纵坐标。这样做的目的是让图片进行居中显示,美观。最后动态的更改图片的透明度的值并且不断的重绘来实现动画的效果。还有判断是判断图片是不是原来的图片,如果不是原来的图片,而是重新放里面的新图片,则图片动画需要多等一会。还有用到了画布,首先是画布的获取canvas=myholder.lockCanvas(),然后是在画布上绘图锁定画布,myholder.unlockCanvasandPost(canvas)。 动画播放完毕后,主动转到主菜单界面,再进行其他的操作。4.1.3

36、 按钮主页面 MainMenuButton和MainMenuSurfaceView类这两个类主要实现了主菜单界面上面的一些功能的实现。主要由背景界面和一些界面上的按钮。按钮主要有开始游戏,背景音乐,音效的设置和积分榜。当点击按钮时,就会转到相应的页面。 MainMenuSurfaceView主要实现了游戏开始,音乐开关,积分榜这几个功能的实现,当点击设置音效时,就会进入到音乐开和音效开这个就是在MainMenuButton中实现的。 主页面背景的设置。首先是背景图片的定义,然后是背景图片的引用。在函数onDraw(Canvas canvas)中对背景图片进行绘制,通过canvas.drawCo

37、lor(Color.WHITE)和canvas.drawBitmap(bgBitmap,0,0,paint)来实现的。在主页面上面还有两个虚拟按钮,也是通过这种方式绘出来的。在这个函数中焦点的设置也是非常重要的,设置焦点,并且设置为可触控焦点。如果没有设置可触控焦点,当按键被按下时,就不会有响应,原因就是没有设置当前的View获取焦点。焦点主要就是告诉系统,现在这个试图需要与用户交互,让系统来监听此视图。焦点的设置方法为setFocusable(true)来实现的,可触控焦点为setFocusableInTouchMode(true)。其他一些按钮也是通过这种方法实现的,但是触屏监听的实现是通

38、过onTouchEvent()函数实现的。 首先是当有按下的动作时,获取该点的相应的坐标,通过event.getX()和event.getY(),这两个函数主要是获取触屏时该点的坐标。其次是判断该点的坐标是属于哪一个动作范围,并转移到相应的函数中去实现该动作。也就是通过Event.getAction()函数,去实现相应的动作。但按下的动作抬起时,startGameBtn.switchOff(),soundBtn.switchOff()和highScoreBtn.switchoff函数关闭所有的按钮,也就是停止了所有的操作。 为了游戏的美观,所有的图片都打开抗锯齿,并且通过函数把相应的按钮放置到

39、主页面的相关位置。 用到的相关的线程的函数有craetAllThreads(),startAllThreads()和stopAllthreads().SurfaceHolder类的实例,此类提供控制SurfaceView的大小,格式等,并且主要用于监听SurfaceView的状态。其实SurfaceView只是保存当前视图的像素数据,在使用SurfaceView时,并不会与SurfaceView直接打交道,而是通过SurfaceHolder来控制,使用SurfaceHolder的lockCanvas()函数来获取到SurfaceView的Canvas对象,再通过在Canvas上绘制内容来修改S

40、urfaceView中的数据。 lockCanvas()函数不仅是获取Canvas,同时还对获取的Canvas画布进行加锁,这里对画布进行同步加锁的机制主要是为了防止SurfaceView在绘制过程中被修改,摧毁等发生的状态改变;与lockCanvas()函数对应的还有一个unlockCanvasAndPost( Canvas canvas)函数用于解锁画布提交。4.1.4 主角 主角的坦克的动作主要有左右移动当点击虚拟按钮时,子弹的发射,炮筒的180度旋转。 虚拟按钮的功能实现主要是在GameVirtualButton类中完成和实现的。首先是按钮图片的设置,把它放置到相应的位置,目的是为了使

41、用起来方便而且看起来也美观。虚拟按钮功能的实现主要是按钮是否被按下,并且判断按下的按钮是向左移动的按钮还是向右移动的按钮。绘制按钮函数drawSelf(Canvas canvas,Paint paint),绘制向左的按钮有两种状态,没有点击时和被按下时,canvas.drawBitmap(onLeftBitmap,x,y,paint),Canvas.draw-Bitmap(offLeft-Bitmap,x,y,paint)两种状态函数。绘制向右的按钮的两种状态的方法绘制做按钮的方法一样。判断按钮上面是否有触控事件的方法的函数有isActionOnLeftBtn()(左按钮),isActionO

42、nRightBtn()(右按钮),isActionOnBtnArea()(触控区域)。左按钮被按下和抬起的方法switchLeftBtnOn(),switchLeftBtnOff()。右按钮被按下和抬起的方法switchRightBtnOn()和switchRightBtnOff()。虚拟按钮被设置了两个速度一个是慢速度一个是快速度,当屏幕的宽减去坦克底座的长度大于等于坦克底座的横坐标时,坦克会以慢的速度移动,反之则会以快的速度移动。这些都是在DaPao类中的drawSelf()函数中实现的。还要设置炮筒的旋转矩阵,这样便于炮筒的旋转。绘制炮筒的方法是canvas.drawBitmap(pao

43、tongBitmap,mz,paint).并且绘制坦克底座canvas,drawBitmap(paotaiBitmap,paotaiX,paotaiY,paint).子弹的发射是是通过函数sentBullet()方法来实现的。首先子弹是是一个小图片,要图片的定义和引用,并且还要知道子弹的半径,炮筒的高度和炮筒的管宽,这样是为了能够逼真的显示炮弹从炮筒里面打出去。首先是坦克位置的初始化,就是坦克底座的位置的初始化。炮筒的180度旋转主要是通过角度改变来调整的。角度的计算是通过函数calcuateAngle(float pressX,float pressY)来计算的。但是要判断点击点在炮筒的哪一

44、边。当点击点在炮筒的正上方时,result=(float)(Math.PI/2.0f);当点击点在炮筒的右边时,result=(float)Math.atan(Math.abs(centerY-prseeY)/(pressX-centerX);当点击点在炮筒的左边时,result=(float)(Math.atan(Math.abs(pressX-centerX)/(centerY-pressY)+Math.PI/2.0f)。最后返回result来实现角度的改变,从而实现了炮筒的180度的旋转。4.1.5 子弹 类Bullet和类Explosin,这两个类主要实现了子弹运动,子弹的爆炸,子弹的

45、的消失。这里主要涉及到了一个算法-碰撞。就是子弹与坦克之间的关系,如果一个子弹(或者球形)的像素在另外一个坦克之中,或者在坦克的上面都可以认为这两个物体发生了碰撞。碰撞后敌方的坦克就会消失,显然爆炸的子弹也会消失。首先是绘制子弹的方法drawSelf(),并且引用图片。还使用了子弹的前进方法go(),子弹的前进方向主要有水平方向和竖直方向。水平方向是通过水平方向的分速度和时间相乘得出路径,但是认定水平方向匀速直线运动。竖直方向是通竖直方向的分速度经过的路径和自由落体运动时所经过的路径之和,但是认定竖直方向做自由落体运动。在运动的过程中判断是否与Target碰撞即与敌方单位碰撞,如果击中目标目标

46、就会爆炸,调用函数t.explode()。如果子弹没有击中目标,就会判断子弹是否在屏幕内,如果不在屏幕内子弹就会消失。判断是通过x的坐标是否大于屏幕的宽或者是y的坐标值是否大于屏幕的高。子弹的消失是通过函数disapear(),来实现的 。 子弹的爆炸动画实现,首先定义一个数组来存储爆炸图片的过程bitmaps,并且为爆炸动画帧设置索引anmiIndex=0。当子弹碰到敌方单位是就会播放不炸效果图,如果没有播放完毕,就会爆炸动画帧就会自动加一,继续播放下一帧直到播放完毕为止,播放完毕后,就会从列表中删除此爆炸。实现的方法drawSelf(Canvas canvas,Paint paint)。首先是绘制背景canvas.drawBitmao(BitmapsanmiIndex,x,y,paint),然后进行动画的播放。4.1.6 音乐和音效 音乐包括音乐的开关还有音效的开关,音效的开关主要是子弹碰撞到敌方坦克时爆炸的效果声音,背景音乐主要是从进入主页面到游戏结束一直伴随的音乐.音乐和音效主要是通过类SoundSwitchButton和类SoundControlSurfaceview来完成和实现功能的。首先是音乐音效按钮的设置,定义出关于按

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号