《基于j2me的潜艇大战-毕业论文.doc》由会员分享,可在线阅读,更多相关《基于j2me的潜艇大战-毕业论文.doc(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、石家庄科技信息职业学院毕 业 论 文题目: 基于J2ME的潜艇大战 专业班级:软件技术(游戏方向)09-24 班摘要:JAVA已经从一种平台无关的编程语言演变成一种与厂商及平台无关的健壮的服务器端技术,促使IT业界深入发掘以Web为核心的应用程序的巨大潜力。J2ME 的出现使这一变化达到了一种新的高度。J2ME,简称Java2平台袖珍版( Java 2 Platform ,Micro Edition (J2ME) ),是SUN公司在J2SE和J2EE之后,致力于消费产品和嵌入式设备的最佳解决方案。作为JAVA的三个版本之一,J2ME在无线编程技术中正发挥着它独特的作用。J2ME为在小型电子设备
2、上创建性能卓越的网络应用提供了一套完整的解决方案。它也使设备制造商、服务提供商及应用开发人员为他们的用户发布新的软件应用成为可能。本篇论文共分为七个部分:包括绪论、J2ME技术概览、游戏设计的需求分析、“Pocket Boxing”手机游戏开发制作、手机游戏开发存在的困难、J2ME手机游戏前景展望和结论。其中第四部分“Pocket Boxing手机游戏开发制作”是本篇论文的重点。整篇论文都是围绕着这一部分来展开论述的,在这一部分里详细介绍一款手机游戏“Pocket Boxing”的开发全过程和开发过程中存在的疑难问题。其中包括:游戏事件、游戏API等以及对事件的处理,另外在游戏描绘处理部分也将
3、作为重点进行介绍。通过对J2ME的详细介绍我们可以从中了解到其自身的作用,近年来,随着JAVA手机的诞生,其无可替代的灵活性与轻便性致使JAVA手机游戏成为游戏市场的又一亮点,它的前景无可限量,必将在我们以后的生活中发挥着重要的作用。关键字:J2ME, MIDP, 游戏编程, 事件, 描绘处理AbstractJava is already changed from a platform-independent programming language to a mission-critical technological with manufacture platform independen
4、t, and java encourage IT circle to deeply tap the huge potential of application with the care of Web. The emergences of J2ME push it to a new high level. J2ME( Java 2 Platform, Micro Edition (J2ME) ) called “Java 2 platform” for short a pocket-edition is a prefect solution plan of consume products a
5、nd embedded equipment, after J2SE&J2EE in SUN company. J2ME is making a special effect at the wireless program technology. J2ME provide a complete set of solution plan, its also make it become possible that issue the new software application by the manufacture of equipment, service supplier and the
6、people of develop application.This article has seven portions: include the introduction, the general situation of J2ME technology, the demand of the game design analyzes, the significance and development of Pocket Boxing, the difficult, the prospect of mobile phone games exploitation and the Conclus
7、ion. The forth part “the production of Pocket Boxing mobile phone games” is the focus of this article. This entire article is around this focus, and this part detail introduces the exploitation process of a mobile phone game and the issues. This part introduces: the case, API of games, deal with the
8、 accident and the other focus to introduce is the manage of games description.Through the detail introduce of J2ME, the function of java is obvious. Of late years, follow the emerge of java mobile phone its unimpeded identity and portability make java mobile phone games become a new focal point of g
9、ame market. J2ME have unlimited brighten and make an important role in the future life.Keywords: J2ME, MIDP, Game programming, Deal with description, Case目 录一、引言51.1 项目背景51.2目的与意义5二 J2ME技术概览52.1 J2ME简介52.2 J2ME体系结构62.2.1 JVM ( 虚拟机 )62.2.2 J2ME配置62.2.3 J2ME简表7三、 开发环境及相关技术83.1 游戏开发环境83.2 关于Wireless To
10、ol Kit8四 游戏设计94.1 需求分析94.2游戏的流程和类结构94.2.1游戏基本运行流程94.2.2游戏的类结构10五、 具体设计105.1游戏项目的创建105.2 游戏主要设计思想115.3 游戏主要功能的实现115.3.1 游戏画布类FIRCanvas的实现115.3.2 军舰类的实现165.3.3 潜艇类的实现175.3.4 水雷类的实现205.3.5 音乐类的实现225.3.6 MIDlet应用程序类的实现245.4游戏辅助功能的实现255.4.1 游戏的闪屏类的实现255.4.2 游戏功能设置菜单的实现275.4.3 参数设置实现285.4.4 游戏说明功能实现29六、游戏
11、的运行30七、 系统测试317.1 作为应用软件的测试317.2 游戏娱乐性内容的评价31结 论32参考文献33一、 引言随着经济的发展和社会节奏的加快,人们所面对的压力越来越大,总想寻求一种方式来释放自己的压力。而我国科技水平在高速发展,计算机已经广泛应用于人们的日常生活中。因此,现在越来越多的人想借着计算机来达到释放自己压力,给自己充电的目的。而电脑游戏尤其是休闲小游戏正好可以起到这种效果。因此,休闲小游戏一直深受人们的喜欢。1.1 项目背景手机是人们日常生活中所用的非常频繁的通信工具,正是由于手机的高普及率,使得无线移动商务才得以迅速普及和发展。手机游戏则每个人都随时,随地地使用。尽管每
12、个手机游戏都不贵,但是巨大的使用量将使得这个市场商机无限。国外的手机游戏市场更是日趋成熟,可以用登峰造极来形容,他们甚至可以把电脑游戏移植其中,可说功能强大。相比较而言中国只能算是起步而已。因此,作为即将毕业的我,选择了潜艇大战手机游戏的设计和开发作为我的毕业设计选题,希望在其过程中,能够清楚自己的不足,在以后的日子里能够更加努力地改进。1.2 目的与意义通过游戏程序增加编程的兴趣,提高编程水平。随着编程水平的提高,力争设计出人们喜欢的休闲小游戏,给人们带来愉悦的心灵享受。给那些长期因工作压力比较大的人们提供一种释放压力的途径,使他(她)们更有激情地工作,同时,也实现了自我的人生价值。二、 J
13、2ME技术概览2.1 J2ME简介Sun Microsystems公司将J2ME定义为“一种以广泛的消费性信息产品为目标的,高度优化的java运行时环境”。它主要针对消费类电子设备,例如,蜂窝电话和可视电话、数字机顶盒、汽车导航系统等。J2ME技术在1999年的Java One Developer Conference 大会上正式推出,它将Java语言与平台无关的特性移植到小型潜入式设备上,允许移动无线设备之间共享应用程序。在消费电子和嵌入式设备领域,内存从几百KB到几十MB,从没有屏幕到Web-TV,CPU从低功耗的嵌入式处理器到几百MHz的RISC处理器,硬件条件的差异是相当大的。这就使得
14、J2ME的标准需要有不同的层次和类别来适应这个复杂的领域,因此相比之下J2ME就比J2SE和J2EE的标准要复杂得多。尽管如此,J2ME在适用于这些设备的同时也保留了Java的传统特性,即代码具有可移植性、部署灵敏性、安全的网络传输性和代码的稳定性等。因此,J2ME目前已经被广泛应用于消费类嵌入式设备,成为嵌入式开发的一种标准。2.2 J2ME体系结构从整体看,J2ME平台由以下几部分组成:Java虚拟机,针对不同的嵌入式设备以及为了满足不同的需要,提供了KVM和CVM两大虚拟机。配置(configuration),它是将某一类特定应用范畴的设备的共性提取出来形成的规范。为开发人员提供了最基础
15、,能在所有平台上通用的核心API类库。简表(profile),它是将某一个特殊行业或领域内的设备的特性提取出来,形成对特定领域特性的总结,是作为配置的一个补充。一些可选包,主要包括设备厂商提供的OEM的API类库。其中前三项组成了J2ME的基本运行环境。其中Java虚拟机是运行环境的核心,其运行于设备中的操作系统之上,再往上是具体的J2ME配置,包括更具设备的资源需要而提供的基本核心API类库,配置的上面是一个或者多个针对不同应用领域而设置简表。2.2.1 JVM ( 虚拟机 )JVM是专门为微型电子设备与资源受限设备如:手机、寻呼机、移动互联网设备、家用微电子设备等设计的一种轻便、紧凑的JA
16、VA虚拟机。JVM可以为微型电子设备提供一个完整的JAVA运行环境,除了一些微型设备所必需的适当的功能有所不同外,它是由JAVA虚拟机规范定义的真实的JAVA虚拟机。它是专门为那些受资源限制,只有几百K字节内存的微型设备设计的。基于上述原因,JVM具有以下几个特点:(1)小,仅具有40KB至80KB的静态内存;(2)轻便、精巧;(3)模块化并可定制;(4)尽可能完全紧凑的完成设计目的。2.2.2 J2ME配置配置是将基本运行的环境定义为一套核心类和一个运行在特定类型设备上的特定的虚拟机。J2ME中提供了两种配置:CLDC和CDC。CDC针对的设备主要是数字电视、机顶盒、网络电话、车载计算设备,
17、特点是有线连接,稳定而持续的电源供应,设备资源比较受限。CLDC支持的设备主要包括无线电话、手机、PDA以及小型零售支付段等。处理能力较弱,只包含程序运行所需要的最小类库。2.2.3 J2ME简表简表是面向配置之上纵向设备,建立在配置的顶部,定义了配置之上受支持设备的类型。目前J2ME领域里使用最广泛的是移动信息设备简表(MIDP),主要针对手机和其他双向移动通信设备而设计的。MIDPlet的开发环境需要有java2 SDK1.3版以上与MIDP的类库、以及后述的运行前验证工具三种。在J2MEWTK中除了包括MIDP的类库、运行前验证工具之外,还会把编译与包装(JAR文件化)、JAD文件的创建
18、、模拟器的启动等在开发MIDP需要用到的操作加以集成。当完成了JDK1.4以及J2MEWTK的安装以后,就可以开始对游戏项目进行创建了。A.MIDlet开发的基本开发流程如下:(1) 编写MIDlet程序源代码;(2) 编译MIDlet程序;(3) 对编写后的类文件进行预校验;(4) 编写清单文件MANIFEST.MF;(5) 对MIDlet程序进行打包;(6) 编写Java应用程序描述符(jad)文件。B.MIDlet文件的构成:(1)JAR(Java ARchive)文件:集成了Class File与图像、声音等内容的数据文件,虽然与J2SE的文件相同,但是列表的文件内容不同;(2)JAD
19、(Java Application Descriptor)文件:指定启动的MIDlet类名称或是数据文件大小、版本等信息;(3)KDDI的地方,使用组合了JAR文件与JAD文件的KDDI专用的KJK(KDDIJavaeXtension)。C.生命周期是指程序从开始执行到退出的生命过程。MIDlet是以下列的生命周期来运行的:(1) 系统调用继承自MIDlet类的默认构造方法,创建对象;(2)系统进入MIDlet生命周期的暂停状态,这个是MIDlet生命周期的第一个状态;(3)系统调用startAPP()方法,然后进入MIDlet的运行状态,程序正常执行;(4)如果在暂停转台或者运行状态下发生错
20、误,则程序会调用destoryAPP( )方法,然后进入销毁状态。整个过程如图2-1所示 图 2-1 生命周期图三、 开发环境及相关技术3.1 游戏开发环境操作系统:Microsoft Windows XP 程序语言:Java 2 开 发 包:Java(TM) 2 Standard Edition (5.0) Sun Micro. J2ME Wireless Tool Kit 2.23.2 关于Wireless Tool KitWTK(Wireless Tool Kit)是Sun公司针对J2ME推出的用于手机和Palm等移动设备的开发包,是除手机厂商的专用开发包外唯一的手机模拟器开发包。它通用
21、性高,开发出的应用程序可保证能运行在大部分设备上,而不像专用厂商具有一定的不兼容性。虽然它没有强大的功能和完善的调试手段,但它提供运行模拟器的最基本组件,是其他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(CLDC 1.0, MIDP2.0, WMA1.1)可改用CLDC1.1或加入MMAPI1.1,自定义(自己随机组合Configur
22、ation, Profile以及Optional Package)三种环境下的应用程序; 2.2版中,WTK全面的支持JTWI规范。具体的说,即MIDP 2.0, CLDC 1.1, WMA 2.0, MMAPI 1.1, Web Services (JSR 172), File and PIM APIs (JSR 75), Bluetooth and OBEX APIs (JSR 82), and 3D Graphics (JSR 184);同时您也可以使用该版本开发面向CLDC1.0 和MIDP1.0的应用程序。系统要求上,WTK2.2至少需要50MB可用硬盘,128MB系统RAM和800
23、MHZ Pentium III CPU。四、 游戏设计4.1 需求分析本系统主要是完成潜艇大战游戏的基本操作。用户可以自己练习和娱乐。本系统需要满足以下几点要求:(1) 利用方向键来改变军舰的运行方向; (2)确定键发射导弹,击中敌人得分,击中自己人扣分; (3) 选项键可以更换背景和背景音乐。4.2 游戏的流程和类结构4.2.1 游戏基本运行流程本游戏的基本运行流程是在MIDlet启动后把整个画布作为一个线程,随时准备响应用户按键操作的KeyPressed()方法,100ms扫描一次潜艇和水雷等物体的运行状态。图 4-1 运行流程图在扫描潜艇和水雷运动时,执行各个物体画面的移动方法。程序并不
24、为每隔新增潜艇和水雷开启一个新线程,太多线程会造成程序的性能直线下降;而是将每一个物体类型直接加入到画布中,每当一个新物体产生,将直接在画布上画出;当物体消除时,将直接在画布上被消除。这样就形成一种注册机制,所有游戏物体的产生和消除都需要画布注册,画布拥有不同类型物体的所有“名单”,所以,当执行移动命令是只需要遍历画布中所有游戏物体,依次执行每隔游戏物体中定义的移动方法即可。游戏的基本运行流程如图4-1所示:4.2.2 游戏的类结构在本游戏的设计过程中,严格按照面向对象的程序设计思想对程序进行设计,主要显示类包括主界面类、游戏画布类、菜单类、选项类、音乐类、说明类和分别代表军舰、水雷和潜艇的各
25、种实体类。FIRMIDlet:是游戏的主类,控制着游戏的生命周期,在FIRMIDlet类中的startapp()方法中先载入游戏画面:在FIRMIDlet类中定义了一个static型的quitapp()方法,以方便在游戏过程中随时点击“退出”键来结束改游戏,和一个static型的setcurrent方法方便在其他类中调用不同的显示对象。startapp()方法当中,加载本游戏的选择菜单;quitapp()方法以结束midlet应用程序并释放内存;采用setcurrent()方法来设置display对象中要显示的屏幕画面。FIRCanvas:画布类,负责绘制游戏中的各种游戏物体,并响应用户的按键
26、操作。Boat:军舰类,定义游戏中军舰的外观、移动和绘制方法。Submariner:潜艇类,定义游戏中潜艇的外观、移动和绘制方法。Bomb:水雷类。定义游戏中水雷的外观,移动,控制以及碰撞检测的方法。五、 具体设计5.1 游戏项目的创建在J2MEWTK当中,是以项目这个单位来管理MIDletSuite,因此在进行程序编写前必须先要创建项目。首先要将项目取名为SimpleMIDlet。在Windows“开始”菜单启动J2MEWTK的KToolbar,启动之后,单击“New project”按钮。然后在“New project”对话框的“project Name”与“MIDlet Class Na
27、me”的文本框输入项目的名称“FIRMIDlet”,并单击“Create project”按钮。这样就完成了对游戏项目的创建。WTK 产生项目后,不同类型的资源有着相对固定的存放位置。Java 源文件被放在apps 目录下Puzzle src 下,相关程序资源文件(图片,音频)放在res 下,应用程序库文件放在lib 下,这在WTK 中是必须注意的,即便是相对路径,也必须是在该类型目录下建立。点击wtk工具栏的”生产”按键。编译通过顺利后,将这个游戏程序压缩成jar包以方便以后对改游戏程序的发布,依次选择ktoolbar菜单中的“项目“”包“”产生包“,jar文件生成后,ktoolbar的提示
28、窗口中会显示成功的提示。运行成功以后,在bin目录下,将会产生一个程序描述文档jad,它清楚的描述了当前MIDlet的名称与版本,发行人,指定的jar包名称与大小,支持CLDC与MIDP版本的信息。5.2 游戏主要设计思想此游戏的关键点是潜艇是否被击中的判断,整个屏幕是一个二维坐标系军舰在一个水平位置移动当在某个位置发射鱼雷判断鱼雷的图片与不断移动的潜艇图片是否有重合的地方,如果有发生爆炸,如果没有继续移动。5.3 游戏主要功能的实现5.3.1 游戏画布类FIRCanvas的实现FIRCanvas继承Canvas类,用来实现整个游戏的主界面。代码具体如下: public FIRCanvas()
29、 CMD_BG = new Command(更改背景,8, 2); CMD_SOUND = new Command(切换声音, 8, 2); CMD_BACK = new Command(退出, 8, 2); addCommand(CMD_BG);图 5-1 屏幕坐标示意图 addCommand(CMD_SOUND); addCommand( CMD_BACK); setCommandListener(this); try imgBack = Image.createImage (getWidth(), getHeight(); gBack = imgBack.getGraphics(); s
30、ound = SoundEffects.getInstance(); boatImage0 = Image.createImage(/res/ship0.png); boatImage1 = Image.createImage(/res/ship1.png); bombImage = Image.createImage(/res/boom.png); sImage10 = Image.createImage(/res/q1.png); sImage11 = Image.createImage(/res/h2.png); sImage20 = Image.createImage(/res/r1.
31、png); sImage21 = Image.createImage(/res/q2.png); boomImage0 = Image.createImage(/res/b.png); boomImage1 = Image.createImage(/res/f1.png); boomImage2 = Image.createImage(/res/b2.png); catch (Exception e) e.printStackTrace( ); width = this.getWidth(); /获得屏幕宽度 height = this.getHeight();/获得屏幕高度 imgBack
32、= Image.createImage (getWidth(),getHeight(); gBack = imgBack.getGraphics(); /创建次画面和次画笔 offScreen = Image.createImage(width, height); offG = offScreen.getGraphics(); boat = new Boat(boatImage, width); init(0); init(1); bomb = new Bomb(bombImage, 0, 0, height); Thread t = new Thread(this); t.start( );
33、 playMusic(); private void init(int num) if (num = 0) submarine0 = new Submarine(sImage1, width, height, 0, boomImage); if (num = 1) submarine1 = new Submarine(sImage2, width, height, 1, boomImage);类中声明了游戏中需要的各种对象,并载入游戏中的图片在类中启动新线程,调用线程类得run()方法来运行程序protected void paint(Graphics g) /清屏 offG.setColor
34、(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); submarine0.paint(offG); submarine1.paint(offG); if (bomb.isDisplay) bomb.paint(offG); /绘制得分 offG.drawString(得分: + score,4,4,Graphic
35、s.TOP | Graphics.LEFT); /将次画面贴到主画面g.drawImage(offScreen, 0, 0, Graphics.TOP | Graphics.LEFT);Paint()方法用来游戏中的各种物体图片绘制到屏幕上 public void keyPressed(int keyCode) /转换为游戏动作 int action = this.getGameAction(keyCode); switch (action) case Canvas.LEFT: /向左 isRepeated = true; boatDirection = Boat.BOAT_MOVE_LEFT
36、; break; case Canvas.RIGHT: isRepeated = true; boatDirection = Boat.BOAT_MOVE_RIGHT; break; case Canvas.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(); /设置坐标
37、 break; /重新绘制 repaint(); keyPressed()方法用来判断用户的按键,从而控制军舰的移动 protected void drawBackground (Graphics g) byte bX = 0, bY = 0; int imgWidth, imgHeight; Image image; if (back 0) g.setColor (0x00AAAAFF); g.fillRect (0, 0, CanvasWidth, CanvasHeight); else try image = Image.createImage (BackArrayback ); img
38、Width = 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 (IOException ioe) System.out.println (Img not found: + BackArrayb
39、ack); g.setColor (0x00AAAAFF); g.fillRect (0, 0, CanvasWidth, CanvasHeight); drawBackground()方法用来绘制背景图片 public void run() while (isRunning) try Thread.sleep(100); catch (Exception e) if (isRepeated) boat.move(boatDirection); if (!submarine0.isIsBoom() submarine0.move(); else /播放爆炸效果 submarine0.boom(
40、); if (!submarine1.isIsBoom() submarine1.move(); else /播放爆炸效果 submarine1.boom(); if (bomb.isDisplay) bomb.move(); if (bomb.collidesWith(submarine0) bomb.handlecollidesWith(submarine0); score-= 10; if (bomb.collidesWith(submarine1) bomb.handlecollidesWith(submarine1); score += 10; System.gc(); repain
41、t(); run()方法用来运行程序 private void playMusic() sound.stopMusic(); switch(music) case 0: break; case 1: sound.playSpringMusic(); break; case 2: sound.playCityMusic(); break; case 3: sound.playFlowerMusic(); break; default:break; playMusic()方法用来执行音乐的选择和播放 public void commandAction(Command c, Displayable d) if (c = CMD_BACK) midlet.instructionsBack(); else if (c = CMD_SOUND) music+; if(music=5)music=0; playMusic(); else if (c = CMD_BG) back+; if(back=BackArray.length)back=0; drawBackground(gBack); repaint();