毕业设计论文基于Android的塔防类游戏

上传人:仙*** 文档编号:78278950 上传时间:2022-04-21 格式:DOC 页数:35 大小:4.31MB
收藏 版权申诉 举报 下载
毕业设计论文基于Android的塔防类游戏_第1页
第1页 / 共35页
毕业设计论文基于Android的塔防类游戏_第2页
第2页 / 共35页
毕业设计论文基于Android的塔防类游戏_第3页
第3页 / 共35页
资源描述:

《毕业设计论文基于Android的塔防类游戏》由会员分享,可在线阅读,更多相关《毕业设计论文基于Android的塔防类游戏(35页珍藏版)》请在装配图网上搜索。

1、引 言 随着信息科技的快速发展,Android(安卓)已经被人们所熟知,Android智能手机火速上位,甚至可以说现在的手机系统由苹果的IOS和Android平分也不为过。随着安卓智能手机在中国各地的风靡,基于Android平台的应用软件也逐渐成为了IT开发的一大热门。手机游戏是智能机不可或缺的应用之一,“植物大战僵尸”“保卫萝卜”等Android游戏应用的成功,让人们看到了手机游戏在Android平台上的巨大发展空间。基于此,我将采用Eclipse和Android ADT作为集成开发平台,开发本Android游戏APP。 Android 是Google 在2007 年11 月5 日公布的手机

2、系统平台,早期Google 开发,后由(Open Handset Alliance)开发,以Linux 为基础的开放源代码操作系统,是一套真正意义上的开发性的移动设备综合平台,并且无缝地结合Google 优秀的服务。手机游戏由于具有随时、随地、随身的特性开始在游戏市场占据越来越大的市场份额,本手机游戏是基于Android 系统进行开发,因此,具有更广泛的使用性。 本应用为Android塔防类游戏,主要有6个操作界面分别为欢迎界面,主操作界面,排行榜界面,音效设置界面,帮助界面和游戏结束界面。玩家可以选择自己要进入的界面对游戏设置,查看帮助或进入的积分榜界面查看得分排名等操作。作为一款智能手机的

3、游戏应用,背景音乐的存在是不可或缺的,本游戏在有着令人兴奋的背景音乐,还有打击箭塔攻击怪物时候的过瘾音效。本应用采用Android的Canvas绘制游戏界面,游戏的主界面美观,赏心悦目,以提高玩家对游戏的兴趣。游戏的控制模块做到简单明了,易上手,以给玩家一个很好的游戏环境。 1 绪论1.1 游戏开发背景 当前移动互联网技术快速发展,人们生活逐渐趋于多元化,以智能手机为代表的电子产品也逐渐受到人们的追捧,现在手机的功能已不仅仅是简单的接打电话、收发短信了。更多的用户希望在学习和工作之余通过方便灵巧可随身携带的手机或平板等休闲娱乐。现如今游戏又是人们日常生活的一个必不可少的娱乐项目,也带动了游戏相

4、关产业市场的发展。游戏平台也是经过了从游戏机到电视游戏,然后到PC游戏,再到手机游戏的蜕变,中间经历了很多技术的更新和变革。但随着新技术的发展和人们生活水平质量的提高,手机开始逐渐普及,因为其小巧便捷的特点,手机成为人们日常生活中必不可少的通讯工具。而基于手机平台的游戏也就拥有的市场空间是巨大的,也因随着3G、4G网络的开通和应用,手机游戏必然会迎来新的一轮游戏热潮。因此,为了迎合众多用户的需求并适应现在手机的规模,我们开发出一套具有不错娱乐性和挑战性的休闲示意打发时间的家园塔防无尽版小游戏。 塔防类游戏是一种比较经典的益智类策略游戏。塔防游戏即指一类通过在地图上建造炮塔或类似建筑物,以阻止游

5、戏中敌人进攻的策略型游戏。 该类游戏目前就是主要是有3大类第一种就是摆回龙,堵怪模式,一张空白的地图,让怪兽按照你摆的炮塔的阵型来回移动,并且可以通过搭建和贱卖出口的炮塔,使怪兽来回移动,达到最长的移动距离,以便于炮塔不断的轰击怪兽,但是最长路线的不一定是最好的,一般每种地图都会有空军无视你的阵型;另一种就是类似植物大战僵尸玩家通过武装多种植物切换不同的功能,快速有效地把僵尸阻挡在入侵的道路上。不同的敌人,不同的玩法构成五种不同的游戏模式,加之夕阳、浓雾以及泳池之类的障碍增加了游戏挑战性。它对玩家的要求也是大脑的智慧和小脑的反应,目前正在白领和学生中风靡起来;最后一种就是像本款游戏一样让怪物走

6、固定路线,比较经典的是Defense Grid:The Awakening,这个游戏获得过许多奖项,如PC GAMER的编辑推荐奖,IGN的08年度10大不可错过游戏奖,还上过许多杂志等等。游戏的画面从图片中已经可以看出来了,画面效果太绚丽了,无可挑剔,对硬件的要求也不高。游戏有很多个关卡,每个关卡都胜利模式还不太一样,可以说每个关卡都是集合了一种有人气的塔防的特色。 虽然现在市面上存在着各种各样的游戏版本,可是塔防游戏其市场还是相当大的。因为它的特殊在于人们在玩游戏的时候的过程中使爱不释手。随着其难度增大,刺激性也更强,挑战性越强。可以说该游戏的优势在于它的简单易行,不论是手机,还是小游戏机

7、,都能很快顺利的运行。而且对于在外忙碌的人,不可能花费大量时间在娱乐上,大型游戏是行不通的。他们会在工作之余,上下班乘坐公交或地铁的时候消磨时间娱乐一下,所以像这款无尽版塔防小游戏刚好迎合了他们的需求。1.2程序研究目的和意义在如今社会,人们的生活节奏也逐渐加快,工作和学习压力逐渐增大,大多数人没有足够的时间去休闲娱乐,放松自己。但这款小型的塔防游戏,则可以让我们随时随地都能享受游戏,从繁重的日常生活中解脱出来。这款塔防游戏是用比较流行的保护城池的玩法,让怪物精灵走固定路线,通过合理适当的建造箭塔阻挡不断侵袭的怪物精灵,当城池血量为零时守城失败。此款游戏题材新颖,让人们进入科幻飘渺的远古世界中

8、,在保护城池的过程中自己不断改变箭塔种类位置锻炼自己的大脑,并且还能跟各种各样的精灵斗智斗勇,让我们在闲暇之时得到畅汗淋漓的精神满足。当然,这也要求我把大学学到的知识都总结在一起,考验我的“学以致用”的能力,我会要求自己把游戏编写的赏心悦目,力求美观,以提高玩家对游戏的兴趣。游戏的控制模块应该做到易懂、易操作,以给玩家一个很好的游戏环境。1.3 可行性分析该系统采用Eclipse集成Android ADT作为开发平台进行APP开发。Eclipse是一个开放的源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。虽然大多数用户很乐于把Ecl

9、ipse当作Java集成开发环境(IDE)来使用,但Eclipse的目标却不仅限于此。Eclipse还包括插件开发环境,这个组件主要针对希望扩展Eclipse的软件开发人员,因为它允许他们构建与Eclipse环境无缝集成的工具。由于Eclipse中的每样东西都是插件,对于给Eclipse提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK),而且Android专门针对Eclipse开发做了ADT(Android Developer Tools)开

10、发插件,因此该应用使用Eclipse开发完全可行。2游戏需求分析2.1 用户功能需求分析本毕业设计目标用户是Android2.2及以上系统的智能手机用户。无论男女老少均可以进行游戏。玩家通过Android手机系统使用进行游戏。由于本程序简单易操作,有着基本的开始游戏、继续游戏、保存游戏和返回游戏等主要按钮,还有音效设置、积分榜、帮助等辅助按钮,所以本游戏对用户没什么特别要求。一般用户经过几分钟练习都可以熟悉本游戏的规则。游戏开始会有两个怪物沿着地图中路线从怪物窝出来,向路线终点的房子匀速行走,这时候,用户需要点击25游戏币或者15游戏币的箭塔安放在路线以外能够打中怪物的地方,当怪物进入箭塔的攻

11、击范围之后,箭塔就会主动攻击进入范围的怪物向其射出白色子弹;每消灭一个怪物就会加5游戏币,当消灭足够的怪物时又可以有钱摆放新的箭塔;当箭塔攻击不够不能消灭一波怪物的时候,点击画面顶端一行中的水晶,就会释放能量消灭全屏幕的敌人,但是不会增加赏金;每个怪物进入房子后就会减掉房子一个血量,当房子总共的10个血量为0时,怪物攻占了房子,游戏结束。 玩家除了偷闲娱乐还可能一本正经的挑战自己,于是排行榜是必不可少的。排行榜模块是用户通过游戏闯关的结束从而在玩家中进行成绩排名,排行榜会记录用户玩游戏的时间和消灭怪物的数量,给玩家挑战自己,超越自己的动力。对于刚开始接手的用户来说,帮助模块则是本游戏静态显示的

12、一个游戏介绍和说明,用户可以在帮助模块中,对本游戏情况有个大概的了解。本游戏是通过碰撞检测来实现箭塔对怪物的攻击。根据其他手机游戏的特点和用户对游戏的体验需求,本游戏是以图文声并茂的方式呈现的。当游戏开始时和游戏过程中会出现游戏的背景音乐,在箭塔攻击怪物发生碰撞的同时会出现音乐特效等。在家园被怪物侵袭的时候设置有震动,这样玩家用户看着图片、听着声音、感觉着震动的效果,不仅在视觉上和听觉上得到了很好的体验和满足,在触觉上也有着不一样的感受。本毕业设计为人们提供一款手机休闲娱乐的游戏软件,不仅能锻炼玩家的大脑和双手的配合,还能开拓玩家的思维方式和动手能力。让人们在繁忙的工作和学习之余,得到身体和心

13、情的放松。另外,此游戏画面优美,音效恰到好处,操作简单易上手,触感非凡,适合各阶段人群。 图2.1 功能界面示例图 图2.2 游戏界面示例图2.2 系统性能要求1.实用性本应用为安卓手机游戏,要和其他手机游戏一样能在智能机上安装,游戏和卸载,游戏支持触屏操作,要求有清晰的图片,令人喜欢的游戏音效和手机震动多种感觉体验。2. 实时性 本游戏要对用户的操作做出实时响应,当手触摸屏幕抬起时就应该有函数响应,对其进行各种操作,避免卡机等情况发生。3.易操作性单机手机游戏的最大特点即为易操作性,用户在不看说明的情况下也能够通过自己摸索很快就能自己上手玩,并且在玩过几遍之后掌握游戏的规则和得高分的要领。2

14、.3 游戏框架和流程分析依据系统的需求分析,得到游戏框架图如图2-3所示:图2.3 游戏框架图 1公共类中实现类TafangGameActivity,该类通过扩展Activity得到,是整个游戏的控制器,也是游戏的程序入口,用来实现游戏中所有的定义。 2界面相关类中实现欢迎界面类WelcomeView,通过改变图片的透明度实现图片的渐变,达到开机动画的效果,运行期间屏蔽任何触屏以及键盘操作;主操作界面类MainMenuSurfaceView为游戏主界面,设计实现后可以进行游戏音效的设置、跳转帮助界面、查看游戏积分榜、运行新游戏以及读取游戏存档继续游戏等操作;排行榜界面类HighJifenSur

15、faceView的实现,该类数据库查询中应用了分页技术,通过向上或者向下滑动屏幕实现积分榜信息的分页显示;帮助界面类HelpView的实现,静态的向读者介绍游戏的玩法;音效设置界面类MusicSurfaceView设置背景音乐和炮塔的射击音效的开启和关闭;游戏结束界面类GameOverView为游戏结束后改变图片透明度实现图片渐变和WelcomeView类相似;游戏界面类GameView为游戏视图主要的类,负责游戏画面的绘制。 3辅助线程类中各类的实现:用IfGameOverThread类继承自Thread类来判断游戏何时结束;ShellNumThread类和ShellThread类均继承自T

16、hread类,用来控制炮弹的产生和发射路线;TargetNumThread类和TargetThread类分别用来控制怪物的产生和怪物的行走;SelectThread类用来控制主界面中下拉选项组下拉的线程;TimeThread类和ShuiJingThread类继承自Thread类,用来控制游戏界面中水晶物品操作的线程。 4实体对象类中主要实现Shell类和Target类,Shell类是为了描述炮塔射击炮弹开发的对象类,Target为了描述怪物开发的对象类;而SingleJianta类和SingleGoJianta类则分别描述游戏界面中箭塔开发的对象类和拖动箭塔过程中的箭塔类。玩家在安卓智能手机上

17、安装此应用客户端程序后,点击塔防游戏图标进入游戏,之后就会看到主菜单界面,里面包含6项主要功能:图2.4 游戏功能图 第一次玩游戏的话点击继续游戏是不会进入游戏界面进行游戏的,因为它需要玩家已经玩一次游戏,进入游戏界面并点击设置按钮保存的上一次的存档记录之后,点击继续游戏方可接着上次保存的记录玩耍;如果不想接着玩从新开始挑战自己,则可以点击新游戏从新玩;玩家玩完一局后会在积分榜上查看自己此局的游戏时间和消灭怪物的个数,并且按照消灭怪物的数量进行从大到小排序,让玩家对自己的战绩一目了然,增加了趣味性和挑战性,激起玩家挑战自己,超越自己的斗志;一款好玩的游戏不仅有基本游戏功能,好的画面,还要有让人

18、兴奋的音乐,所以此款软件增加音效设置模块,用来设置背景音乐和音效的开关,让玩家在不同时间不同场合都能方便愉快的进行游戏;玩家还可以进入帮助按钮查看帮助,此功能主要是用图片配上文字的方式静态的显示游戏的一些相关介绍和玩法,让玩家对此游戏有个大概的认识和了解。3系统总体设计与实现3.1.主控制类TafangGameActivity的实现 3.1.1首先,实现游戏各个类的定义 在TafangGameActivity 类中的Activity 中分别定义欢迎界面、主菜单界面、积分榜界面、音乐设置界面、帮助界面和游戏结束界面;在类开始引用GameView来定义游戏界面,用来编写游戏视图中相关类的实现;然后

19、定义SQLiteDatabase sldd为数据源来保存相关数据;之后定义游戏存档对话框Inputdialog和继续游戏对话框GoonGamedialog,当用户玩到中途不得不暂停游戏的时候或不想玩的时候可以点击在游戏界面左下方的设置按钮,然后弹出对话框可以选择保存游戏、返回游戏和退出游戏,然后自己下次可以按继续游戏按钮接着上次的存档玩;然后定义手机屏幕的宽度和高度用来动态获得手机屏幕分辨率的大小,以便能全屏游戏从而获得更好的感觉;当然,声音和震动的定义也必不可少的,定义声音标志位的开启关闭和震动的声明则让玩家获得更好的体验。3.1.2然后,实现TafangGameActivity类中的Han

20、der消息处理器以下代码是Hander根据传入不同的消息ID判断系统要跳转的界面,例如,当Hander消息处理器收到消息0时,就会调用gotoGameView函数,跳转到游戏界面,Hander消息处理器收到消息1时,就会调用gotoMainMenuView函数,跳转到游戏界面,其他操作类似,代码如下: public void handleMessage(Message msg) /根据出入不同的ID选择切换到不同界面 switch(msg.what) case 0: gotoGameView();/切换到游戏界面 break; case 1: gotoMainMenuView();/切换到主界

21、面 break; case 2: gotoHelpView();/切换到帮助界面 break; case 3: gotoJifenView();/切换到积分榜界面 break; case 4: gotoMusicView();/切换到音效设置界面 break; case 5: gotoGameOverView();/切换到游戏结束界面 break; Hander主要是与子线程通过Message对象来传递消息数据,这个时候,就需要把数据消息作为一个Message对象发送到消息队列中,然后,在初始化Handler对象时重写的handleMessage方法来接收Messgae并进行相关操作,然后绑定

22、在主线程的消息队列中。 3.1.3手机屏幕分辨率的设置 新建DisplayMetrics对象,动态获得当前屏幕的分辨率,其中dm.widthPixels为系统得到的屏幕宽度,dm.heightPixels为系统得到屏幕的高度,然后调用setWindow方法,实现窗口管理器中全屏幕的布局,最后调用setRequestedOrientation函数把屏幕强制设置为横屏,最后设置进入开机动画WelcomeView界面,代码如下:DisplayMetrics dm=new DisplayMetrics();/新建DisplayMetrics对象 getWindowManager().getDefaul

23、tDisplay().getMetrics(dm); /动态获得手机屏幕的宽高 screenWidth=dm.widthPixels;/动态获得屏幕宽度像素 screenHeight=dm.heightPixels;/动态获得屏幕高度像素/全屏requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN , WindowManager.LayoutParams.FLAG_FULLSCREEN);this.setRequestedOrie

24、ntation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);/设置为横屏collisionShake();/初始化gotoWelcomeView(); /开机动画,首先进入WelcomeView 在Android中可以设置程序界面随着窗口大小调整缩放比例,但是即使如此,编程人员还是必须知道手机屏幕的分辨率等信息,以避免缩放造成的布局变形问题。而DisplayMetircs 类就可以很方便的获取屏幕的分辨率,并且构造函数DisplayMetrics 不需要传递任何参数;调用getWindowManager() 之后,会取得现有Activity 的Hand

25、le ,此时,getDefaultDisplay() 方法将取得的宽高维度存放于DisplayMetrics 对象中,而取得的宽高维度是以像素为单位(Pixel) ,“像素”所指的是“绝对像素”而非“相对像素”。 3.1.4切换不同界面的方法首先,初始化进入开机动画函数gotoWelcomeView(),进入WelcomeView界面;然后判断界面是否为空,如果是则新建WelcomeView,不为空就设置当前界面显示于画面中;主菜单界面,游戏界面等同理。主界面MainMenuView、帮主界面HelpView、积分界面JifenView和音乐界面MusicView原理同开始界面。3.1.5音乐

26、设置的方法首先在音乐界面中判断musicView是否为空,若为空则新建MusicSurfaceView,否则设置显示当前界面,然后定义声音播放标志位函数isBackGroundMusicOn()和游戏音效标志位函数backGroundMusicOn,通过设定两个函数控制播放游戏背景音乐和音效。3.1.6游戏存档对话框和继续存档游戏对话框的设定首先定义弹出对话框gototachu,在函数里显示其对话框及其ID,之后定义继续游戏对话框,在函数里定义查找DBUtil数据库的查询语句nearlist=DBUtil.getcundang(),然后再显示其对话框及其ID,这样当弹出对话框系统存档其ID,当

27、再次接着存档游戏的时候,判断其ID是否存在并查找DBUtil数据库中存档数据,然后提取存档继续游戏。3.1.7手机震动信息的设定定义手机震动函数collisionShake(),然后设置震动信息在调用方法shake()中定义震动信息,mVibrator.vibrate( new long0,80,-1);其中坐标是防御阵地的坐标,当血量-1时说明有怪物攻入房子,系统会触发手机震动,表明已有怪物侵袭到阵地中,来给玩家提醒并制造刺激感。3.1.8重写返回键的事件监听定义onKeyDown(int keyCode,KeyEvent e)函数来重写手机返回键的事件监听,在函数中判断界面上键值是否为4,

28、如果是再次判断是否在帮助界面,积分榜界面或音效设置界面,如果是用gotoMainMenuView()函数返回到主菜单界面。3.1.9创建对话框创建对话框函数onCreateDialog(int id),定义ID,然后用switch语句分别把ID设置为存档和读档;存档输入对话框创建后返回结果,游戏读档对话框通过AlertDialog.Builder来创建。AlertDialog是Dialog的一个直接子类,同样也是安卓系统中最常用的对话框之一。AlertDialog.builder是AlertDialog的内部静态函数,一般生成AlertDialog的时候是通过AlertDialog.build

29、er来构造的。通过重写这个方法,可以根据传入不同的ID创建相应类型的对话框,完成对话框的最后创建还需要重写onPrepareDialog函数。3.1.10函数onPrepareDialog的开发在存档对话框中定义确认和取消按钮,然后需要设置监听事件bjhmcok.setOnClickListener,然后重写onClick方法得到文本框及其输入的内容,得到事件后执行插入语句,遍历怪物列表获得当前怪物的种类、位置坐标、当前种类怪物的血量以及总血量,用于继续游戏中怪物的加载;同样的方法获得当前游戏进度下的金钱树、当前家园的血量、杀敌数以及水晶的数量,用于继续游戏有的金钱、血量、杀敌以及水晶物品的加

30、载;然后将数据通过listView加载进文档进度选择对话框内,最后选择不同ListView中的元素,加载相应的游戏进度。 3.2.主控制类TafangGameActivity中部分数据库的实现3.2.1创建数据库方法首先创建数据库函数openOrCreateDatabase(),然后在里面调用try catch方法,在try中表明数据源为SQLite数据库,并定义数据库所在路径,然后在创建的数据库中建表highScore,用来记录游戏中的得分情况;如果try里面语句发生错误抛出异常,将会执行catch语句中语句来打印异常信息,如果try里面出现了Error,表示出错那后面的语句也不执行了,ca

31、tch也抓不住。图3.1 创建数据库3.2.2关闭数据库的方法 同样在closeDatabase()函数中调用try catch方法,实现数据库的关闭,如果关闭抛出异常后打印异常信息。在此解释数据库的查询插入方法完成后要先关闭数据源,否则会影响数据库的查询。 3.2.3数据库插入记录和查询的方法同样用try catch方法,在try语句中打开数据源openOrCreateDatabase(),然后定义要插入记录的SQL语句,插入记录后关闭数据源,否则抛出异常打印异常信息; 查询则用query()方法,先定义查找的位置和记录条数,然后得到返回的结果StringBuilder(),声明此游标,然后

32、打开数据源,查询该条记录的SQL语句,然后执行try catch方法将游标移到指定位置,记录此记录积分,时间等信息,根据查询的位置以及一组查询结果数量的限制对积分表进行查询,查询完毕后关闭数据游标,关闭数据源。3.2.4存档、读档游戏数据库的建立首先创建save表,用于记录游戏存档的名称和时间,创建nochange,用于记录当前怪物的金钱数、血量、杀敌数以及水晶物品的数量;创建表guaiw,用来记录当前怪物的位置、血本以及怪物的种类;用于记录当前创建jiant表,用于记录当前箭塔的位置、射程等,便于读档游戏时候的加载。 在TafangGameActivity中设计了积分榜的数据库开发,现在在游

33、戏存档和读档则用数据库DBUtil的开发。它是是操作数据库的组件,对传统操作数据库的类进行二次封装,可以把结果集转化成List。对于数据表的读操作,他可以把结果转换成List,Array,Set等java集合,便于程序员操作;对于数据表的写操作,只需写sql语句。DBUtils是java编程中的数据库操作实用工具,用他可以避免占用很大的内存,小巧简单实用。3.3界面相关类的设计与实现3.3.1欢迎界面WelcomeView类的设计与实现本系统的欢迎界面主要是通过对两张图片的可见度进行设置,从而达到产生一种动态的效果。首先在WelcomeView类中定义画笔,不透明值为0,屏幕高度和宽度,还有动

34、画的延迟ms数sleepSpan,还有Logo图片数组为两张,通过paint函数打开抗锯齿setAntiAlias为true,然后设置画笔颜色,最后通过创建surfaceCreated和surfaceDestroyed函数,分别在创建和销毁时被调用,函数则启动一个线程,通过改变图片的可见度来实现图片的渐变效果,如下图:在surfaceCreated方法中新建线程,该线程通过强制性for循环遍历当前图片数组,对第一张图片进行不透明度的变化,每变化一次画一次,就达到了渐变的效果,当第一张图片完全消失后线程等待一小段时间切换到第二张图,同样处理就构成了整个的欢迎界面动态效果。最后绘制界面,锁定画布,

35、然后调用onDraw函数进行界面绘制。 图3.2 Logo图片1 图3.3 Logo图片23.3.2主界面MainMenuSurfaceView类的设计与实现首先主界面MainMenuSurfaceView需要主控制类TafangGameActivity的引用,引用画笔和绘制线程,绘制背景图片和菜单图片,然后初始化加载主界面中用到的图片资源,通过MainMenuSurfaceView调用activity继承父类,然后需要注册回调接口用getHolder().addCallback(this)函数定义。其中用到了重要的onTouchEvent触摸方法,通过触摸不同的选项图标执行不同的时间相应;首

36、先获得当前触摸位置的坐标,用case函数定义按下事件MotionEvent.ACTTON_DOWN,然后通过坐标的计算,触摸不同菜单中的选项进行不同界面的切换,具体核心代码如下:switch(event.getAction() case MotionEvent.ACTION_DOWN: if(x=GOON_X&x=GOON_Y&y=NEW_X&x=NEW_Y&y=JIFEN_X&x=JIFEN_Y &y=YINXIAO_X&x=YINXIAO_Y&y=HELP_X&x=HELP_Y &y=EXIT_X&x=EXIT_Y &y=0) /全部显示在界面中/father.status = 2;fat

37、her.ballY=0;break; /全部显示停止移动tryThread.sleep(sleepSpan);/线程休眠catch(Exception e)e.printStackTrace();/捕获并打印异常这样不断绘制弹出菜单,让用户感觉到每次进入到主界面,弹出的菜单都是从顶部滑落,效果非常的炫酷。3.3.3音效设置本游戏的音效包含游戏的背景音乐和游戏的炮弹音效,音效界面中可以通过控制背景音乐和游戏音效控制按钮来控制音效的使用,界面开发同主界面介绍类似,整体上都是通过线程重绘相应的SurfaceView对象,在MusicSurfaceView中同样设置画笔颜色可见度,绘制游戏背景音乐和游

38、戏音效的开关和坐标,然后定义触摸事件,定义两个按钮不同的位置按下来控制不同音效的开关,如下图:图3.6 音乐设置效果图SurfaceView是可以直接从内存等硬件接口取得图像数据,是个非常重要的绘图容器。它继承自View,但他与View不同的是他在一个新线程中更新画面,可以在主线程之外的线程中向屏幕绘图。我们不可能写一个方法让主线程自己运动,所以View的特性决定了其不适合做动画,因为如果更新画面时间过长,那么主UI线程就会被正在画的函数阻塞。SurfaceView的实现需要继承SurfaceView并实现SurfaceHolder.Callback接口,因为使用SurfaceView 有一个

39、原则就是所有绘图工作必须得在Surface 被创建之后才能开始,写入到Surface 的内容可以被直接复制到显存从而显示出来,这使得显示速度会非常快),而在Surface 被销毁之前必须结束。所以在游戏开发中多次用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。所以Android中通常用SurfaceView显示动画效果。3.3.4积分榜界面积分榜设计为了记录玩家游戏的积分过程,玩家可以通过上下触摸滑动积分榜对话框查看不同的积分记录。这里要提要日期绘制的方法drawDateBitmap,实现代码如下: /画日期图片的方法public void drawDat

40、eBitmap(String numberStr,float endX,float endY,Canvas canvas,Paint paint)for(int i=0;inumberStr.length();i+) /遍历字符串char c=numberStr.charAt(i); /得到当前字符if(c=-) /绘制横杠canvas.drawBitmap(gangBitmap,endX-numberWidth*(numberStr.length()-i), endY, paint);elsecanvas.drawBitmap /绘制数字(numberBitmapsc-0, endX-num

41、berWidth*(numberStr.length()-i), endY, paint);通过数据库的查询得到游戏的积分以及相对应的玩家游戏时间,该方法为绘制时间的方法,遍历时间字符串遇到横杆就画横杆,遇到数字就绘制数字,这样就完成了事件的绘制。而上下查找记录则需要触摸事件,定义按下和抬起事件,定义在一定值域范围内不翻页,如果其y值往下移动判断如果下面有积分数据则继续拖动,反之停止。 3.4游戏界面及其相关类的设计与实现3.4.1怪物Target类首先在Target类中定义怪物出现的起始位置的x和y坐标,然后定义怪物行走的方向,当前怪物的图片和坐标,当前怪物的血量和不变的总血量,这里的怪物的

42、血量采用的是绘制了红色的底色,然后用绿色图片纹理绘制表示当前的血量,这样绘制更加的美观合理,之后定义当前怪物的种类,设置怪物行走、方向设置、状态换帧以及生命血槽路径的方法。下面是怪物类体系结构:怪物类行走怪物数量血槽图3.7 怪物类结构体系图行走方面,包括1.怪物的路径是固定的,根据地图的路径,怪物必须按照地图矩阵模拟化的路径行走,2.怪物行走过程中需要计算怪物当前坐标和判断接下来是否有可行走的路径,判断后怪物接着行走;3.怪物行走时通过加载图片数组和刷新图片完成怪物转弯和行走动画。怪物数量通过TargetNumThread线程设置每一波怪物的血量,并且每增加一波就多产生怪物给玩家造成难度增加

43、,这样才更有趣味性。血槽是显示怪物血量多少的标志,通过剪切多边形,遍历坐标绘制怪物血槽纹理,并拿绿色代表生命值,通过箭塔发射的箭与怪物碰撞检测判断每次攻击怪物血槽剩余多少,完成红色被攻击的血量,给人真实合理的感觉。 首先在Target类中定义怪物行走的方向,然后定义怪物出现的起始位置的x和y坐标,用static List ta=new Vector()函数定义最终进入家园营地的怪物列表,定义当前血量和不变的总血量,然后定义Bitmap数组,得到当前状态下的状态图片组,怪物没有阵亡的绘制声明和声明图片的底色与路径,这样防止对后面的绘制产生影响。下面具体说说怪物行走的方法:首先在goRoad函数中

44、定义怪物行走一步后的位置坐标,然后判断怪物行走一步后是否走出路径的标志位,然后定义怪物左上侧坐标位置并判断如果左上侧超出了地图则当前位置没有路径,代码如图: public void goRode() /怪物行走方法体float x1=(float) (ballx+xspan*Math.cos(direction); /行走一步后的怪物位置坐标float y1=(float)(bally+xspan*Math.sin(direction);boolean backFlag=false;/判断是否走出路径的标志位/左上侧坐标位置float tempX=(float) (x1-SINGLE_PIC/

45、2+0.01);float tempY=(float) (y1-SINGLE_PIC/2+0.01);int tempCol=(int)(tempX/SINGLE_RODER=0)?(tempX/SINGLE_RODER):-1); /左上侧坐标位置int tempRow=(int)(tempY/SINGLE_RODER=0)?(tempY/SINGLE_RODER):-1);if(tempCol=-1|tempRow=-1| /左上侧位置超出了地图MAPtempRowtempCol=0) /当前位置没有路径/若碰撞则设置恢复标记backFlag=true; /碰撞体右上侧点=begintem

46、pX=(float) (x1+SINGLE_PIC/2-0.01); /怪物右上侧坐标tempY=(float) (y1-SINGLE_PIC/2+0.01); tempCol=(int)(tempX/SINGLE_RODER=0)?(tempX/SINGLE_RODER):-1);/右上侧点行列 tempRow=(int)(tempY/SINGLE_RODER=0)?(tempY/SINGLE_RODER):-1); if(tempCol=-1| tempRow=-1| MAPtempRowtempCol=0) /若碰撞则设置恢复标记 backFlag=true; / /碰撞体左下侧点= t

47、empX=(float) (x1-SINGLE_PIC/2+0.01);/左下侧点XY坐标 tempY=(float) (y1+SINGLE_PIC/2-0.01); tempCol=(int)(tempX/SINGLE_RODER=0)?(tempX/SINGLE_RODER):-1);/左下侧点行列 tempRow=(int)(tempY/SINGLE_RODER=0)?(tempY/SINGLE_RODER):-1); if(tempCol=-1| tempRow=-1| MAPtempRowtempCol=0) /若碰撞则设置恢复标记 backFlag=true; / /碰撞体右下侧点

48、=begin tempX=(float) (x1+SINGLE_PIC/2-0.01);/右下侧点XY坐标 tempY=(float) (y1+SINGLE_PIC/2-0.01); tempCol=(int)(tempX/SINGLE_RODER=0)?(tempX/SINGLE_RODER):-1);/右下侧点行列 tempRow=(int)(tempY/SINGLE_RODER=0)?(tempY/SINGLE_RODER):-1); if(tempCol=-1| tempRow=-1| MAPtempRowtempCol=0) /若碰撞则设置恢复标记 backFlag=true; 右上

49、侧,左下侧和右下侧道理一样,通过坐标计算得到当前位置所处游戏地图上的行列数,判断地位置是否有路径,并设置可走的标志位。然后判断怪物是否侵袭到家园,用gameView.homeTh.setFlag(true)设置家园营地被侵袭,抖动线程开启,并且定义函数gameView.activity.shake()设置手机振动,再次判断如果怪物进入家园营地,当前怪物从从列表中删除,并同时判断家园血量是否不为0,如果营地血量不为零,若再有怪物侵袭家园依然血量减1,然后振动表明家园有怪物侵袭,如果为零则游戏结束。通过if else语句判断backFlag是否为空,也就是怪物前进后是否有路径可走,如果有则num+

50、表明当前怪物可以顺着当前方向走,否则i+表明怪物不能沿当前方向行走,需要改变方向。这里用到了控制方向的函数方法CallDirection(),代码如下:/怪物行走方向设置方法public double CallDirection(float x,float y)double result = 0.0; /结果变量if(x=0&y0)result = (0.5*Math.PI); /90度else if(x=0&y0)result=(0.0*Math.PI); /0度else if(y=0&x0)result=(1*Math.PI); /180度return result;通过这个方法得出怪物处

51、于不同位置时,通过计算得出下一步怪物要走的方向,这样就可以看到怪物当行走到弯路时可以自动转身寻找正确的方向。怪物行走和方向问题解决了,还要通过加载不同方向的怪物图片刷新图片实现怪物转身的问题,所以同理在同一方向上刷新不同行走状态的图片就形成了怪物的动态行走,代码如下:/根据怪物的行走的方向决定怪物的图片public Bitmap getbitmap(double direction,int state)Bitmap result=new Bitmap4;if(direction=0.5*Math.PI) /怪物向上走result=gameView.targetbottomstate;if(di

52、rection=1.5*Math.PI) /怪物向下走result=gameView.targettopstate;if(direction=0.0*Math.PI) /怪物水平向右走result=gameView.targetstraightstate;return result;最后绘制当前怪物的血量,需要先绘制怪物,然后绘制四边形得到路径,再绘制当前血量,得到当前血量的四边形范围后从顺时针为起点遍历,得到当前怪物血量纹理矩形的路径。3.4.2箭塔SingleJianta类设计与实现本游戏设计箭塔有两种类型,他们长相不同,攻击不同,攻击范围也有所区别,而且建造的赏金也不同,所以要定义行数和

53、列数和箭塔要放置的地图列数和行数,以便判断箭塔能否在其上面建造,然后定义箭塔的半径等,通过构造器的声明,箭塔图标种类、箭塔位置和箭塔半径定位一个唯一的箭塔,最后通过计算出绘制图片的起点x和y坐标绘制当前箭塔,最后绘制箭塔坐标,箭塔建成: 图3.8 箭塔1 图3.9 箭塔23.4.3箭Shell类设计与实现本游戏设计白色圆点为箭塔射出的箭,所以射出的箭需要跟怪物有碰撞检测。首先在shell类中定义箭塔和箭的临时列表,用Canvas绘制当前获得箭x和y坐标的箭。在调用getlength函数求解两点之间的距离。然后,在方法go()里面定义方向函数,x和y坐标,对当前箭绑定的怪物判断,若已死亡则该箭进

54、入删除列表,如果箭跟怪物有碰撞,则怪物血量自减1,当怪物当前血量为0时,每击杀一个怪物获得赏金5,杀敌数加1,水晶物品中间计算数加1,绑定怪物进入删除列表,当箭超出箭塔射程后,箭进入删除列表,在游戏界面中消失代码如下:/箭前进的方法public void go()direction=calDirection1(shellx,shelly,tartee.ballx,tartee.bally); /方向float llx=(float) (SPEED*Math.sin(direction*Math.PI/180)+shellx);/x坐标float lly=(float) (SPEED*Math.

55、cos(direction*Math.PI/180)+shelly);/y坐标if(tas.contains(tartee) /如果当前箭绑定怪物已死shl.add(this); /该箭进入删除列表if(IsTwoRectCross/一个矩形的四个顶点之一是否在另一个矩形内(llx,lly,JIAN_TOU_WEIGHT,JIAN_TOU_HEIGHT,/左上点x,y坐标,长,宽tartee.ballx-SINGLE_PIC/2+20,tartee.bally-SINGLE_PIC/2,SINGLE_PIC-15,SINGLE_PIC-15)/每击杀一个怪物获得金钱奖励 tartee.bloodsum-=1; /怪物血量自减1if(tartee.bloodsum=0) /如果当前怪物血量为0if(!tas.contains(tartee)gameView.doller+=5; /击杀一个怪物加5块钱gameView.shaNUM+=1; /杀敌数加1gameView.shuijingMiddleNum+=1; /水晶物品中间计算数加1tas.add(t

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!