基于Android平台的“跳吧”游戏的设计与实现_第1页
基于Android平台的“跳吧”游戏的设计与实现_第2页
基于Android平台的“跳吧”游戏的设计与实现_第3页
基于Android平台的“跳吧”游戏的设计与实现_第4页
基于Android平台的“跳吧”游戏的设计与实现_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

系统概述1.1游戏开发背景及意义1.1.1开发背景手机游戏的出现是为了娱乐心神,并随着移动终端和移动通信网络的不断进步,手机游戏也正在经历由简单到复杂的进化过程。从全球来看,移动终端的娱乐服务被认为是带动移动数据业务快速发展的重要力量。作为手机娱乐服务的重要内容之一,近年来,伴随着移动网络和移动终端性能的不断提高与完善,尤其是智能手机的出现,手机游戏业务呈现快速增长趋势。近几年来,手机游戏快速发展的同时按内容可分为:角色扮演类、冒险类、格斗类、体育竞技类、电影改版类、棋牌类、益智类、模拟类。手机游戏种类已成为人类线上娱乐生活的不可缺少的最主流的载体而存在,各类智能手机伴随着PC网络游戏为基础、3网络的不断变化为措施的条件下大力迅猛发展手机网络游戏。虽然手机游戏的用户越来越多,丰富多彩的游戏种类给玩家带来了更多的选择,但是我国的手机游戏行业的发展现状并不乐观,主要因素有:(1)高质量游戏软件开发公司和人才的贫乏,导致无优秀游戏打入市场。(2)游戏创意的匮乏。大多游戏都只是一味的跟风,看到某个游戏成功赢得市场,便改换场景风格,人物造型、故事背景等,其游戏核心一沉不变的思维理念会使得玩家产生审美疲劳。随着Android游戏的商业模式越来越凸显,人们对移动终端的休闲娱乐功能需求越来越大,移动终端上的游戏已成为成为现代人们娱乐生活中不可或缺的。游戏应用服务市场促使手机平台的不断提升而日新月异。在未来的游戏产品能否脱颖而出,一切取决于你能玩出什么花样来,这将激发更多的开发商和制作人员攻坚克难创作出高质量的作品,而面对手机游戏自身的趣味性、易掌握性、可中断性、交互性、游戏商家也将面临亘古未见得激烈竞争。由此可见,手机已是人们日常生活中密不或缺的休闲娱乐方式。1.1.2开发意义在人们的生活中,大多数人都已离不开手机,而大多数手机用户选择智能手机,开发Android游戏旨在为人们日常生活添加更多的娱乐方式,此次设计出一个能够在任何环境任何时间放松心情娱乐心身的单机游戏,通过简单易操作的Android游戏帮助手机用户打发闲暇时间、娱乐心身、放松心情。1.2开发平台介绍“跳吧”游戏开发平台为Eclipse4.3.2+ADT22.6.2+JDK1.7.0_51,模拟测试平台为AndroidSDK模拟器,真机测试平台为ZTEU930HD。1.2.1EclipseEclipse是不仅仅是成为专门开发JAVA程序的IDE环境,根据Eclipse的体系结构,通过开发插件,它能扩展到任何语言的开发,甚至能成为图片绘制的工具。Eclipse是一个开放源代码的项目,任何人都可以下载Eclipse的源代码,并且在此基础上开发自己的功能插件。也就是说未来只要有人需要,就会有建立在Eclipse之上的C++,JAVA,Python等语言的开发插件出现。同时可以通过开发新的插件扩展现有插件的功能。可以无限扩展,而且有着统一的外观,操作和系统资源管理,这也正是Eclipse的潜力所在。在本项目中,Eclipse正是通过第三方插件—ADT实现了开发Android应用。1.2.2ADTADT是英文AndroidDevelopmentTools的简称,即Android开发工具包。ADT是Eclipse中构建Android应用程序IDE插件,ADT扩展了Eclipse的功能,让开发人员快速建立新的Android项目、创建应用程序的用户界面。ADT可以帮助Eclipse找到Androidsdk,再加上Android框架的API组件调试使用AndroidSDK工具,以便APK分发给应用程序。ADT大大减轻Android应用程序的开发工作量,工具集成XML编辑器,将给开发人员一个令人难以置信的开发Android应用环境。使用ADT之前,必须确认已经安装了Eclipse以及同EclipseIDE兼容版本的AndroidSDK。1.2.3JDKJDK(JavaDevelopmentKit)是Java语言的软件开发工具包(SDK)。有SE、EE、ME三个版本。没有JDK的话,无法编译Java程序,如果想只运行Java程序,要确保已安装相应的JRE。1.3Android操作系统结构1.3.1Android操作系统介绍Android是一种基于Linux的自由及开放源代码的操作系统,主要在移动设备上工作,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。Android操作系统最初由AndyRubin开发,主要支持手机。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上。1.3.2Android操作系统的优点作为一个手机平台,Android在技术上的优势主要有以下几点:(1)全开放智能手机平台(2)多硬件平台的支持(3)使用众多的标准化技术(4)核心技术完整,统一(5)完善的SDK和文档(6)完善的辅助开发工具Android的开发者可以在完备的开发环境中进行开发,Android的官方网站也提供了丰富的文档、资料。这样有利于Android系统的开发和运行在一个良好的生态环境中。1.3.3Android系统结构Android的系统结构如下图1.1所示:图1.1Android系统结构Android的第1层次由C语言实现,第2层次由C和/C++实现,第3、4层次主要由Java代码实现。第1层次和第2层次之间,从Linux操作系统的角度来来看,是内核空间与用户空间的分界线,第1层次运行于内核空间,第2、3、4层次运行于用户空间。第2层次和第3层次之间,是本地代码层和Java代码层的接口。第3层次和第4层次之间,是Android的系统API的接口,对于Android应用程序的开发,第3层次以下的内容是不可见的,仅考虑系统API即可。由于Android系统需要支持Java代码的运行,这部分内容是Android的运行环境(Runtime),由虚拟机和Java基本类组成。对于Android应用程序的开发,主要关注第3层次和第4层次之间的接口。1.3.4Android应用程序组成部分一般情况下,Android应用程序由以下4种组件构成:„活动(Activity)、广播接收器(BroadcastReceiver)、服务(Service)、内容提供者(ContentProvider)。活动是最基本的Android应用程序组件,在应用程序中,一个活动通常就是一个单独的用户界面。每一个活动都被实现为一个独立的类,并且从活动(Activity)基类中继承而来,活动类将会显示由视图(View)控件组成的用户接口,并对事件(Event)做出响应。大多数的应用程序都会有多个用户界面,因此便会有多个相应的活动。Android的一个活动一般对应界面中的一个屏幕显示,可以理解成一个界面,每一个活动在界面上可以包含按钮、文本框等多种可视的UI元素。Android系统中的不同组件具有不同的生命周期。Android根据每个进程中运行的组件以及组件的状态把进程放入一个重要性分级(importancehierarchy)中。Android进程的重要性分级,可以理解成执行的优先级。活动的生命周期如图1.2所示。运行活动的情景:当一个活动被启动时,活动中的onCreate()、onStart()和onResume()这3个方法被依次调用,活动对应的界面出现在屏幕上。„活动被“覆盖”的情景:Android的活动一般都占据一个完整的屏幕,从当前活动启动另外一个活动时,另一个活动将被启动到前台(Foreground),当前活动转入后台(Background),这时活动的onPasuse()方法将被调用,活动转入后台运行。如果活动变为不可见,还将调用onStop()方法。在转入后台onStop()是否被调用取决于活动是否被完全覆盖,在新的活动有透明部分时,转入后台的活动依然“可见”,其他情况下(较多数的情况)活动均进入不可见状态(被完全覆盖)。„活动被恢复的情景:当界面上最前面的活动退出后,它所覆盖的活动将被恢复,这时onResume()方法将被调用,活动重新转入前台运行。„活动完全退出的情景:当使用回退(Back)按钮退出活动时,onDestroy()方法将被调用,活动关闭。如果系统缺少内存时,也会杀死(kill)后台的活动,其中优先杀死不可见的活动,可见的活动一般不会被杀死。图1.2活动的生命周期可行性分析2.1编写目的可行性研究的目的是目标系统是否值得去开发,怎样才能达到这个目的。一个项目的开发需要仔细分析,看它在目前的情况下是否可行,如果一个项目开发它具有很好的背景和意义,但是在经济上或者是技术上是不可行的,那么它也只能称之为不能实现的项目。2.2可行性研究任务2.2.1技术可行性确保现有的技术是否能解决本该开发项目:系统采用JAVA语言开发,Eclipse作为Android开发环境。ADT插件提供了一系列图形用户界面组件进行界面编程,所以在技术上可行。Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由SunMicrosystems公司推出的Java程序设计语言和Java平台的总称。Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。Java是目前使用最为广泛的网络编程语言之一。它具有简单,面向对象,稳定,与平台无关,解释型,多线程,动态等特点。Java语言有以下几点优点:面向对象的编程更符合人的思维模式,使人们更容易编写程序。内置对多线程的支持。Java程序的安全性。当你准备从网络上下载一个程序时,你最大的担心是程序中含有恶意的代码,比如试图读取或删除本地机上的一些重要文件,甚至该程序是一个病毒程序等。当你使用支持Java的浏览器时,你可以放心地运行Java的小应用程序JavaApplet,不必担心病毒的感染和恶意的企图,Java小应用程序将限制在Java运行环境中,不允许它访问计算机的其它部分。Java程序的基本组成单元就是类,有些类是自己编写的,有一些是从类库中引入的,而类又是运行时动态装载的,这就使得Java可以在分布环境中动态地维护程序及类库,而不像C++那样,每当其类库升级之后,相应的程序都必须重新修改,编译。因此我觉得Java程序语言该技术已成熟,采用JAVA编程语言是可行的。2.2.2经济可行性由于“跳吧”游戏作为毕业设计进行开发,有本人亲自开发,成本不会太高,所以经济上是可行的。2.2.3操作可行性确定软件产品是否能够被最终的用户所接受,用户是否能操作最终的产品:该游戏在方便易操作的Android手机上运行,方便于玩家操作。2.3可行性研究结论根据以上几个方面的研究,在技术上、经济上和操作上都是可行的,本项目可进行开发。需求分析3.1需求分析的意义为了开发出真正的满足用户需求的软件产品,首先必须知道用户的需求。为软件需求的深入理解是软件开发工作获得成功的前提条件,不论人们把设计和编码工作做得如何出色,不能真正的满足用户需求的程序只会令用户失望,给开发者带来烦恼。需求分析是软件定义时期的最后一个阶段,它的基本任务是准确地回答“系统必须做什么”这个问题。3.2游戏功能需求游戏能够实现让玩家在游戏中放松心神、减轻压力的作用,同时要求游戏中的精灵不断变换,锻炼玩家眼力与手部灵活性的功能。要求“跳吧”游戏能实现以下功能:主角移动功能。主角移动功能就是玩家利用手机重力感应系统对其进行左右移动操作。产生踏板功能。系统可以随机产生不同类型的踏板,这些踏板分为:稳定踏板、带刺踏板、左/右移动踏板、弹簧踏板、不稳定踏板,并且这些踏板能够以一定的速度向屏幕顶部移动;同时,带刺踏板可以对主角造成一定的伤害,左/右移动踏板可以将主角向左/右移动,弹簧踏板会将主角向上弹起,不稳定踏板会在主角站在上面时破碎,稳定踏板不产生任何效果。产生加分物品。系统会随机产生不同类型的加分物品,物品分值随物品类别不同而不同,且物品要停留一定时间再消失。设置功能。能够对游戏进行一些简单的设置,这些设置包括音效设置、震动设置、主角移动速度设置、输入玩家名称。血条功能。主角在踩到带刺踏板时,血条减少一定的值,当主角掉到屏幕下方时血条值归零。排行榜功能。游戏可以跟据玩家的游戏得分按由高到低顺序进行排名次。3.3可靠性和可用性需求在游戏开发阶段要求在windows7操作系统、JAVA编程语言、Eclipse平台下开发,在AndroidSDK虚拟机和ZTEU930HD真机下测试运行。要求游戏能够在Android4.0.0及其以上版本、RAM为512MB的安卓手机上稳定流畅运行,并要求游戏在运行过程中不能影响手机正常通信功能及用户手机上的其他应用功能。3.4用例图在该游戏中玩家可操作游戏的功能有:通过重力感应对游戏主角进行左右移动、输入玩家名称、点击返回按钮、点击重新开始按钮、点击退出按钮、点击开始按钮、点击排行榜按钮、设置音效(开/关)、设置主角移动速度、设置震动效果。游戏用例图如图3.3。图3.3用例图总体设计4.1总体设计的目标和意义经过前面的需求分析,已经确定了系统要做什么,总体设计的目的是为了实现现在怎么做。总体设计的意义是为了更好地设计游戏让后续的工作更好地高质量工作。4.2功能模块的划分该游戏有人物模块、踏板模块、设置模块、加分物品模块、血条模块、排行榜模块,其中在设置模块下包含有音效设置、震动效果设置、人物移动速度模块、输入玩家名称模块,其模块划分如下图4.1。图4.1功能模块图在主角移动模块中要实现主角移动动作时显示连续的效果;踏板模块是系统随机产生的,含有不同类型的踏板;在设置模块当中玩家可以根据自己的喜好进行音效设置(包含音效的开和关)、震动效果设置、输入玩家名称和主角移动速度的设置;在加分物品模块当中,系统会随机产生8中不同类型的加分物品,当主角捡到加分物品时游戏成绩增加,血条模块当中,每当主角受到伤害时血条值将会减少一定的值;排行榜模块是为了更好地显示玩家排名。4.3时序图游戏大概操作流程为玩家点击游戏图标进入游戏主界面,然后点击开始游戏进行操作,等游戏结束后玩家在弹出的窗口输入玩家名称,然后点击结束按钮退出游戏,游戏时序图如图4.2。图4.2时序图详细设计5.1详细设计的目的和意义详细设计的目的是为了能够确定具体地实现所要求的系统,经过前面的分析和设计,现应该对目标系统得出详细的描述,并设计出详细的方案,以便让程序员能够写出更为高质量的程序代码。5.2总程序流程图系统总程序流程图如图5.1所示。图5.1系统总流程图系统开始时先进行判断是否为开始游戏、是否设置游戏参数、是否查看排名、是否退出游戏,然后系统根据选择进行相应的操作,如果选择是开始游戏则做出开始游戏的动作直到游戏结束并输入玩家名称,点击返回按钮;若选择为设置游戏则对游戏的各项参数进行设置,然后点击返回按钮;加入选择排名则系统显示玩家成绩与排名,然后点击返回按钮。图5.2游戏流程图游戏流程图如图5.2所示,当点击开始游戏时,系统判断玩家接触到的踏板类型,然后根据踏板的类型做出不同的效果,当玩家左右移动时碰到不稳定踏板时,踏板破碎;当为弹簧踏板时玩家被弹起;当为左右移动踏板时,玩家随踏板左右移动;当为带刺踏板时,玩家血条将会减少一定的值;当玩家血条为零或者玩家直接调到屏幕下面则游戏结束。图5.3游戏设置流程图当选择游戏设置时,玩家可以对游戏参数进行设置,其设置流程图如图5.3所示。当选择设置音效时,在游戏设置界面,设置音效的开/关。当选择为设置人物移动速度时,在游戏设置界面通过左右滑动调节线条来调节游戏角色的移动速度,当选择为录入玩家的名称时在设置界面文本框内输入玩家的名称,然后点击退出按钮进行保存设置并退出到游戏主界面,或者当点击设置界面的返回按钮时返回游戏主界面。5.3随机产生踏板系统随机产生0到19数字,当随机数在0-2之间时游戏生成不稳定踏板,随机数在3-5之间时游戏生成弹簧踏板,随机数在6-11之间时游戏生成带刺踏板,当随机数在12-13之间时游戏生成左移动踏板,当随机数在14-15之间时游戏生成右移动踏板,当随机数在16-19之间时游戏生成稳定踏板。其踏板产生机制如图5.4所示。图5.4踏板的产生5.4血条参数的设置为了游戏更加吸引玩家,同时考虑到游戏的难易程度,玩家在游戏中的心理作用,现将游戏的血条总参数设置为18,也就是说游戏主角的总生命值为18,当游戏主角每次收到伤害时,血条值减少3,也就是说每当玩家受到一次伤害时,游戏主角的生命值减少3,这样当玩家受到伤害6次游戏将结束,或者当玩家直接掉到屏幕下面时游戏主角的生命值为0,游戏结束。5.5加分物品的生成为了游戏的有趣性,更好的让玩家放松,在游戏中得到更大的乐趣,设置加分机制,在游戏中将随机产生香蕉、蛋糕、西红柿、桃子、草莓、山果、梨子、面包。每个加分物品的分值如下:面包——1桃子——5山果——4草莓——6西红柿——10梨——12香蕉——15蛋糕——20加分物品随机产生参数的设置,系统随机产生23个数,当随机数为0时游戏生成面包,当随机数为1时游戏生成蛋糕,随机数在2-4之间时游戏生成香蕉,随机数在5-7之间时游戏生成梨,当随机数在8-10之间时游戏生成西红柿,当随机数在11-13之间时游戏生成桃,当随机数在14-17之间时游戏生成草莓,当随机数在18-21之间时游戏生成山果。5.6主角连续动作的生成首先利用if语句判断主角的状态是出于何种状态,,然后根据所处的状态将首张图片赋给主角判断形状的变量,然后在判断主角形状变量与下一张的关系,然后再将下一张图片赋给主角形状变量直到最后一张,最后通过循环语句和系统定时器来控制动作的发生和结束。5.7主角与踏板关系的判定当系统随机生成六中不同类型的踏板时,如何判断主角与踏板发生碰撞呢?下面是解决主角与踏板关系的实现方法。给主角定义一个主角状态变量、同时定义踏板类型变量。首先判断主角与踏板碰撞效果,利用if语句判断主句坐标与踏板坐标的关系,具体如下:当主角最大Y轴值大于等于踏板Y轴最小值,同时主角Y轴最大值小于踏板Y轴最大值,同时主角最大X值大于踏板X轴最小值,并且主角X轴最小值小于踏板X轴最大值时为主角和踏板发生了碰撞。然后再通过主角状态变量与踏板类型变量的关系来判断主角与何种踏板发生碰撞并作出相应的效果。5.8主角与加分物品关系的判定判断主角与加分物品的关系和判断主角与踏板关系的方法基本相似,都是通过坐标进行判断,当主角最大Y轴值大于等于加分物品Y轴最小值,同时主角Y轴最大值小于加分物品Y轴最大值,同时主角最大X值大于加分物品X轴最小值,并且主角X轴最小值小于加分物品X轴最大值时为主角和加分物品发生了碰撞。开发平台的搭建6.1JAVA虚拟机的安装6.1.1JDK的安装下载jdk1.7.0_51软件,打开软件进行安装,如图6.1、6.2。图6.1JDK的安装图6.2JDK完成安装6.1.2Java环境变量配置1.打开我的电脑--属性--高级--环境变量,如图6.3。图6.3配置Java环境变量2.新建系统变量JAVA_HOME和CLASSPATH变量名:JAVA_HOME变量值:C:\ProgramFiles\Java\jdk1.7.0变量名:CLASSPATH变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;3.选择“系统变量”中变量名为“Path”的环境变量,双击该变量,把JDK安装路径中bin目录的绝对路径,添加到Path变量的值中,并使用半角的分号和已有的路径进行分隔。变量名:Path变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;6.2Eclipse的安装下载Eclipse4.3.2、ADT22.6.2、AndroidSDK。6.2.1安装SDK点击AndroidSDK进行安装,如图6.4。图6.4安装SDK完成安装后,打开SDK下载相应的Android操作系统版本,如图6.5。图6.5安装Android操作系统6.2.2Eclipse的安装1、点击Eclipse安装软件,根据提示进行安装,安装完成后,点击help-->installnewsoftware,然后点击add,在弹出的窗口中点击archive选择ADT所在路径,并在name除填入ADT名称,然后点击OK,根据提示进行安装ADT插件,如图4.6。图6.6安装ADT插件点击Window->preference,点击Android选择Browse选择sdk所在路径,点击apply然后点击OK,如图6.7。图6.7添加SDK路径编码实现7.1编码的目的通过编码把软件设计结果翻译成Java语言的程序,同时也是对设计的进一步具体化,也是对所学知识的一个具体体现。7.2游戏截图游戏截图如下图7.1,图7.2,图7.3,图7.4。图7.1游戏主界面图7.2开始游戏界面图7.3设置界面图7.4游戏结束界面7.3游戏功能的实现7.3.1主角动作的实现主角每完成一个完整的动作是由好多个分解动作组成,比如主角向左移动时,是由好几个向左走动的单个动作构成,那么判断主角移动状态并形成连续的动作的算法如下:publicintgetRoleSharp(){ if(mRoleStatus==UIModel.ROLE_STATUS_ON_FOOTBOARD){ mRoleSharp=UIModel.ROLE_SHARP_STANDING; returnmRoleSharp; } mFrameCounter++; if(mFrameCounter==mFrameDelay){ mFrameCounter=0; if(mRoleStatus==UIModel.ROLE_STATUS_FREEFALL){ if(mRoleSharp==UIModel.ROLE_SHARP_FREEFALL_NO1){ mRoleSharp=UIModel.ROLE_SHARP_FREEFALL_NO2; }elseif(mRoleSharp==UIModel.ROLE_SHARP_FREEFALL_NO2){ mRoleSharp=UIModel.ROLE_SHARP_FREEFALL_NO3; }elseif(mRoleSharp==UIModel.ROLE_SHARP_FREEFALL_NO3){ mRoleSharp=UIModel.ROLE_SHARP_FREEFALL_NO4; }else{ mRoleSharp=UIModel.ROLE_SHARP_FREEFALL_NO1; } }elseif(mRoleStatus==UIModel.ROLE_STATUS_FREEFALL_RIGHT ||mRoleStatus==UIModel.ROLE_STATUS_ON_FOOTBOARD_RIGHT){ if(mRoleSharp==UIModel.ROLE_SHARP_MOVE_RIGHT_NO1){ mRoleSharp=UIModel.ROLE_SHARP_MOVE_RIGHT_NO2; }elseif(mRoleSharp==UIModel.ROLE_SHARP_MOVE_RIGHT_NO2){ mRoleSharp=UIModel.ROLE_SHARP_MOVE_RIGHT_NO3; }elseif(mRoleSharp==UIModel.ROLE_SHARP_MOVE_RIGHT_NO3){ mRoleSharp=UIModel.ROLE_SHARP_MOVE_RIGHT_NO4; }else{ mRoleSharp=UIModel.ROLE_SHARP_MOVE_RIGHT_NO1; } }else{ if(mRoleSharp==UIModel.ROLE_SHARP_MOVE_LEFT_NO1){ mRoleSharp=UIModel.ROLE_SHARP_MOVE_LEFT_NO2; }elseif(mRoleSharp==UIModel.ROLE_SHARP_MOVE_LEFT_NO2){ mRoleSharp=UIModel.ROLE_SHARP_MOVE_LEFT_NO3; }elseif(mRoleSharp==UIModel.ROLE_SHARP_MOVE_LEFT_NO3){ mRoleSharp=UIModel.ROLE_SHARP_MOVE_LEFT_NO4; }else{ mRoleSharp=UIModel.ROLE_SHARP_MOVE_LEFT_NO1; } } } returnmRoleSharp; }7.3.2随机产生踏板在游戏中随机生成20个随机数,并根据详细设计里的规则形成相应的踏板,其算法如下:privatevoidgenerateFootboard(){ intframeAmount=1; intframeDelay=1; intframeType=FOOTBOARD_TYPE_NORMAL; switch(mRan.nextInt(20)){ case0: case1: case2: frameType=FOOTBOARD_TYPE_UNSTABLE; break; case3: case4: case5: frameType=FOOTBOARD_TYPE_SPRING; break; case6: case7: case8: case9: case10: case11: frameType=FOOTBOARD_TYPE_SPIKED; break; case12: case13: frameType=FOOTBOARD_TYPE_MOVING_LEFT; frameAmount=2; frameDelay=15; break; case14: case15: frameType=FOOTBOARD_TYPE_MOVING_RIGHT; frameAmount=2; frameDelay=15; break; default: frameType=FOOTBOARD_TYPE_NORMAL;} mFootboardList.add(newFootboard(mRan.nextInt(mScreenAttribute.maxX -BORDER_ATTRIBUTE_IMAGE_WIDTH),mScreenAttribute.maxY +ROLE_ATTRIBUTE_HEITH,BORDER_ATTRIBUTE_IMAGE_WIDTH, BORDER_ATTRIBUTE_IMAGE_HEITH,frameType,frameAmount, frameDelay));}随机产生的踏板如图7.1所示。图7.1随机产生的踏板7.3.3下一个踏板的生成当随机产生踏板时,在游戏当中还要有生成下一个踏板的算法,生成下一个踏板的算法如下所示:publicintnextFrame(){ try{ returnmFrameCounter/mFrameDelay; }finally{ mFrameCounter++; if(mFrameCounter==mFrameAmount*mFrameDelay){ mFrameCounter=0; } }7.3.4随机生成加分物品根据详细设计规定,随机生成25个随机数,根据相关规定生成加分物品,实现算法如下:privatevoidgenerateFood(){ if(mCurFood.mTimeCounter>0){ return; } switch(mRan.nextInt(25)){ case0: mCurFood.mFoodReward=FOOD_1; break; case1: mCurFood.mFoodReward=FOOD_2; break; case2: case3: case4: mCurFood.mFoodReward=FOOD_3; break; case5: case6: case7: mCurFood.mFoodReward=FOOD_4; break; case8: case9: case10: mCurFood.mFoodReward=FOOD_5; break; case11: case12: case13: mCurFood.mFoodReward=FOOD_6; break; case14: case15: case16: case17: mCurFood.mFoodReward=FOOD_7; break; case18: case19: case20: case21: mCurFood.mFoodReward=FOOD_8; break; default: mCurFood.mFoodReward=FOOD_NONE; return; } mCurFood.mMinX=mRan .nextInt((mScreenAttribute.maxX-FOOD_ATTRIBUTE_IMAGE_SIZE)); mCurFood.mMinY=mRan .nextInt((mScreenAttribute.maxY-FOOD_ATTRIBUTE_IMAGE_SIZE)); mCurFood.mMaxX=mCurFood.mMinX+FOOD_ATTRIBUTE_IMAGE_SIZE; mCurFood.mMaxY=mCurFood.mMinY+FOOD_ATTRIBUTE_IMAGE_SIZE; mCurFood.mTimeCounter=FOOD_ATTRIBUTE_DELAY_TIME; }随机产生的加分物品如下图7.2所示。7.2随机产生的加分物品7.3.5处理主角和踏板的关系在游戏当中要判断游戏主角与踏板发生碰撞,并在发生碰撞时做出相应的动作,若在没有发生碰撞时同样要发生的动作与效果的实现算法如下:privatevoidhandleRoleAction(){ Rolerole=mRole; for(Footboardfootboard:mFootboardList){ if((role.getMaxY()>=footboard.getMinY()&&role.getMaxY()<footboard.getMaxY())&&(role.getMaxX()>footboard.getMinX()&&role.getMinX()<footboard.getMaxX())){if(role.getRoleStatus()==ROLE_STATUS_ON_FOOTBOARD||role.getRoleStatus()==ROLE_STATUS_ON_FOOTBOARD_RIGHT||role.getRoleStatus()==ROLE_STATUS_ON_FOOTBOARD_LEFT){ if(footboard.getType()==FOOTBOARD_TYPE_SPRING){ mRoleVelocityY=mFootboartVelocity -GAME_ATTRIBUTE_GRAVITY_VELOCITY; role.addY(-1*GAME_ATTRIBUTE_PIXEL_DENSITY_Y); updateRoleStatus(ROLE_STATUS_FREEFALL); return; } if(footboard.getType()==FOOTBOARD_TYPE_MOVING_LEFT){ role.addX(BOARD_ATTRIBUTE_LEFT_VELOCITY); }elseif(footboard.getType()==FOOTBOARD_TYPE_MOVING_RIGHT){ role.addX(BOARD_ATTRIBUTE_RIGHT_VELOCITY); }elseif(footboard.getType()==FOOTBOARD_TYPE_UNSTABLE &&footboard.isBoardBreak()){ mFootboardList.remove(footboard); } updateRoleStatus(ROLE_STATUS_ON_FOOTBOARD); }else{ //主角第一次触板 mScore+=mLevel; mRoleVelocityY=mFootboartVelocity; role.setVirtualY(footboard.getVirtualY() -ROLE_ATTRIBUTE_HEITH *GAME_ATTRIBUTE_PIXEL_DENSITY_Y); if(footboard.getType()==FOOTBOARD_TYPE_SPIKED){ mHP-=3; } if(mHP<=0){ mGameStatus=GAME_STATUS_GAMEOVER; } updateRoleStatus(ROLE_STATUS_ON_FOOTBOARD); switch(footboard.getType()){ caseFOOTBOARD_TYPE_UNSTABLE: mEffectFlag=EFFECT_FLAG_UNSTABLE; break; caseFOOTBOARD_TYPE_SPRING: mEffectFlag=EFFECT_FLAG_SPRING; break; caseFOOTBOARD_TYPE_SPIKED: mEffectFlag=EFFECT_FLAG_SPIKED; break; caseFOOTBOARD_TYPE_MOVING_LEFT: caseFOOTBOARD_TYPE_MOVING_RIGHT: mEffectFlag=EFFECT_FLAG_MOVING; break; default: mEffectFlag=EFFECT_FLAG_NORMAL; } } return; } } if(mRoleVelocityY<mFootboartVelocity){ mRoleVelocityY+=3; }else{ mRoleVelocityY=GAME_ATTRIBUTE_GRAVITY_VELOCITY; } updateRoleStatus(ROLE_STATUS_FREEFALL); }7.3.6判断主角与加分物品的关系在该游戏中为了提高游戏的可玩性与娱乐性,设计有主角捡到加分物品可以加分的机制,当然不同的加分物品所加的分值不同,那么如何才能判断主角捡到加分物品呢?下面就是判断主角与加分物品关系的实现算法。privatevoidhandleFood(){ Foodfood=mCurFood; food.mTimeCounter--; if(food.mFoodReward!=FOOD_NONE&&food.mTimeCounter>0){ if((mRole.getMaxX()>food.mMinX&&mRole.getMinX()<food.mMaxX) &&((mRole.getMaxY()>=food.mMinY&&mRole.getMaxY()<food.mMaxY)||(mRole.getMinY()>food.mMinY&&mRole.getMinY()<=food.mMaxY))){ mEffectFlag=EFFECT_FLAG_TOOLS; mScore+=food.mFoodReward; food.mFoodReward=FOOD_NONE; }}}7.3.7重力感应系统注册重力感应监听mSensorManager.registerListener(mSensorEventListener,mSensor, SensorManager.SENSOR_DELAY_GAME); 注销重力感应监听 mSensorManager.unregisterListener(mSensorEventListener,mSensor);7.3.8游戏难度的提升privatevoidincreaseLevel(){ mLevel++; if(mLevel<18||mLevel%20==0){ mFootboartVelocity-=2; introleStatus=mRole.getRoleStatus(); if(roleStatus==ROLE_STATUS_ON_FOOTBOARD ||roleStatus==ROLE_STATUS_ON_FOOTBOARD_RIGHT ||roleStatus==ROLE_STATUS_ON_FOOTBOARD_LEFT){ mRoleVelocityY=mFootboartVelocity; }7.3.9设置实现初始化音效:soundPool=newSoundPool(10,AudioManager.STREAM_RING,5); soundPoolMap=newHashMap<Integer,Integer>(); soundPoolMap.put(UIModel.EFFECT_FLAG_NORMAL,soundPool.load( getContext(),R.raw.normal,1)); soundPoolMap.put(UIModel.EFFECT_FLAG_UNSTABLE,soundPool.load( getContext(),R.raw.unstable,1)); soundPoolMap.put(UIModel.EFFECT_FLAG_SPRING,soundPool.load( getContext(),R.raw.spring,1)); soundPoolMap.put(UIModel.EFFECT_FLAG_SPIKED,soundPool.load( getContext(),R.raw.spiked,1)); soundPoolMap.put(UIModel.EFFECT_FLAG_MOVING,soundPool.load( getContext(),R.raw.moving,1)); soundPoolMap.put(UIModel.EFFECT_FLAG_TOOLS,soundPool.load( getContext(),R.raw.tools,1));播放音效:privatevoidplaySoundEffect(intsoundId){ try{ AudioManagermgr=(AudioManager)getContext() .getSystemService(Context.AUDIO_SERVICE); floatstreamVolumeCurrent=mgr .getStreamVolume(AudioManager.STREAM_RING); floatstreamVolumeMax=mgr .getStreamMaxVolume(AudioManager.STREAM_RING); floatvolume=streamVolumeCurrent/streamVolumeMax; soundPool.play(soundPoolMap.get(soundId),volume,volume,1,0, 1f); }catch(Exceptione){ Log.d("PlaySounds",e.toString()); } }音效的设置如图7.3。图7.3音效设置系统测试8.1测试的目的及意义系统测试是为了发现错误而执行程序的过程,成功的测试是发现了至今尚未发现的错误的测试。测试的目的就是希望能以最少的人力和时间发现潜在的各种错误和缺陷。应根据开发各阶段的需求、设计等文档或程序的内部结构精心设计测试用例,并利用这些实例来运行程序,以便发现错误。信息系统测试应包括软件测试、硬件测试和网络测试。硬件测试、网络测试可以根据具体的性能指标来进行,此处所说的测试更多的是指软件测试。系统测试是保证系统质量和可靠性的关键步骤,是对系统开发过程中的系统分析系统设计和实施的最后复查。根据测试的概念和目的,在进行信息系统测试时应遵循以基本原则。应尽早并不断地进行测试。测试不是在应用系统开发完之后才进行的。由于原始问题的复杂性、开发各阶段的多样性以及参加人员之间的协调等因素,使得毛开发各个阶段都有可能出现错误。因此,,测试应贯穿在开发的各个阶段,尽早纠正错误,消除隐患。测试工作应该避免由原开发软件的人或小组承担,一方面,开发人员往往不愿召认自己的工作,总认为自己开发的软件没有错误;另一方面,开发人员的错误很对由本人测试出来,很容易根据自己编程的思路来制定测试思路,具有局限性。测试工作应由专门人员来进行,这样会更客观,更有效。在测试程序时,不仅要检验程序是否做了该做的事,还要检验程序是否做了不该做的事。多余的工作会带来副作用,影响程序的效率,有时会带来潜在的危害或错误

。严格按照测试计划来进行,避免测试的随意性。测试计划应包括测试内容、进度安排、人员安排、测试环境、测试工具和测试资料等。严格的按照测试计划可以;认证进度,使各方面都得以协调进行。妥善保存测试计划、测试用例,作为软件文档的组成部分,为维护提供方便。测试是开发过程中一个独立且非常重要的阶段,测试过程基本上与开发过程平行。8.2测试步骤8.2.1模拟器测试为了更好的测试游戏的可用性现用安卓模拟器进行测试,首先打开Eclipse软件,通过import将源代码导入工作区,然后点击工具栏的开始按钮打开模拟器进行运行,当游戏进入游戏主界面时按照以下步骤进行测试。(1)点击“选项”à播放背景音乐效果结果:正常(2)点击“选项”à播放震动效果结果:正常(3)点击“选项”à开始游戏前显示提示信息结果:正常(4)点击“选项”à播放背景音乐效果结果:正常(5)点击“选项”à播放背景音乐效果结果:正常(6)点击“选项”à输入玩家名称结果:正常游戏结果如下图所示。图8.1游戏主界面图8.2设置选项界面图8.3开始游戏界面图8.4游戏结束界面8.2.2真机测试由于考虑到模拟器的某些bug,所以要求在真机上进行测试,首先将游戏安装包通过手机数据线传到手机内存卡里面,然后在手机文件管理里找到游戏APK安装包点击安装,然后在手机界面打开游戏进行测试,测试结果截图如下:8.5真机游戏主界面8.6真机设置选项界面8.7真机排行榜界面8.8真机开始游戏界面8.9真机游戏结束界面8.3测试结果分析经过模拟器和真机测试,本游戏实现了基本的功能,不过整体功能还不是很强大,游戏在很多方面还需要进一步完善与改进,对于游戏能够正常运行的结果很满意。结束语在我接到“基于Android的游戏开发”课题时,由于本人以前从来没有接触过游戏设计,所以我就意识到开发Android游戏任务的艰巨,刚开始着手开发游戏时有点迷茫和彷徨,后来通过老师的指导和在网上查找资料,逐渐找到了一些设计思路。通过本次毕业设计让我了解到了Android游戏所涉及到的相关技术、方法,包括Android系统的基本架构与工作机制等。而且能够在Android开发平台上开发并演示一些基本软件,通过此次设计让我收获颇多。首先,学到了很多新知识,并且能够将以前所学的知识、学习方法及思维方式学以致用。经过长时间的学习,进一步熟悉了Java程序设计语言。其次,通过本次设计提高了我的动手能力,能够主动提出问题,遇到不会的知识点会主动查阅相关资料,通过实践想办法解决问题,深刻的意识到了“纸上得来终觉浅,绝知此事要躬行”的道理,也明白了实践是检验一切真理的唯一手段。最后,提高了我对检索相关资料的能力。这次毕业设计过程中我查阅了很多资料,包括网络中的电子文档、电子书籍、网页及下载的视频教学课程;不但有中文资料还有英文资料。这些资料,使我的眼界更开阔,对课题的认识更加深刻,编写程序的时候思路更加清楚,少走了很多弯路。回顾这个设计过程,我不仅学到了许多书本上以前没注意到的知识而且学到了书本外的知识。通过这次设计,能够晚上自己亲手开发的游戏,感觉很有成就感,这次设计不仅丰富了自己的实践技能而且扩展了本专业的知识面,使我受益非浅,同时也体验到了搞软件开发的困难度。在这次设计的同时,我又从中学到了不少珍贵的东西。但由于我对这样的软件开发还只是一个开始,了解的不多,这其中或许还有很多的不足,有些模块做得不是很好,有些功能还不能够完全的实现。因此做得不是很好,界面的设计及整体的布局还比较简单,没有突出特色出来,这是我这个系统的不足之处,也是我以后工作与学习中需要提升与完善的地方。致谢在完成该设计时,我是无比的兴奋,因为多个月的努力终于有结果了,当然这还得感谢我的指导老师刘爱琴,她在毕业设计期间对本人给予了悉心指导和大力帮助。在我课题设计和论文撰写的过程中,对我进行了严格督促、认真检查和仔细批阅,而且关于我的课题也提出了很多富有启发性的意见和建议。当然这也得感谢我班的同学,在精神上给予了我最大的鼓舞和帮助,我们共同监督共同学习和进步。同时,感谢我身边的朋友,在本人程序设计和论文撰写最艰难时期,他们不断鼓励和帮助我。最后,还要向我的家人表示深深的感谢,他们给予了我精神和物质上的支持,没有他们的帮助和关怀,也许我就无法顺利地完成这次毕业设计。参考文献[1]雍俊海.Java程序设计.北京:清华大学出版社,2004年[2]Horstmann,C.S.著,叶乃文,杜永萍译.Java核心技术卷I:基础知识.北京:机械工业出版社,2008年[3]朱福喜,黄昊.Java项目开发与毕业设计指导.北京:清华大学出版社,2008年[4]杨丰盛.Android应用开发揭秘.机械工业出版社,2010年[5]VladimirSilva著,王恒,苏金国译.精通Android游戏开发.机械工业出版社,2010年[6]张海潘.软件工程导论(第五版).北京:清华大学出版社,2008年附录外文翻译IntroductiontoJavaJavaisdesignedtomeetthechallengesofapplicationdevelopmentinthecontextofheterogeneous,network-widedistributedenvironments.Paramountamongthesechallengesissecuredeliveryofapplicationsthatconsumetheminimumofsystemresources,canrunonanyhardwareandsoftwareplatform,andcanbeextendeddynamically.Javaoriginatedaspartofaresearchprojecttodevelopadvancedsoftwareforawidevarietyofnetworkdevicesandembeddedsystems.Thegoalwastodevelopasmall,reliable,portable,distributed,real-timeoperatingplatform.Whentheprojectstarted,C++wasthelanguageofchoice.ButovertimethedifficultiesencounteredwithC++grewtothepointwheretheproblemscouldbestbeaddressedbycreatinganentirelynewlanguageplatform.DesignandarchitecturedecisionsdrewfromavarietyoflanguagessuchasEiffel,SmallTalk,ObjectiveC,andCedar/Mesa.Theresultisalanguageplatformthathasprovenidealfordevelopingsecure,distributed,networkbasedend-userapplicationsinenvironmentsrangingfromnetwork-embeddeddevicestotheWorld-WideWebandthedesktop.ThedesignrequirementsofJavaaredrivenbythenatureofthecomputingenvironmentsinwhichsoftwaremustbedeployed.ThemassivegrowthoftheInternetandtheWorld-WideWebleadsustoacompletelynewwayoflookingatdevelopmentanddistributionofsoftware.Toliveintheworldofelectroniccommerceanddistribution,Javamustenablethedevelopmentofsecure,highperformance,andhighlyrobustapplicationsonmultipleplatformsinheterogeneous,distributednetworks.Operatingonmultipleplatformsinheterogeneousnetworksinvalidatesthetraditionalschemesofbinarydistribution,release,upgrade,patch,andsoon.Tosurviveinthisjungle,Javamustbearchitectureneutral,portable,anddynamicallyadaptable.TheJavasystemthatemergedtomeettheseneedsissimple,soitcanbeeasilyprogrammedbymostdevelopers;familiar,sothatcurrentdeveloperscaneasilylearnJava;objectoriented,totakeadvantageofmodernsoftwaredevelopmentmethodologiesandtofitintodistributedclient-serverapplications;multithreaded,forhighperformanceinapplicationsthatneedtoperformmultipleconcurrentactivities,suchasmultimedia;andinterpreted,formaximumportabilityanddynamiccapabilities.Together,theaboverequirementscomprisequiteacollectionofbuzzwords,solet’sexaminesomeofthemandtheirrespectivebenefitsbeforegoingon.What’scompletelynewisthemannerinwhichJavaanditsrun-timesystemhavecombinedthemtoproduceaflexibleandpowerfulprogrammingsystem..DevelopingyourapplicationsusingJavaresultsinsoftwarethatisportableacrossmultiplemachinearchitectures,operatingsystems,andgraphicaluserinterfaces,secure,andhighperformance,WithJava,yourjobasasoftwaredeveloperismucheasier—youfocusyourfullattentionontheendgoalofshippinginnovativeproductsontime,basedonthesolidfoundationofJava.Thebetterwaytodevelopsoftwareishere,now,broughttoyoubytheJavalanguageplatform.VerydynamiclanguageslikeLisp,TCL,andSmallTalkareoftenusedforprototyping.Oneofthereasonsfortheirsuccessatthisisthattheyareveryrobust—youdon’thavetoworryaboutfreeingorcorruptingmemory.Similarly,programmerscanberelativelyfearlessaboutdealingwithmemorywhenprogramminginJava,Thegarbagecollectionsystemmakestheprogrammer’sjobvastlyeasier;withtheburdenofmemorymanagementtakenofftheprogrammer’sshoulders,storageallocationerrorsgoaway.AnotherreasoncommonlygiventhatlanguageslikeLisp,TCL,andSmallTalkaregoodforprototypingisthattheydon’trequireyoutopindowndecisionsearlyon—theselanguagesaresemanticallyrich.Javahasexactlytheoppositeproperty:itforcesyoutomakeexplicitchoices.Alongwiththesechoicescomealotofassistance—youcanwritemethodinvocationsand,ifyougetsomethingwrong,yougettoldaboutitatcompiletime.Youdon’thavetoworryaboutmethodinvocationerror.TheJavabeginnermustgrasp30basicconceptsBasicconcept1.InOOPtheonlyrelationsiswhattheobject’sinterface,suchasthecomputersellerheleavesaloneinternalstructureofelectricalsource,butheisonlyconcernedaboutthatwhetherthepowerwillbesuppliedtoyou,alsosolongasknowcanornotbutisnothowandwhy.Allproceduresaremakeupofcertainattributeandthebehaviorobject,thedifferentobjectvisitinvokesthroughthefunctioninvocation,betweentheobjectallintercommunionareinvokethroughthemethodinvocation,Byobjectdataencapsulation,enhancesreuserateverymuch..2.InOOPthemostimportantthoughtisclass,theclassisthetemplate,isablueprint,constructanobjectfromaclass,namelyconstructaninstanceoftheclass.3.Encapsulation:isthatcombinesthedataandthebehaviorinapackage)andhidesthedatatherealizationprocesstotheobjectuser,inanobjectdataiscalleditsinstancefield.4.Throughexpandsaclasstoobtainanewclassiscalledinheritance,butallclassesareconstructedbytheobjectsuperrootclassofexpansion,superrootclassofasfollowscanmaketheintroduction.5.Object3principalcharacteristicsBehaviorexplainedthisobjectcanmakewhat.Tatewhentheobjectexertsthemethodobjectreflection.Dentityandothersimilarbehaviorobjectsdiscriminationsymbols.Eachobjecthasonlyindentityandamongthreecharacteristicstheyaffectmutually.6.Relationsamongclasses:Use-a:DependentrelationHas-a:PolymerizationrelationIs-a:inheritorrelation--example:AclasshasinheritedBclass,thistimeAclassnotonlyhasBclassofmethod,butalsohasitsownmethod(Individualityexistsingeneralcharacter)7.Structureobjectusestructure:Structureproposing

温馨提示

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

评论

0/150

提交评论