毕业设计(论文)J2ME手机游戏的开发Beckham Goal.doc
J2ME手机游戏的开发-Beckham Goal摘 要J2ME(Java 2 Micro Edition)是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项新的开发技术。它定位在消费性电子产品的应用上,对设备的智能化、多样化,提供了革命性的解决方案,并因其“Write Once, run anywhere”的Java特性而提高开发的效率。随着手机的日益普及、Java功能在移动设备上的实现,Java应用程序产生的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。本论文着眼于J2ME技术的应用,开发一款简单的手机游戏程序-Beckham Goal。 论文在分析了实现小游戏的相关基础技术及理论后,对该游戏进行了功能需求分析、模块划分及总体设计,解决了游戏中涉及的碰撞检查以及其他若干关键技术,最后在J2ME平台下实现了该小游戏,并通过验证达到预期的效果。关键词:J2ME;手机游戏; K-Java;碰撞检查The Development of J2ME Mobilephone Game-Beckham GoalAbstractAs a new development technology, J2ME (Java 2 Micro Edition) emerged with the development of various communications equipments, especially mobile facilities. Since it is a kind consumption-oriented of electronic product, it offers a completely new solution to the intelligentization and diversification of communications equipments. Besides, due to its feature of “Write Once, run anywhere”, it improves the efficiency of development. Along with the popularization of mobile phone and the application of Java to the mobile equipments, gradually the influence of mobilephone's added-value service is shown, which is produced by the application of Java to the daily life and informing. This paper focuses on the application of J2ME and develops a mobilephone game-Beckham Goal. Based on the analysis of basic technique and theories, this paper conducts analysis of function demand and module measurement as well as macro-design. As a result, this paper solves the conflict detection and some other key technique. Finally this paper successfully develops this mobilephone by use of J2ME. And then the anticipative purpose has been met after the validation.Key words: J2ME; Mobilephone game;K-Java; Conflict Detection目 录论文总页数:25页1引言11.1手机游戏概述11.2Java手机游戏的发展现状11.3手机游戏的发展前景22J2ME的概述与相关理论基础32.1J2ME的简介32.2J2ME的构架32.3J2ME游戏开发基础相关42.3.1基于精灵的动画42.3.2GameCanvas类来实现平稳动画42.3.3图形坐标52.3.4检测对象之间的冲突52.4常用开发工具及其配置与使用53需求分析与设计方案63.1需求分析63.2设计方案73.3游戏初步功能设计84游戏的设计流程以及实现94.1游戏的设计94.2游戏的实现104.2.1.图像和精灵的创建和绘制104.2.2.玩家按键移动的设置114.2.3.胜利及失败的判定134.2.4.球员运动轨迹的设置154.2.5.游戏中分数的记录164.3碰撞冲突机制的实现205系统测试20结 论22参考文献23致 谢错误!未定义书签。声 明错误!未定义书签。1 引言1.1 手机游戏概述手机游戏几乎是当今市面上所有手机所必有的。在几年前的机型中,游戏都是手机中自带的,称为嵌入式游戏,由手机生产厂商设计并直接嵌入在手机里面。这样的游戏用户不能自行开发、添加及删除,其游戏种类取决于不同的机型,是一种单机游戏。随后的几年兴起了一种基于短信的游戏,由用户发送特定字符串给短信游戏提供商,来控制游戏的动作或剧情的发展。随着wap的兴起,出现了一种基于浏览器的游戏,和短信游戏差不多,由用户手机通过wap登录游戏提供商所提供的网址,然后填写或选择相应表单来操作游戏。上面两类游戏都是基于文本的,操作比较繁琐,游戏性不强。短信游戏每做一次操作(也就是发送一条短信)需要花费一毛钱;wap游戏无论是通过CSD上网还是通过GPRS上网都需要出上网费用。两种游戏的花费都比较高。现在新出的手机很大一部分都支持Java程序下载,而且这是一种趋势。由Java开发的游戏可以对图像进行操作,是动态的。而且可以接入网络,既可以开发单机游戏也可以开发网络游戏。随着彩屏手机的普及,游戏可以不再是黑白的,可随心所欲的为游戏中的不同物体赋予不同的颜色。过去的手机是一个封闭的操作系统,除非用厂商自己的软件和工具,否则无法对手机的菜单进行改动,更无法在手机上附加其他应用。而K-Java技术的应用将摆脱这些传统的束缚,K-Java编写的应用程序可以兼容不同的网络协定,简单说就是,只要网络内容服务提供商提供K-Java服务,用户的K-Java手机就可以拥有无限扩充应用的能力。K-Java服务是一种新的移动数据业务的增值服务,它为用户提供了一个开放的平台,能更好地为用户提供全新图形化、动态化的移动增值服务。用户使用支持K-Java功能的手机终端,接入网络内容服务提供商的K-Java服务平台,可以通过手机随意下载Java应用软件,能方便地享受类似于Internet上的各种服务,如下载游戏、动漫、小说等,也可进行各种在线应用,如联网游戏、收发邮件、证券炒股、信息查询等。1.2 Java手机游戏的发展现状在欧美市场,由于较早采用GPRS技术,所以欧洲和美国运营商的K-Java也开展得较早,不过早期的应用并没能在个人消费市场激起太大的波澜。而日韩的无线数据业务从发展之初就将目标锁定在了游戏、娱乐等个人消费方面。K-Java技术能够利用手机有限的硬件条件使得PC上大量的互动性娱乐、游戏应用在手机上,正是凭借着这一技术特点,K-Java迅速成为了手机游戏的主流编程语言。在欧美市场,2002年此项业务的直接收入已经超过了2.45亿美元。在中国,2003年2月15日,中国移动开始了大范围的K-Java应用测试。4月8日,无线K-Java服务被移动正式定名为“百宝箱”,并全面开始免费试用。而在发展较快的广东地区,更是从5月17日开始了大规模的K-Java业务推广,投入资金多达千万元。7月1日,中国移动宣布了“百宝箱”正式商用的消息,K-Java在中国市场的掘金旅程也将由此开启。但是,K-Java目前在中国的发展速度却不够快,主要的原因是用户群体不足。首先是终端不足。在市场上,能够支持K-Java的手机很少,而且几乎都是几个国外主流品牌,其定位也较高,而国内品牌,介于成本和技术,一般都不含K-Java功能。与此同时,大量已有手机的老用户不会因此功能而重新购置一台新的手机。其次,在拥有K-Java功能的手机用户群体中,懂得或者愿意使用K-Java的人却更少。所以,我们必须期待更多含有K-Java功能的面向各个消费群体的手机上市和普及,以及用户对手机附加功能使用意识的加强。1.3 手机游戏的发展前景由Juniper Research发布的最新调查说明,Java手机游戏在2008年将会获得超过63亿美元得收益。据IDC预计,仅在美国,整个手机无线游戏业务的硬件、软件以及服务所带来的收入在2006年将达到40亿美元,而更别说有着更大手机无线游戏市场潜力的日本、韩国和中国等亚洲市场。预计到2006年,全球的无线游戏市场总值将达170亿美元。研究机构Informa分析说,手机游戏是全球游戏市场中增长最快的部分,其产值将从2002年的2.43亿美元上升至2007年的38亿美元。英国市场研究机构AnalysysLtd在这份研究报告中称,随着彩屏智能手机的广泛应用和手机功能不断升级,游戏市场预期将从2002年的2亿欧元,至2008年时增长到接近30亿欧元。Frost&Sullivan研究公司指出,全球移动游戏业收入2008年将上升至93.4亿美元。Ovum公司则指出,到2006年,全球移动游戏业的价值将是44亿美元。比较保守的In-Stat/MDR研究公司也指出,无线游戏业的营收将以数十亿计,2006年将达到28亿美元。据StrandConsults公司预测,到2005年,预计手机移动游戏和娱乐的营收将会成为移动业务中利润最大的一项服务。来自众多研究公司的结果似乎都在表明:无线游戏将是下一个互联网金矿。如今,从高档写字楼到青青校园,手机无处不在,手机如今已成为都市时尚文化和消费主义的象征。本来手机只是用来通话,后来可以发短信,现在当人们空闲无聊时候,手机用户们将会转向那些提供游戏和娱乐的服务的功能也就显现出来了。随着2.5G和3G的大发展,彩屏手机今年包括今后几个将会逐步取代黑白手机,后几年的时间里,彩屏手机将具有类似GameBoys游戏机的功能。更重要的是随着数据业务的成熟,寄托于移动通信网络与移动终端的无线游戏,使手机游戏由单机游戏迅速的过渡到了类似于电脑上网络游戏的时代。Java将成为无线游戏发展的中坚力量,由Java所开发的手机游戏将占据巨大的市场分额。2 J2ME的概述与相关理论基础2.1 J2ME的简介J2ME 是Sun微系统公司流行Java编程语言的紧凑版本。很多人没有意识到Java作为一种语言刚刚发明的时候是为了用来进行移动设备编程的,于是,它最终以J2ME的形式来实现这个目的。J2ME包括一组开发工具和丰富的应用程序接口(API)以供开发手机应用程序,人们称之为MIDlet。J2ME也包括K虚拟机,它负责协助Java字节码在每个具体手机上的执行。依靠通用的字节码而不是本地应用程序代码,J2ME就能够开发你的游戏的基本代码,并且能够移植到不同的手机而不需要费太大力气。事实上,如果不需要改变屏幕尺寸和图形显示能力,在J2ME手机之间移植一个游戏所需要的工作几乎是零。在美国的手机制造商中,J2ME享受着最广泛的工业支持。在市场上,Motorola,Nakia,Research In Motion(RIM)和Samsung等业界巨头都有功能基于J2ME的手机。2.2 J2ME的构架J2ME分为四层架构,分别是操作系统、Java虚拟机、Configuration和Profile。其中Configuration和Profile是Sun在J2ME中引入的两个全新的概念。(图1)Java Virtual MachineConfigurationProfile图1 J2ME的架构为手机和PDA等移动设备定义的Configuration和Profile分别为:CLDC(Connected Limited Device Configuration,连接受限设备配置)和MIDP(Mobile Information Device Profile,移动信息设备描述)。下面我们来了解一下CLDC和MIDPCLDC、MIDP与MIDletCLDC(Connected Limited Device Configuration,连接受限设备配置)这是用来开发在某个特定范围的设备上运行的应用程序所要用的一组最API。无线设备的标准配置叫做CLDC。为了更具体些,CLDC清楚地列出了以下和无线移动设备相关的信息:Java编程语言的功能子集;Java虚拟机的功能子集;无线移动应用程序开发所需的核心API;CLDC所针对的无线移动开发设备的硬件需求。MIDP(Mobile Information Device Profile,移动信息设备描述)专为移动信息设备而设计,补充了CLDC。就是建立在CLDC基础上用来描述手机和寻呼机这样的无线移动设备的框架。2.3 J2ME游戏开发基础相关2.3.1 基于精灵的动画在众多游戏中使用的功能更加强大的动画技术是基于角色的动画,也叫做精灵动画(sprite animation),基于角色的动画就是图形对象可以独立于背景移动。基于角色的动画中的每一个图形对象都叫做一个精灵,并且它的位置可以随着时间而变化。也就是一个精灵具有一个相关的速率,可以决定它的位置如何随着时间而变化。现在几乎所有的视频游戏都要在某种程度上使用精灵。在MIDP1.0中,我们必须自己用专门的类来实现Sprite,但是MIDP2.0为Sprite提供了强力支持,可以创建静态,动态,不透明和透明的Sprite。(本游戏的MIDP为2.0)MIDP2.0 API包含了对精灵动画的支持。在MIDP编程中,使得精灵动画成为可能的两个主要的类是Layer类和Sprite类。Layer类对一个叫做图层(Layer)的通用图形对象的建模,该对象充当精灵和其他图形游戏对象的基础。Layer类跟踪一个可视元素的位置、高度、宽度和可见性等信息。2.3.2 GameCanvas类来实现平稳动画 在游戏设计过程中。对于游戏开发人员比较头痛的问题的。当你用常规的MIDP Canvas类来构建一个具有动画功能的MIDlet,往往会出现令人讨厌的抖动。这种抖动是因为游戏屏幕在动画图像绘制之前被清除过。也就是动画的图形对象在每次被移动前都进行擦除和重绘。由于擦除和重绘过程都是直接发生在游戏屏幕上的,所以动画看上去就是抖动的。现在大多数都可以使用一种叫双缓冲的技术来解决和精灵动画相关的抖动问题。在双缓冲技术中,你可以在一个用户不可见的屏幕外绘图表面来进行擦除和重绘操作。当所有的绘图工作完成后,最终的结果再直接绘制到游戏屏幕上。由于所发生的擦除并不可见。最终的结果也就是无抖动的动画。除了标准的Canvas类,MIDP API还提供了支持双缓冲图形的GameCanvas类。为了使用GameCanvas类的这一优势功能,我们只需要从GameCanvas类派生我们的具体的游戏画布,并且像在一个普通MIDlet中一样绘制图形。但是,我们所执行的所有绘制实际上是在屏幕外缓冲区进行的。为了让屏幕外的绘制提交到实际的屏幕上,你必须调用flushGraphisc()方法。2.3.3 图形坐标所有图形计算系统使用某种图形坐标系来指定窗口或屏幕上的点的分布。图形坐标系通常指明系统的原点(0,0)、数轴,以及每条轴上数值递增的方向。MIDP图形依靠一个相似的坐标系来说明如何以及从那里开始绘图操作。因为在MIDlet中所有的绘图都在画布(canvas)中,所以MIDP的坐标系也同画布有关。MIDP坐标系的原点在画布的左上角,X值向右增加,Y值向下增加。在MIDP坐标系中,所有的值都是正整数。2.3.4 检测对象之间的冲突 冲突检测是确定游戏中的移动物体是否相互冲突的一种方法。尽管冲突检测对于动画效果的产生并没有起到直接的作用,但是,它和移动中物体的动画密切相关并且对游戏至关重要。冲突检测用来确定游戏中移动物体之间何时会发生物理的相互作用。在游戏中则是当两个移动物体发生冲撞后,冲突检测就可以用来检测移动物体之间是否冲撞的机制,简单来说就是比较移动物体之间的位置是否发生了重叠。简单的方法就是比较每个移动物体的矩形边界和所有其他的移动物体的矩形边界,这种方法的效率很高,但是当检测对象不是矩形的时候,由于只是相互之间透明区域重叠而会导致检测认为是边角的重叠引起的冲突。对于这种情况的改进方法是将冲突矩形缩小,或者是根据游戏中的移动物体图像数据来检测冲突,该方法实际上就是查看移动物体的透明区域是否重合或者移动物体图像本身是否重合。2.4 常用开发工具及其配置与使用Wireless Toolkit(简称WTK)是由Sun设计的MIDP应用程序开发工具,虽然功能不如商业版的IDE强大,但是对于编译、仿真以及调试而言,算是一个非常实用的工具。KToolbar是一个可视化的开发环境,它使你能够通过一个图形用户界面来创建,编辑,打包和测试J2ME应用程序。Wireless Toolkit开发工具共分为四个部分,分别是功能菜单、快捷按钮、信息输出窗口与仿真器。功能菜单包括四个项目:File、Edit、Project与Help(图2)。图2 J2ME Wireless Toolkit用户界面选择“New Project”新建一个工程,在弹出对话框中填写工程名和MIDlet类名,然后弹出另一个对话框,填写相关信息后确认。然后将会生成一个以工程名为名字的文件夹,并包含四个子文件夹,分别是:bin、lib、src、rec。bin用来存放JAD文件、manifest文件和制作好的JAR文件;lib用来存放已编译过的类文件;src用来存放源代码文件;rec用来存放图像等资源文件。将源代码文件和资源文件分别放入所属文件夹,选择“Build”将编译源代码,选择“Run”打开模拟器执行MIDP应用程序。3 需求分析与设计方案3.1 需求分析足球游戏是当今最火爆最受欢迎的体育赛事,在全球范围内也有很多的支持者。对于手机游戏的设计相对于动作类的游戏来说,体育类的游戏开发难度小设计也比较简单,并且足球游戏对手机的要求不高;设计出来也会相对简单;对于大家都熟悉的足球来说上手很容易,能够让玩家们很容易的了解这个游戏的玩法,不用在发一定的时间来熟悉游戏和了解游戏的故事背景,在此基础上,选择了体育类游戏作为游戏设计的基本开发思路。 在游戏的设计中,我们将会设计一位主人公,和四个为了阻碍主人公成功的敌人以及一个足球,游戏中的主人公有四个移动方向,它们分别是上,下,左,右。在游戏开始的时候主人公能够带球移动,并且能够将球踢出去。当主人公把球踢出后在做出移动后,足球就不会在随着玩家的移动而移动了,除非玩家在此碰撞到足球。对于敌人的设计则相对简单点,有三个一般的防守型队员和一个守门员,他们的位置就只是在屏幕内做上下移动,当然移动的速度会相对不一样,也不会太快。只有当玩家带球或踢出去的球通过守门员就算获胜(这里用把球的坐标超过了边界来实现),并且每次得分过后就会把分数加25,最后当游戏结束后的时候会将玩家的得分进行排名。而如果在移动的过程,当玩家所带的足球碰到了敌人的时候,则会游戏结束。在游戏开始和结束的时候会有一个简单的splash screen来显示玩家所得到的分数。3.2 设计方案和一般足球不同,Beckham GOAL中的英雄是为了自己梦想在球场上奋斗的男人-大卫贝克汉姆。他能突破对方球员的密集防守。再次将贝氏弧线展现球迷面前么?和一般熟悉的足球比赛一样,Beckham GOAL是水平游戏的,这种设计能够很方便玩家们不用改变一些视觉来进行游戏,这意味着玩家需要控制小贝从屏幕的左端到达屏幕的右端,但是这样的视觉对于游戏来说会降低难度。因此,游戏屏幕有点像图3所示的样子。图3 游戏屏幕效果图在这个游戏中,主要设计了有五个流程,它们分别是玩家启动游戏后,首先就会有个splash screen来显示此时玩家所得的分数和以往所打的最高分数,当玩家按下选择键后,就会进入游戏画面,这里能通过胜利或者失败来判断玩家的得分从而能够将所得的分数展示在游戏结束后的score screen或者是下次开始的splash screen中,而当玩家失去所有的机会后游戏就会结束。游戏的流程图如下图4所示。图4 游戏流程示意图各游戏界面与用户之间的关系可以见图5所示。图5 用户界面关系图3.3 游戏初步功能设计阻碍小贝的障碍物是4个在球场上的4个来回穿梭的球员。球员移动的很快,这就使得我们的主角-小贝需要掌握穿行的时机。在游戏中会让玩家使用手机上的导航键(上,下,左,右)来控制我们的主角小贝躲过上来封堵的球员。在玩家开始Beckham GOAL游戏的时候,还将要给我们的主角设定一个所能拥有的次数,并且这些拥有的次数是有限的,只有3个。当玩家将所有的次数用完,游戏就将结束。在屏幕的左上方将显示玩家所剩下的次数。并且当玩家失去一次机会的时候(足球碰到了防守的队员或是门将的时候),或者当玩家成功通过进球的时候,都会有一个相应的提示玩家(这里为声音提示)。4 游戏的设计流程以及实现4.1 游戏的设计在设计该游戏的时候。首先需要考虑到的是需要用到多少个精灵。在整个游戏的设计的过程的共有6个精灵;一个球员精灵、一个足球精灵和4个队员精灵。另外还用到9个位图的图像;分别为游戏背景图像、4个队员图像、球员图像、球员脑袋图像、胜利背景图像和足球图像。游戏的背景图像,敌人和球员图像以及胜利次数和最后及开始的得分屏显示如下图6所示。图6 游戏相关图像及背景示意图球员脑袋图像用来告诉玩家,还剩下多少的机会。就如当游戏开始的时候,有3个头像显示在屏幕的左上方。每当玩家失去一次机会的时候,人物的头像就少一个,如果剩下没有头像了。就表示游戏结束。无论对于任何一个游戏。玩家会有种想要无限挑战自己的想法。我们也要完全支持玩家的想法。因此在游戏中必须有一个维护数据的。它需要知道还剩下多少次机会。还需要能有个记录分数的,每当玩家胜利的时候,这个分数就要能增加,最好能在游戏结束的时候把分数显示出来。游戏最后的得分屏的效果如下图7所示。图7 游戏结束得分屏示意图4.2 游戏的实现4.2.1. 图像和精灵的创建和绘制start()方法还用来载入图像和创建游戏的精灵:try background = Image.createImage("/Highway.png"); playerHead = Image.createImage("/PlayerHead.png"); PlayerSprite = new Sprite(Image.createImage("/Player.png"), 22, 22); PlayerSprite.setPosition(2, 77); BallSprite = new Sprite(Image.createImage("/Ball.png"), 14, 10); BallSprite.setPosition(18, 85); npcSprite0 = new Sprite(Image.createImage("/Npc1.png"); npcSprite0.setPosition(30, 4); npcYSpeed0 = 1; npcSprite1 = new Sprite(Image.createImage("/Npc2.png"); npcSprite1.setPosition(72, 4); npcYSpeed1 = 2; npcSprite2 = new Sprite(Image.createImage("/Npc3.png"); npcSprite2.setPosition(113, 4); npcYSpeed2 = -1; npcSprite3 = new Sprite(Image.createImage("/Npc4.png"); npcSprite3.setPosition(148, 98); npcYSpeed3 = -2; catch (IOException e) System.err.println("Failed loading images!"); 这段代码首先创建了背景和玩家脑袋图像,然后开始创建精灵。并且每个精灵都被设置到屏幕的指定位置。虽然我们能够用游戏屏幕和精灵的宽度和高度来列出一个通用的精灵位置的方程式,但是这样通过硬性编码来确定位置还是更加的容易和准确。位置定下来以后,球员精灵的速度需要我们来设置,这样他们就能按照我们所设置的速度来行进了。由于游戏中有相当多的图形对象,HCanvas类的draw()方法就比较简单。就拿绘制足球场背景为例,通过下面的代码就能实现:g.drawImage(background, (0-70), 0, Graphics.TOP | Graphics.LEFT);对于玩家精灵和足球精灵的绘制,也就是游戏中最重要的图形对象。代码如下:PlayerSprite.paint(g);BallSprite.paint(g);球员精灵的绘制,只需要把paint()方法的调用放入到循环中,就可以绘制完每辆汽车。代码如下:for (int i = 0; i < 4; i+) npcSpritei.paint(g);4.2.2. 玩家按键移动的设置Update()方法还负责处理用户输入和根据游戏屏幕移动玩家。按键来移动玩家和足球的代码如下:if (+inputDelay > 2) int keyState = getKeyStates(); if (keyState & LEFT_PRESSED) != 0) PlayerSprite.move(-6, 0); PlayerSprite.nextFrame(); BallSprite.move(-6, 0); BallSprite.nextFrame(); else if (keyState & RIGHT_PRESSED) != 0) PlayerSprite.move(6, 0); PlayerSprite.nextFrame(); BallSprite.move(6, 0); BallSprite.nextFrame(); if (keyState & UP_PRESSED) != 0) PlayerSprite.move(0, -6); PlayerSprite.nextFrame(); BallSprite.move(0, -6); BallSprite.nextFrame(); else if (keyState & DOWN_PRESSED) != 0) PlayerSprite.move(0, 6); PlayerSprite.nextFrame(); BallSprite.move(0, 6); BallSprite.nextFrame(); else if (keyState & FIRE_PRESSED) != 0) BallSprite.move(BallXSpeed, BallYSpeed); BallXSpeed = 6; BallYSpeed = 6; checkBounds(PlayerSprite, false); checkBounds(BallSprite, false); / Reset the input delay inputDelay = 0; 它在每次游戏循环的时候都要递增,而每3次游戏循环就允许一次按键发生。也就是说,按键的响应速度减小为游戏循环速度的三分之一,这就限制了玩家的移动速度,使得这个简单的游戏更好玩、更具有挑战性。当按键被检测到,代码就将玩家精灵和足球精灵移动一定的位置,然后调用nextFrame()来改变它的帧图像。CheckBounds()的调用,它用来确保玩家还在游戏屏幕的边界之内。它允许玩家折返精灵或者是把精灵限制在屏幕边界内移动。第二个参数决定了它会采取哪种行为,true便是精灵折返,而false表示防止精灵移动超出屏幕边界。在游戏中加入了足球精灵,游戏开始的时候玩家精灵和足球精灵能同时控制,但是当玩家按fire键时,足球就会踢出去,并且此时玩家精灵的移动不能控制足球精灵的移动。只有当玩家精灵在此和足球精灵发生冲突的时候,玩家精灵的移动才能在此控制到足球精灵的移动。代码如下:if (BallSprite.collidesWith(PlayerSprite, true) if (+inputDelay > 2) int keyState = getKeyStates();.对于碰撞的实现,在Wireless Toolkit中的MIDP 2.0的game包中所包含的collidesWith中有碰撞检测,但是由于该游戏主要的事件响应基本上于冲突有关,有关冲突的实现将在本章最后进行讲解。4.2.3. 胜利及失败的判定update()方法检查足球在每次移动后是否通过边界,下面的代码用来查看足球是否安全通过:if (BallSprite.getX() > 154) /播放通过的声音 try celebratePlayer.start(); catch(MediaException me) /重置玩家和足球的位置并增加积分 PlayerSprite.setPosition(2, 77); BallSprite.setPosition(18, 85); score += 25; 数字154表示的是游戏屏幕上结束的水平位置,如果足球的位置大于这个位置的话,玩家就算是安全通过。此时会播放胜利通过的声音。表示一次安全通过,玩家精灵和足球精灵的位置都被重置为起始位置,得分增加25点。for (int i = 0; i < 4; i+) /移动球员精灵 npcSpritei.move(0, npcYSpeedi); checkBounds(carSpritei, true); / 检查足球和球员之间的冲突 if (BallSprite.collidesWith(npcSpritei, true) /播放冲突声音表示失去一次机会 try squishPlayer.start(); catch(MediaException me) /检查游戏是否结束 if (-numLives = 0) gameOver = true; else /重置玩家和足球位置 PlayerSprite.setPosition(2, 77); BallSprite.setPosition(18, 85); /不必再继续更新球员精灵 break; 对于游戏精灵的更新,我们还需要更重要的方法,它就是update(),在游戏中update()方法负责各种至关重要的任务,例如处理用户输入、移动玩家、更新球员精灵和检查足球是否碰到球员和足球是否通过边界,以及update()方法检查游戏是否重新启动:if (gameOver) int keyState = getKeyStates(); if (keyState & FIRE_PRESSED) != 0) / 开始一个新游 PlayerSprite.setPosition(2, 77); BallSprite.setPosition(18, 85); gameOver = false; score = 0; numLives = 3; / 游戏结束,所以不做任何更新 return; 这段代码首先查看游戏是否结束,只有在这个时候,重新启动游戏才有意义。开火(Fire)按键用来重新启动已经结束的游戏。这个按键会根据手机的不同而不同,但是在J2ME模拟器中,它就是主Select按键,和用来模拟的电脑的Enter键相对应。Update()方法中的游戏重启动代码重新设置了玩家精灵的位置,清空了gameOver变量,把分数重置为0,并且把剩下的玩家的数目重新设置为3。4.2.4. 球员运动轨迹的设置每个球员精灵都按照变量npcYSpeed的速度在Y方向上移动,npcYSpeed是一个包含了球员的垂直方向速度的数组。然后精灵会折返。如果需要的话:只要调用checkBounds()方法并把一个true值作为第二个参数传递给它。这个只是一个单向的移动。为了增加游戏的可玩性。我们将其中的一个精灵3设置为守门精灵。通过设置一个结界来控制守门精灵的移动,让守门精灵在我们想要的位置循环移动。代码如下:if (npcSprite3.getY() < 48)