




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE34石家庄科技信息职业学院毕业论文题目:基于J2ME的潜艇大战专业班级:软件技术(游戏方向)09-24班
摘要:JAVA已经从一种平台无关的编程语言演变成一种与厂商及平台无关的健壮的服务器端技术,促使IT业界深入发掘以Web为核心的应用程序的巨大潜力。J2ME的出现使这一变化达到了一种新的高度。J2ME,简称Java2平台袖珍版(Java2Platform,MicroEdition(J2ME)),是SUN公司在J2SE和J2EE之后,致力于消费产品和嵌入式设备的最佳解决方案。作为JAVA的三个版本之一,J2ME在无线编程技术中正发挥着它独特的作用。J2ME为在小型电子设备上创建性能卓越的网络应用提供了一套完整的解决方案。它也使设备制造商、服务提供商及应用开发人员为他们的用户发布新的软件应用成为可能。本篇论文共分为七个部分:包括绪论、J2ME技术概览、游戏设计的需求分析、“PocketBoxing”手机游戏开发制作、手机游戏开发存在的困难、J2ME手机游戏前景展望和结论。其中第四部分“PocketBoxing手机游戏开发制作”是本篇论文的重点。整篇论文都是围绕着这一部分来展开论述的,在这一部分里详细介绍一款手机游戏“PocketBoxing”的开发全过程和开发过程中存在的疑难问题。其中包括:游戏事件、游戏API等以及对事件的处理,另外在游戏描绘处理部分也将作为重点进行介绍。通过对J2ME的详细介绍我们可以从中了解到其自身的作用,近年来,随着JAVA手机的诞生,其无可替代的灵活性与轻便性致使JAVA手机游戏成为游戏市场的又一亮点,它的前景无可限量,必将在我们以后的生活中发挥着重要的作用。关键字:J2ME,MIDP,游戏编程,事件,描绘处理AbstractJavaisalreadychangedfromaplatform-independentprogramminglanguagetoamission-criticaltechnologicalwithmanufactureplatformindependent,andjavaencourageITcircletodeeplytapthehugepotentialofapplicationwiththecareofWeb.TheemergencesofJ2MEpushittoanewhighlevel.J2ME(Java2Platform,MicroEdition(J2ME))called“Java2platform”forshort—apocket-editionisaprefectsolutionplanofconsumeproductsandembeddedequipment,afterJ2SE&J2EEinSUNcompany.J2MEismakingaspecialeffectatthewirelessprogramtechnology.J2MEprovideacompletesetofsolutionplan,it’salsomakeitbecomepossiblethatissuethenewsoftwareapplicationbythemanufactureofequipment,servicesupplierandthepeopleofdevelopapplication.Thisarticlehassevenportions:includetheintroduction,thegeneralsituationofJ2MEtechnology,thedemandofthegamedesignanalyzes,thesignificanceanddevelopmentofPocketBoxing,thedifficult,theprospectofmobilephonegamesexploitationandtheConclusion.Theforthpart—“theproductionofPocketBoxingmobilephonegames”isthefocusofthisarticle.Thisentirearticleisaroundthisfocus,andthispartdetailintroducestheexploitationprocessofamobilephonegameandtheissues.Thispartintroduces:thecase,APIofgames,dealwiththeaccidentandtheotherfocustointroduceisthemanageofgamesdescription.ThroughthedetailintroduceofJ2ME,thefunctionofjavaisobvious.Oflateyears,followtheemergeofjavamobilephoneitsunimpededidentityandportabilitymakejavamobilephonegamesbecomeanewfocalpointofgamemarket.J2MEhaveunlimitedbrightenandmakeanimportantroleinthefuturelife.Keywords:J2ME,MIDP,Gameprogramming,Dealwithdescription,Case
目录TOC\o"1-3"\h\u30007一、引言 5123651.1项目背景 51.143942目的与意义 514167二J2ME技术概览 52.281571J2ME简介 52.10302J2ME体系结构 62.210392.1JVM(虚拟机) 62.154522.2J2ME配置 62.121712.3J2ME简表 71249三、开发环境及相关技术 83.303501游戏开发环境 83.121602关于WirelessToolKit 825509四游戏设计 94.196541需求分析 94.118762游戏的流程和类结构 94.269992.1游戏基本运行流程 94.132242.2游戏的类结构 1020811五、具体设计 105.308341游戏项目的创建 105.257892游戏主要设计思想 115.53203游戏主要功能的实现 115.59683.1游戏画布类FIRCanvas的实现 115.172663.2军舰类的实现 165.83983.3潜艇类的实现 175.114323.4水雷类的实现 205.20513.5音乐类的实现 225.284683.6MIDlet应用程序类的实现 245.177964游戏辅助功能的实现 255.86644.1游戏的闪屏类的实现 255.97924.2游戏功能设置菜单的实现 275.264444.3参数设置实现 285.107624.4游戏说明功能实现 2915896六、游戏的运行 3025415七、系统测试 317.115531作为应用软件的测试 317.192182游戏娱乐性内容的评价 3118358结论 3213204参考文献 33
一、引言随着经济的发展和社会节奏的加快,人们所面对的压力越来越大,总想寻求一种方式来释放自己的压力。而我国科技水平在高速发展,计算机已经广泛应用于人们的日常生活中。因此,现在越来越多的人想借着计算机来达到释放自己压力,给自己充电的目的。而电脑游戏尤其是休闲小游戏正好可以起到这种效果。因此,休闲小游戏一直深受人们的喜欢。1.1项目背景手机是人们日常生活中所用的非常频繁的通信工具,正是由于手机的高普及率,使得无线移动商务才得以迅速普及和发展。手机游戏则每个人都随时,随地地使用。尽管每个手机游戏都不贵,但是巨大的使用量将使得这个市场商机无限。国外的手机游戏市场更是日趋成熟,可以用登峰造极来形容,他们甚至可以把电脑游戏移植其中,可说功能强大。相比较而言中国只能算是起步而已。因此,作为即将毕业的我,选择了《潜艇大战手机游戏的设计和开发》作为我的毕业设计选题,希望在其过程中,能够清楚自己的不足,在以后的日子里能够更加努力地改进。
1.2目的与意义通过游戏程序增加编程的兴趣,提高编程水平。随着编程水平的提高,力争设计出人们喜欢的休闲小游戏,给人们带来愉悦的心灵享受。给那些长期因工作压力比较大的人们提供一种释放压力的途径,使他(她)们更有激情地工作,同时,也实现了自我的人生价值。二、J2ME技术概览2.1J2ME简介SunMicrosystems公司将J2ME定义为“一种以广泛的消费性信息产品为目标的,高度优化的java运行时环境”。它主要针对消费类电子设备,例如,蜂窝电话和可视电话、数字机顶盒、汽车导航系统等。J2ME技术在1999年的JavaOneDeveloperConference大会上正式推出,它将Java语言与平台无关的特性移植到小型潜入式设备上,允许移动无线设备之间共享应用程序。在消费电子和嵌入式设备领域,内存从几百KB到几十MB,从没有屏幕到Web-TV,CPU从低功耗的嵌入式处理器到几百MHz的RISC处理器,硬件条件的差异是相当大的。这就使得J2ME的标准需要有不同的层次和类别来适应这个复杂的领域,因此相比之下J2ME就比J2SE和J2EE的标准要复杂得多。尽管如此,J2ME在适用于这些设备的同时也保留了Java的传统特性,即代码具有可移植性、部署灵敏性、安全的网络传输性和代码的稳定性等。因此,J2ME目前已经被广泛应用于消费类嵌入式设备,成为嵌入式开发的一种标准。2.2J2ME体系结构从整体看,J2ME平台由以下几部分组成:●Java虚拟机,针对不同的嵌入式设备以及为了满足不同的需要,提供了KVM和CVM两大虚拟机。●配置(configuration),它是将某一类特定应用范畴的设备的共性提取出来形成的规范。为开发人员提供了最基础,能在所有平台上通用的核心API类库。●简表(profile),它是将某一个特殊行业或领域内的设备的特性提取出来,形成对特定领域特性的总结,是作为配置的一个补充。●一些可选包,主要包括设备厂商提供的OEM的API类库。其中前三项组成了J2ME的基本运行环境。其中Java虚拟机是运行环境的核心,其运行于设备中的操作系统之上,再往上是具体的J2ME配置,包括更具设备的资源需要而提供的基本核心API类库,配置的上面是一个或者多个针对不同应用领域而设置简表。2.2.1JVM(虚拟机)JVM是专门为微型电子设备与资源受限设备如:手机、寻呼机、移动互联网设备、家用微电子设备等设计的一种轻便、紧凑的JAVA虚拟机。JVM可以为微型电子设备提供一个完整的JAVA运行环境,除了一些微型设备所必需的适当的功能有所不同外,它是由JAVA虚拟机规范定义的真实的JAVA虚拟机。它是专门为那些受资源限制,只有几百K字节内存的微型设备设计的。基于上述原因,JVM具有以下几个特点:(1)小,仅具有40KB至80KB的静态内存;(2)轻便、精巧;(3)模块化并可定制;(4)尽可能完全紧凑的完成设计目的。2.2.2J2ME配置配置是将基本运行的环境定义为一套核心类和一个运行在特定类型设备上的特定的虚拟机。J2ME中提供了两种配置:CLDC和CDC。CDC针对的设备主要是数字电视、机顶盒、网络电话、车载计算设备,特点是有线连接,稳定而持续的电源供应,设备资源比较受限。CLDC支持的设备主要包括无线电话、手机、PDA以及小型零售支付段等。处理能力较弱,只包含程序运行所需要的最小类库。2.2.3J2ME简表简表是面向配置之上纵向设备,建立在配置的顶部,定义了配置之上受支持设备的类型。目前J2ME领域里使用最广泛的是移动信息设备简表(MIDP),主要针对手机和其他双向移动通信设备而设计的。MIDPlet的开发环境需要有java2SDK1.3版以上与MIDP的类库、以及后述的运行前验证工具三种。在J2MEWTK中除了包括MIDP的类库、运行前验证工具之外,还会把编译与包装(JAR文件化)、JAD文件的创建、模拟器的启动等在开发MIDP需要用到的操作加以集成。当完成了JDK1.4以及J2MEWTK的安装以后,就可以开始对游戏项目进行创建了。A.MIDlet开发的基本开发流程如下:编写MIDlet程序源代码;编译MIDlet程序;对编写后的类文件进行预校验;编写清单文件MANIFEST.MF;对MIDlet程序进行打包;编写Java应用程序描述符(jad)文件。B.MIDlet文件的构成:(1)JAR(JavaARchive)文件:集成了ClassFile与图像、声音等内容的数据文件,虽然与J2SE的文件相同,但是列表的文件内容不同;(2)JAD(JavaApplicationDescriptor)文件:指定启动的MIDlet类名称或是数据文件大小、版本等信息;(3)KDDI的地方,使用组合了JAR文件与JAD文件的KDDI专用的KJK(KDDIJavaeXtension)。C.生命周期是指程序从开始执行到退出的生命过程。MIDlet是以下列的生命周期来运行的:系统调用继承自MIDlet类的默认构造方法,创建对象;(2)系统进入MIDlet生命周期的暂停状态,这个是MIDlet生命周期的第一个状态;(3)系统调用startAPP()方法,然后进入MIDlet的运行状态,程序正常执行;(4)如果在暂停转台或者运行状态下发生错误,则程序会调用destoryAPP()方法,然后进入销毁状态。整个过程如图2-1所示图2-1生命周期图图2-1生命周期图三、开发环境及相关技术3.1游戏开发环境操作系统:MicrosoftWindowsXP
程序语言:Java2
开发包:Java(TM)2StandardEdition(5.0)
SunMicro.J2ME
WirelessToolKit2.23.2关于WirelessToolKitWTK(WirelessToolKit)是Sun公司针对J2ME推出的用于手机和Palm等移动设备的开发包,是除手机厂商的专用开发包外唯一的手机模拟器开发包。它通用性高,开发出的应用程序可保证能运行在大部分设备上,而不像专用厂商具有一定的不兼容性。虽然它没有强大的功能和完善的调试手段,但它提供运行模拟器的最基本组件,是其他IDE需集成采用的必备元素。目前我们可以获取的有四个版本,分别是1.0.4,2.0,2.1和2.2。每个版本都包括英语,日语,简体中文,繁体中文4个语种包。①1.0.4版只能够开发MIDP1.0应用程序;②2.0版只能够开发MIDP2.0应用程序;③2.1版则可以同时开发MIDP1.0、JTWI(CLDC1.0,MIDP2.0,WMA1.1)可改用CLDC1.1或加入MMAPI1.1,自定义(自己随机组合Configuration,Profile以及OptionalPackage)三种环境下的应用程序;④2.2版中,WTK全面的支持JTWI规范。具体的说,即MIDP2.0,CLDC1.1,WMA2.0,MMAPI1.1,WebServices(JSR172),FileandPIMAPIs(JSR75),BluetoothandOBEXAPIs(JSR82),and3DGraphics(JSR184);同时您也可以使用该版本开发面向CLDC1.0和MIDP1.0的应用程序。系统要求上,WTK2.2至少需要50MB可用硬盘,128MB系统RAM和800MHZPentiumIIICPU。四、游戏设计4.1需求分析本系统主要是完成潜艇大战游戏的基本操作。用户可以自己练习和娱乐。本系统需要满足以下几点要求:(1)利用方向键来改变军舰的运行方向;(2)确定键发射导弹,击中敌人得分,击中自己人扣分;(3)选项键可以更换背景和背景音乐。4.2游戏的流程和类结构4.2.1游戏基本运行流程本游戏的基本运行流程是在MIDlet启动后把整个画布作为一个线程,随时准备响应用户按键操作的KeyPressed()方法,100ms扫描一次潜艇和水雷等物体的运行状态。图4-1运行流程图在扫描潜艇和水雷运动时,执行各个物体画面的移动方法。程序并不为每隔新增潜艇和水雷开启一个新线程,太多线程会造成程序的性能直线下降;而是将每一个物体类型直接加入到画布中,每当一个新物体产生,将直接在画布上画出;当物体消除时,将直接在画布上被消除。这样就形成一种注册机制,所有游戏物体的产生和消除都需要画布注册,画布拥有不同类型物体的所有“名单”,所以,当执行移动命令是只需要遍历画布中所有游戏物体,依次执行每隔游戏物体中定义的移动方法即可。图4-1运行流程图游戏的基本运行流程如图4-1所示:4.2.2游戏的类结构在本游戏的设计过程中,严格按照面向对象的程序设计思想对程序进行设计,主要显示类包括主界面类、游戏画布类、菜单类、选项类、音乐类、说明类和分别代表军舰、水雷和潜艇的各种实体类。●FIRMIDlet:是游戏的主类,控制着游戏的生命周期,在FIRMIDlet类中的startapp()方法中先载入游戏画面:在FIRMIDlet类中定义了一个static型的quitapp()方法,以方便在游戏过程中随时点击“退出”键来结束改游戏,和一个static型的setcurrent方法方便在其他类中调用不同的显示对象。startapp()方法当中,加载本游戏的选择菜单;quitapp()方法以结束midlet应用程序并释放内存;采用setcurrent()方法来设置display对象中要显示的屏幕画面。●FIRCanvas:画布类,负责绘制游戏中的各种游戏物体,并响应用户的按键操作。●Boat:军舰类,定义游戏中军舰的外观、移动和绘制方法。●Submariner:潜艇类,定义游戏中潜艇的外观、移动和绘制方法。●Bomb:水雷类。定义游戏中水雷的外观,移动,控制以及碰撞检测的方法。五、具体设计5.1游戏项目的创建在J2MEWTK当中,是以项目这个单位来管理MIDletSuite,因此在进行程序编写前必须先要创建项目。首先要将项目取名为SimpleMIDlet。在Windows“开始”菜单启动J2MEWTK的KToolbar,启动之后,单击“Newproject”按钮。然后在“Newproject”对话框的“projectName”与“MIDletClassName”的文本框输入项目的名称“FIRMIDlet”,并单击“Createproject”按钮。这样就完成了对游戏项目的创建。WTK产生项目后,不同类型的资源有着相对固定的存放位置。Java源文件被放在apps目录下\Puzzle\src下,相关程序资源文件(图片,音频)放在\res下,应用程序库文件放在\lib下,这在WTK中是必须注意的,即便是相对路径,也必须是在该类型目录下建立。点击wtk工具栏的”生产”按键。编译通过顺利后,将这个游戏程序压缩成jar包以方便以后对改游戏程序的发布,依次选择ktoolbar菜单中的“项目“”包“”产生包“,jar文件生成后,ktoolbar的提示窗口中会显示成功的提示。运行成功以后,在bin目录下,将会产生一个程序描述文档jad,它清楚的描述了当前MIDlet的名称与版本,发行人,指定的jar包名称与大小,支持CLDC与MIDP版本的信息。5.2游戏主要设计思想此游戏的关键点是潜艇是否被击中的判断,整个屏幕是一个二维坐标系军舰在一个水平位置移动当在某个位置发射鱼雷判断鱼雷的图片与不断移动的潜艇图片是否有重合的地方,如果有发生爆炸,如果没有继续移动。5.3游戏主要功能的实现5.3.1游戏画布类FIRCanvas的实现FIRCanvas继承Canvas类,用来实现整个游戏的主界面。代码具体如下:publicFIRCanvas(){CMD_BG=newCommand("更改背景",8,2);CMD_SOUND=newCommand("切换声音",8,2);CMD_BACK=newCommand("退出",8,2);addCommand(CMD_BG);图5-1屏幕坐标示意图addCommand(CMD_SOUND);图5-1屏幕坐标示意图addCommand(CMD_BACK);setCommandListener(this);try{imgBack=Image.createImage(getWidth(),getHeight());gBack=imgBack.getGraphics();sound=SoundEffects.getInstance();boatImage[0]=Image.createImage("/res/ship0.png");boatImage[1]=Image.createImage("/res/ship1.png");bombImage=Image.createImage("/res/boom.png");sImage1[0]=Image.createImage("/res/q1.png");sImage1[1]=Image.createImage("/res/h2.png");sImage2[0]=Image.createImage("/res/r1.png");sImage2[1]=Image.createImage("/res/q2.png");boomImage[0]=Image.createImage("/res/b.png");boomImage[1]=Image.createImage("/res/f1.png");boomImage[2]=Image.createImage("/res/b2.png");}catch(Exceptione){e.printStackTrace();}width=this.getWidth();//获得屏幕宽度height=this.getHeight();//获得屏幕高度imgBack=Image.createImage(getWidth(),getHeight());gBack=imgBack.getGraphics();//创建次画面和次画笔offScreen=Image.createImage(width,height);offG=offScreen.getGraphics();boat=newBoat(boatImage,width);init(0);init(1);bomb=newBomb(bombImage,0,0,height);Threadt=newThread(this);t.start();playMusic();}privatevoidinit(intnum){if(num==0){submarine[0]=newSubmarine(sImage1,width,height,0,boomImage);}if(num==1){submarine[1]=newSubmarine(sImage2,width,height,1,boomImage);}}●类中声明了游戏中需要的各种对象,并载入游戏中的图片●在类中启动新线程,调用线程类得run()方法来运行程序protectedvoidpaint(Graphicsg){//清屏offG.setColor(0xffffff);offG.fillRect(0,0,width,height);offG.setColor(0);//绘制if(imgBack!=null){offG.drawImage(imgBack,0,0,Graphics.TOP|Graphics.LEFT);}boat.paint(offG);submarine[0].paint(offG);submarine[1].paint(offG);if(bomb.isDisplay){bomb.paint(offG);}//绘制得分offG.drawString("得分:"+score,4,4,Graphics.TOP|Graphics.LEFT);//将次画面贴到主画面g.drawImage(offScreen,0,0,Graphics.TOP|Graphics.LEFT);}●Paint()方法用来游戏中的各种物体图片绘制到屏幕上publicvoidkeyPressed(intkeyCode){//转换为游戏动作intaction=this.getGameAction(keyCode);switch(action){caseCanvas.LEFT://向左isRepeated=true;boatDirection=Boat.BOAT_MOVE_LEFT;break;caseCanvas.RIGHT:isRepeated=true;boatDirection=Boat.BOAT_MOVE_RIGHT;break;caseCanvas.FIRE:if(!bomb.isDisplay){bomb.isDisplay=true;bomb.setX(boat.x+boat.getBoatImageWidth()/2-bomb.getImageWidth()/2);bomb.setY(boat.Y+boat.getBoatImageHeight()-bomb.getImageHeight());}//设置坐标break;}//重新绘制repaint();}●keyPressed()方法用来判断用户的按键,从而控制军舰的移动protectedvoiddrawBackground(Graphicsg){bytebX=0,bY=0;intimgWidth,imgHeight;Imageimage;if(back<0){g.setColor(0x00AAAAFF);g.fillRect(0,0,CanvasWidth,CanvasHeight);}else{try{image=Image.createImage(BackArray[back]);imgWidth=image.getWidth();imgHeight=image.getHeight();while(bY*imgHeight<=CanvasHeight){bX=0;while(bX*imgWidth<=CanvasWidth){g.drawImage(image,bX*imgWidth,bY*imgHeight,Graphics.TOP|Graphics.LEFT);bX++;}bY++;}}catch(IOExceptionioe){System.out.println("Imgnotfound:"+BackArray[back]);g.setColor(0x00AAAAFF);g.fillRect(0,0,CanvasWidth,CanvasHeight);}}}●drawBackground()方法用来绘制背景图片publicvoidrun(){while(isRunning){try{Thread.sleep(100);}catch(Exceptione){}if(isRepeated){boat.move(boatDirection);}if(!submarine[0].isIsBoom()){submarine[0].move();}else{//播放爆炸效果submarine[0].boom();}if(!submarine[1].isIsBoom()){submarine[1].move();}else{//播放爆炸效果submarine[1].boom();}if(bomb.isDisplay){bomb.move();if(bomb.collidesWith(submarine[0])){bomb.handlecollidesWith(submarine[0]);score-=10;}if(bomb.collidesWith(submarine[1])){bomb.handlecollidesWith(submarine[1]);score+=10;}}System.gc();repaint();}}●run()方法用来运行程序privatevoidplayMusic(){ sound.stopMusic();switch(music){case0:break;case1:sound.playSpringMusic();break;case2:sound.playCityMusic();break;case3:sound.playFlowerMusic();break;default:break;}}●playMusic()方法用来执行音乐的选择和播放publicvoidcommandAction(Commandc,Displayabled){if(c==CMD_BACK){midlet.instructionsBack(); }elseif(c==CMD_SOUND){music++; if(music==5)music=0; playMusic();}elseif(c==CMD_BG){back++; if(back==BackArray.length)back=0; drawBackground(gBack);repaint();}}} ●按钮的事件处理方法:更换背景,更换背景音乐,退出游戏5.3.2军舰类的实现游戏中有用户控制的军舰类Boat主要用来在屏幕中绘制出军舰的外观,并定义其移动的方法。具体代码如下:publicBoat(Image[]boatImage,intwidth){this.boatImage=boatImage;this.width=width;this.boatImageWidth=boatImage[0].getWidth();this.boatImageHeight=boatImage[0].getHeight();}●类的构造器Boat()中声明要显示的图片publicvoidpaint(Graphicsg){g.drawImage(boatImage[direction],x,Y,Graphics.TOP|Graphics.LEFT);}●paint()方法用来绘制军舰的外观publicvoidmove(intdirection){this.direction=direction;if(this.direction==BOAT_MOVE_LEFT){if(x>dx){x-=dx;}else{x=0;}}if(this.direction==BOAT_MOVE_RIGHT){if(x+boatImageWidth<width-dx){x+=dx;}else{x=width-boatImageWidth;}}}●move()方法用来定义军舰的移动方法军舰是向左或向右移动,要进行边界检测如果到边后就不能再移动。5.3.3潜艇类的实现游戏中的潜艇类submarine主要用来在屏幕中绘制出潜艇的外观,并定义生成潜艇、移动潜艇以及潜艇爆炸方法,具体代码定义如下:publicSubmarine(Image[]submarineImage,intwidth,intheight,intnum,Image[]boom){this.submarineImage=submarineImage;this.width=width;this.height=height;this.num=num;this.boom=boom;this.imageWidth=submarineImage[0].getWidth();this.imageHeight=submarineImage[0].getHeight();generate();}●类的构造器submarine()中声明要显示的图像,并产生一个潜艇对象publicvoidpaint(Graphicsg){if(!isBoom){g.drawImage(submarineImage[direction],x,y,Graphics.TOP|Graphics.LEFT);}else{//爆炸效果if(boomIndex==-1){Return;}g.drawImage(boom[boomIndex],x,y,Graphics.TOP|Graphics.LEFT);}}●Paint()方法用来绘制潜艇的外观publicvoidboom(){//如果爆炸完毕if(boomIndex==2){isBoom=false;//修改标志boomIndex=-1;generate();}//重新生成潜艇if(boomIndex<2){boomIndex++;}}●Boom()方法用来定义爆炸效果publicvoidmove(){if(!isBoom){//没有爆炸if(direction==0){//向右移动if(x<width+dx){//边界检测x+=dx;}else{x=width+dx;direction=1;}}//改变方向if(direction==1){//向右移动if(x+imageWidth>dx){//边界检测x-=dx;}else{x=dx-imageWidth;direction=0;}}}//改变方向●Move()方法用来定义潜艇的移动方法privatevoidgenerate(){if(num==0){x=-imageWidth;y=height-30;direction=0;}if(num==1){x=width;y=height-60;direction=1;}}●generate()方法用来生成潜艇对象,生成潜艇坐标点A的坐标是潜艇0的坐标,A位于X轴的负方向所以横坐标等于潜艇图片宽度的相反数,纵坐标设定一个固定值。点B的坐标是潜艇1的坐标,横坐标等于屏幕宽度,纵坐标等于一个固定值。如下图5-2:图5-2潜艇生成坐标图5-2潜艇生成坐标publicbooleanisIsBoom(){returnisBoom;}●isIsBoom()方法用来判断潜艇是否爆炸5.3.4水雷类的实现游戏中水雷类bomb主要用来在屏幕中绘制出水雷的外观,并定义移动的方法,最重要的是在该类中定义了水雷和潜艇的碰撞检测方法,具体代码定义如下:publicBomb(ImagebombImage,intx,inty,intheight){this.bombImage=bombImage;this.x=x;this.y=y;this.height=height;//初始化图片高度和宽度this.imageHeight=bombImage.getHeight();this.imageWidth=bombImage.getWidth();}●类的构造器bomb()中声明要显示的图像publicvoidpaint(Graphicsg){g.drawImage(bombImage,x,y,Graphics.TOP|Graphics.LEFT);}●Paint()方法用来绘制潜艇外观publicvoidmove(){if(y<height){y+=dy;}else{//使炸弹不可见图5-3水雷移动示意图isDisplay=false;}}图5-3水雷移动示意图●Move()方法定义水雷的移动判断水雷的纵坐标是否等于屏幕的高度,如果小于继续向下单位移动,否则水雷消失。如图5-3所示:publicbooleancollidesWith(Submarinesubmarine){//炸弹中心点的坐标intbx=x+imageWidth/2;intby=y+imageHeight/2;//潜艇中心点的坐标intsx=submarine.getX()+submarine.getImageWidth()/2;intsy=submarine.getY()+submarine.getImageHeight()/2;//判断中心点之间的距离if((Math.abs(bx-sx)<(imageWidth+submarine.getImageWidth())/2)&&(Math.abs(by-sy)<(imageHeight+submarine.getImageHeight())/2)){returntrue;}else{returnfalse;}}●collidesWith()方法用来碰撞检测判断两个对象中心点之间的距离,水雷中心点A(x1,y1)的坐标是(水雷的横坐标+图片宽度的一半,水雷的纵坐标+图片高度的一半),潜艇中心点B(x2,y2)的坐标是(潜艇的横坐标+图片宽度的一半,潜艇的纵坐标+图片高度的一半)。如下图5-4:如果|x1-x2|<水雷图片宽度+潜艇图片宽度的一半,则水雷图片在如图5-5标明的区域移动。如果|y1-y2|<水雷图片高度+潜艇图片高度的一半,则水雷图片在如图5-6标明的区域移动。两个条件同时成立,在这个区域内水雷与潜艇就是相互碰撞的,图5-7所示:publicvoidhandlecollidesWith(Submarinesubmarine){isDisplay=false;//设置炸弹不可见submarine.setIsBoom(true);}//潜艇爆炸●handlecollidesWith()方法用来进行碰撞处理图5-4移动区域A图5-5中心点坐标位置图5-4移动区域A图5-5中心点坐标位置图5-6移动区域B图5-6移动区域B图5-7移动区域C图5-7移动区域C5.3.5音乐类的实现该类的主要功能是使用MIDP1.0MediaAPI播放背景音乐,具体代码如下:publicvoidplayCityMusic(){springPlayer=null;flowerPlayer=null;cityPlayer=createPlayer("/city.mid","audio/midi");startPlayer(cityPlayer);}●playCityMusic()方法用来播放城里的月光publicvoidplaySpringMusic(){cityPlayer=null; flowerPlayer=null;springPlayer=createPlayer("/spring.mid","audio/midi");startPlayer(springPlayer);}●playSpringMusic()方法用来播放春江花月夜publicvoidplayFlowerMusic(){cityPlayer=null;springPlayer=null;flowerPlayer=createPlayer("/flower.mid","audio/midi");startPlayer(flowerPlayer);}●playFlowerMusic()方法用来播放菊花台publicvoidstopMusic(){try{ if(cityPlayer!=null)cityPlayer.stop(); if(springPlayer!=null)springPlayer.stop(); if(flowerPlayer!=null)flowerPlayer.stop(); cityPlayer=null; springPlayer=null; flowerPlayer=null; }catch(IllegalStateExceptionise){} catch(MediaExceptionme){}}●stopMusic()方法用来关闭音乐privatevoidstartPlayer(Playerp){if(p!=null){try{p.stop();p.setMediaTime(0L);p.setLoopCount(-1);p.start();}catch(MediaExceptionme){}}}●startPlayer()方法用来开启播放器privatePlayercreatePlayer(Stringfilename,Stringformat){Playerp=null;try{InputStreamis=getClass().getResourceAsStream(filename);p=Manager.createPlayer(is,format);p.prefetch();}catch(IOExceptionioe){}catch(MediaExceptionme){}returnp;}●createPlayer()方法用来创建播放器5.3.6MIDlet应用程序类的实现MIDlet应用程序类是执行整个应用程序,具体代码如下:publicFIRMIDlet(){}//默认构造函数publicvoidstartApp(){Displayablecurrent=Display.getDisplay(this).getCurrent();if(current==null){Display.getDisplay(this).setCurrent(newSplashScreen(this));}}●进入活动状态publicvoidmenuListNewGame(){myCanvas=newFIRCanvas();Display.getDisplay(this).setCurrent(myCanvas);myCanvas.startNewGame();//myCanvas.start();}●menuListNewGame()方法响应开始新游戏处理程序publicvoidsplashScreenDone(){menuList=newMenuList(this);Display.getDisplay(this).setCurrent(menuList);}publicvoidmenuListInstructions(){Display.getDisplay(this).setCurrent(newInstructionsScreen(this));}●splashScreenDone()闪屏处理程序publicvoidgameBack(){menuList.setGameActive(true);Display.getDisplay(this).setCurrent(menuList);}●gameBack()游戏返回处理程序publicvoidmenuListOptions(){Display.getDisplay(this).setCurrent(newOptionsScreen(this));}●menuListOptions()菜单选项处理程序publicvoidpauseApp(){}//进入暂停状态publicvoiddestroyApp(booleanarg0){}//进入销毁状态publicvoidinstructionsBack(){Display.getDisplay(this).setCurrent(menuList);}publicvoidquit(){destroyApp(false);notifyDestroyed();}●quit()方法执行新退出功能publicvoidloadSound(){try{java.io.InputStreamis=getClass().getResourceAsStream("/flower.mid");Playerplayer=Manager.createPlayer(is,"audio/midi");player.realize();player.prefetch();player.start();}catch(Exceptione){e.printStackTrace();}}●loadSound()方法背景音乐处理程序staticImagecreateImage(Stringfilename){Imageimage=null;try{image=Image.createImage(filename);}catch(java.io.IOExceptionex){}returnimage;}}●ImagecreateImage()方法显示图片处理程序5.4游戏辅助功能的实现5.4.1游戏的闪屏类的实现游戏的闪屏类SplashScreen主要负责在游戏启动后出现闪屏的功能,其代码如下:classSplashScreenextendsCanvasimplementsRunnable{privatefinalFIRMIDletmidlet;privateImageimgSplash;privatevolatilebooleanisDismissed=false;SplashScreen(FIRMIDletmidlet){this.midlet=midlet;imgSplash=midlet.createImage("/splash.png");newThread(this).start();}publicvoidrun(){synchronized(this){try{wait(4000L);}catch(InterruptedExceptione){}dismiss();}}publicvoidpaint(Graphicsg)图5-8闪屏效果图{intCanvasWidth=getWidth();图5-8闪屏效果图intCanvasHeight=getHeight();if(imgSplash!=null){g.drawImage(imgSplash,CanvasWidth/2,CanvasHeight/2,Graphics.VCENTER|Graphics.HCENTER);imgSplash=null;}}publicsynchronizedvoidkeyPressed(intkeyCode){dismiss();}privatevoiddismiss(){if(!isDismissed){isDismissed=true;midlet.splashScreenDone();}}}●类得构造器SplashScreen()中说明要显示的图像,并启动新线程,调用线程类得run()方法●paint()方法用来绘制内存中的图像绘制到屏幕上●keypressed()方法用来处理用户的按键操作闪屏效果如图5-8所示:5.4.2游戏功能设置菜单的实现闪屏画面结束后,程序将会进入主菜单状态,如图5-9所示:Menulist类的详细代码如下:classMenuListextendsListimplementsCommandListener{privateFIRMIDletmidlet;privatebooleangameActive=false;MenuList(FIRMIDletmidlet){super("潜艇大战",List.IMPLICIT);this.midlet=midlet;append("开始新游戏",null);图5-9菜单效果append("加载游戏",null);图5-9菜单效果append("参数设置",null);append("游戏说明",null);append("退出游戏",null);setCommandListener(this);}publicvoidcommandAction(Commandc,Displayabled){if(c==List.SELECT_COMMAND){intindex=getSelectedIndex();if(index!=-1)//shouldneverbe-1{switch(index){case0:midlet.menuListContinue();break;case1:midlet.menuListNewGame();break;case2:midlet.menuListLoadGame();break;case3:midlet.menuListOptions();break;case4:midlet.menuListInstructions();break;case5:midlet.quit();break;default:break;}}}}}●menulist()构造选项列表,用户可以在这些选项中选择一个选项。在该段代码中用的是隐式列表,这种类型的列表选项前面没有选项标记框,并且用户的选择和确认是同时进行的。●J2ME中的事件处理机制授权事件模型,包括事件源和监听器。其中list队形就是事件源,实现CommandListener接口的事件处理器就是监听器用来捕获出发的事件,当用户按下list键是,将调用执行监听器中的事件处理方法。5.4.3参数设置实现在主菜单中选择“参数设置”选项,将进入游戏的功能设置菜单如图5-10所示,OptionsScree详细代码如下:classOptionsScreenextendsFormimplementsCommandListener{OptionsScreen(FIRMIDletmidlet)图5-10选项效果图{super("游戏参数设定");图5-10选项效果图this.midlet=midlet;choicelevel=newChoiceGroup("选择游戏难度:",1);choicelevel.append("难",null);choicelevel.append("易",null);append(choicelevel);choiceBackground=newChoiceGroup("选择背景风格:",1);choiceBackground.append("荷塘",null);choiceBackground.append("淡白",null);choiceBackground.append("岩礁",null);choiceBa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 土地征用合同范本
- 轿车免责协议合同范本
- 认购酒店房屋合同范本
- 培训机构部门工作总结
- 电梯检验知识培训
- 钻孔引流术后护理
- 预防应对交通安全
- 太空军事装备研发-深度研究
- 培黎职业学院《日语语音》2023-2024学年第一学期期末试卷
- 江苏省句容高级中学2024-2025学年高三寒假开学综合检测试题含解析
- 青鸟消防JB-QB-JBF5012火灾报警控制器使用说明书V1.3
- 职业技能培训投标方案(技术方案)
- 2024年四川省南充市重点中学小升初语文入学考试卷含答案
- 合金冶炼有限公司2×33000KVA全密闭硅锰合金矿热炉配套煤气发电项目环评可研资料环境影响
- 公路养护服务服务承诺及其质量保证措施
- 反电信诈骗安全教育课件
- 砂石料供应、运输、售后服务方案-1
- JGT160-2017 混凝土用机械锚栓
- 25道南昌轨道交通集团运营管理类岗位岗位常见面试问题含HR常问问题考察点及参考回答
- 外语学习焦虑与对策
- 2023年10月自考00054管理学原理真题及答案含评分标准
评论
0/150
提交评论