JavaME综合实训报告.doc_第1页
JavaME综合实训报告.doc_第2页
JavaME综合实训报告.doc_第3页
JavaME综合实训报告.doc_第4页
JavaME综合实训报告.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

Java ME综合实训报告 Java ME综合实训实训报告姓名 徐亮 学号 90917p35 系部 软 件 学 院 专业 移 动 应 用 开 发 软件项目 Java ME 实训 指导教师 蒋理 完成时间 2020 年 6 月 28日 17目 录1 软件项目概述11.1 J2ME开发背景11.2 手机游戏设计11.3 项目名称12 项目策划22.1 游戏需求分析22.2 游戏界面流程32.3 搭建平台与环境32.3.1 平台开发环境32.3.2 关于Wireless ToolKit32.3.3 关于Java Appication Manager43 模块分析与设计43.1 程序的总体流程43.2 构建游戏框架53.2.1 游戏启动界面53.2.2 游戏设置界面54 功能编码实现54.1 游戏主类MameCanvas64.2 通过游戏生成器生成的类74.3 游戏设置模块94.3.1 游戏难度设计94.3.2 游戏环境设计124.3.3 游戏获胜失败设计135 运行与测试146 发布与运营157 实训小结168 参考文献171 软件项目概述1.1 J2ME开发背景现在全球超过十亿部移动电话正在被使用,并且这个数目正在逐渐增加。在除美国之外的每个发达国家,拥有手机的人数比拥有计算机的人数还多。统计表明,截止到2010年3月底,我国移动电话用户已达7.8亿户,普及率为58.4部/百人,大约平均每月增加720万户。2009年对计算机通信行业的开发者和从业者来说有太多的期待,而最值得期待的就是被称之为纯技术驱动的第三代移动通信系统的商用。姑且不谈纯技术驱动有没有市场,能不能成功,但是3G的商用必定会给移动开发插上飞翔的翅膀,而且J2ME(Java 2 Micro Edition)将是移动开发这场竞赛的领跑者。传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部手机。这极大的限制了手机软件的发展。但随着Java技术在手机上的应用,成功地解决这一问题。Java技术的开放性、安全性和庞大的社会已有资源,以及其跨平台性,即“编写一次,到处运行”的特点,使Java技术成为这种智能手机软件平台的事实标准。1.2 手机游戏设计与传统的主流的PC游戏相比,手机游戏的价值在于打发一些无聊的时间,作为一个移动的娱乐终端,手机游戏施展身手的机会永远可能是在地铁站、公交车或者是洗手间这些地方,也许在庞大的游戏行业里,手机游戏将永远扮演着一个边缘者的角色,因为谁也不能指望一个人在家的时候用手机玩游戏或者看电影。但是手机游戏的市场是巨大的,即便是只有十分之一的用户来购买游戏,那也是一笔有利可图的巨大利润。1.3 项目名称基于Netbeans IDE游戏生成器的一个简单的神秘园游的手机游戏SercetGarden。2 项目策划2.1 游戏需求分析本次实训程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性,运行程序后允许用户选择执行选项菜单;在开始游戏后先从外部文件载入游戏的图片文件,对背景物体进行绘图,并使用双缓存技术保证屏幕重绘的精确性和实施性;有序程序中设定的游戏区域可能会大于实际的手机屏幕,必须进行合理的算法进行虚拟游戏区域与实际游戏区域的转换,保证程序的正确性;同时,因为游戏中有众多的移动对象,必须保证对游戏对象功能完整的前提下,尽量减少系统的资源消耗,否则在资源有限的手机中运行此程序是不现实的。根据游戏的特点,该游戏的需求如下:1一个玩家精灵Karel2随关卡而改变数量和速度的敌方蜘蛛3通用的游戏控制4难度增加的关卡模式5合理的过关功能6游戏背景音乐7游戏背景灯2.2 游戏界面流程图2-1 游戏界面流程2.3 搭建平台与环境2.3.1 平台开发环境Microsoft Windows XP Professional SP3JDK(Java Development Kit)Netbeans IDE 6.8Sun Java Wireless Toolkit 2.5.2 for CLDC2.3.2 关于Wireless ToolKitWTK(Wireless Tool Kit)是Sun公司针对J2ME推出的用于手机和Palm等移动设备的开发包,是除手机厂商的专用开发包外唯一的手机模拟器开发包。它通用性高,开发出的应用程序可保证能运行在大部分设备上,而不像专用厂商具有一定的不兼容性。虽然它没有强大的功能和完善的调试手段,但它提供运行模拟器的最基本组件,是其他IDE需集成采用的必备元素。2.3.3 关于Java Appication Manager 手机中负责调配程序运行资源的管理后台是Java Application Manager。它所使用的传输媒体可以是红外线、网络、以及其他可用来传输的媒体。Java Application Manager 会从网络上下载代表该Application Suite的JAR文档,接着在手机上安裝此MIDlet Suite,然后在手机开始执行该应用程序。包括MIDPlet套件被安装、升级、删除、启动、停止以及常规的管理。3 模块分析与设计3.1 程序的总体流程游戏的总体流程包含了整个游戏中的动作切换过程,这些动作切换包括:选择进入游戏或者退出游戏,游戏进入主绘线程开始绘制游戏界面以及在主绘线程中产生的各种命令和消息。下图描述了游戏的主控流程。图3-1程序的总体流程3.2 构建游戏框架3.2.1 游戏启动界面为了增加软件的专业化效果,为游戏软件添加启动流程画面可以增强游戏的商业化效果。下图是该游戏启动画面的流设计界面。图3-2 SecretGardenVisualMIDlet 流设计视图3.2.2 游戏设置界面游戏设置表单的设计分为游戏等级,游戏环境的设置。其中游戏等级分为四个等级,分别是简单、高手、牛人、强人,依次对应游戏的难度的增加,即游戏中蜘蛛的数量和速度随着等级的增加而增加;游戏环境的设置有背景灯和背景音乐的开启。4 功能编码实现本手机游戏中共有四个类,其中SecretGardenVisualMIDlet类主要负责屏幕的切换,它们分别是,游戏启动的画面闪屏,游戏菜单,设置,关于以及游戏屏幕等。游戏使用的类是主类MameCanvas以及SpriteRandomMovement类,游戏的设计类是GameDesign类,游戏的类UML图如下图所示:图4-1游戏总体类图游戏的线程主要由三个部分组成:检测键盘输入(与玩家交互),更新游戏场景(处理游戏逻辑),绘制画布。基本上所有的2D游戏都可以按章这三个模块来设计,三个模块相互联系,按照模块的思想来实现游戏线程将更加面向对象和便于理解。如果程序运行快于预期速度会使玩家感觉到抖动,从而影响游戏效果,因此还需要检测每帧的运行时间,如果过快则等待一段时间,如果过慢则挂起当前线程允许其他线程执行,线程的模块如下图所示:图4-2游戏线程模块图4.1 游戏主类MameCanvasMainCanvas 类是游戏的主类,控制着游戏角色的出现和行动方向,对游戏中的场景进行布局,并对游戏角色和场景中的装饰物进行碰撞检测。为了实现MIDP API中的游戏功能,将该类继承自GameCanvas,并修改代码如下:public MainCanvas() extendeds GameCanvas super(true); try this.setFullScreenMode(true); initThomas(difficulty); this.init(); catch (IOException ex) ex.printStackTrace(); private void init() throws IOException 由于为游戏软件添加启动流程画面,所以要将主类MainCanvas的实例显示到手机屏幕上,修改启动流程画面SecretGardenVisualMIDlet类如下:if (_selectedElement.equals(loading) this.mainCanvas = new MainCanvas(); this.t = new Thread(mainCanvas); t.start(); d = Display.getDisplay(this); d.setCurrent(mainCanvas);4.2 通过游戏生成器生成的类在NetBeans IDE提供的游戏生成器中可以设计游戏中地图、场景和游戏角色等,通过简单的退拽可以减少不必要的重复劳动,我觉得这个是我认为NetBeans IDE比其他IDE要好的主要原因之一。下图是通过游戏生成起生成GameDesign类并经过简单修改后形成的类图:图4-3通过游戏生成起生成的GameDesign类其中getTopview_titles()方法用于读取创建平铺层的图片资源;getBase()方法用于创建平铺层Base,返回TiledLayer类型对象。其中的数组tiles即为平铺层的贴图单元;updateLayerManagerForForest ()方法是游戏生成器的管理方法,用于管理场景中的平铺层和动画层。其中的m是LayerManager类型对象,是图层的管理者。将生成好的场景Forset添加到MainCanvas中并显示在屏幕上,在init()方法中初始化即可:private void init() throws IOException this.timer = new Timer(); this.gameDesign = new GameDesign(); this.waterAnimator = new TileAnimationTask( gameDesign.getWater(), gameDesign.AnimWaterWater, gameDesign.AnimWaterSeq001, true); this.timer.scheduleAtFixedRate( this.waterAnimator, 0, gameDesign.AnimWaterSeq001Delay); this.tlThings = this.gameDesign.getThings(); this.tlTrees = this.gameDesign.getTrees(); this.tlWater = this.gameDesign.getWater(); this.tlBase = this.gameDesign.getBase(); this.tljian = this.gameDesign.getJiantiled(); this.lm = new LayerManager(); gameDesign.updateLayerManagerForForest(lm);4.3 游戏设置模块为了增加游戏的可玩性,在本游戏中设置了游戏的难度,游戏的背景灯和游戏的背景音乐。4.3.1 游戏难度设计表 4-1游戏难度的设计难度名称难度等级蜘蛛数量蜘蛛速度简单155高手2107牛人31510超人42015为了响应为了响应用户在 setting 窗口的难度选择,首先要在 getSetting()方法中添加以下代码,以响应用户的选择:setting.setItemStateListener(this)同时,使 SecretGardenVisualMIDlet 扩展 ItemStateListener 接口,并实现下方的itemStateChanged()方法: public void itemStateChanged(Item item) if (item = levelchoice) if (levelchoice.isSelected(0) difficulty = 1; else if (levelchoice.isSelected(1) difficulty = 2; else if (levelchoice.isSelected(2) difficulty = 3; else if (levelchoice.isSelected(3) difficulty = 4; 并修改 MainCanvas 构造方法,在 try 中添加初始化 Thomas 的方法:initThomas(difficulty)根据用户不同的选择生成的不同的Thomas对象组并初始化Thomas:private void initThomas(int numThomas) if (numThomas = 1) count = 5; speed = 5; spriteThomas = new Spritecount; spriteThomasAnimator = new SpriteAnimationTaskcount; spriteThomasRandomMovement = new SpriteRandomMovementcount; /此处省略用户选择其他的选项的代码实现 修改 MainCanvas 中的 init()方法:private void init() throws IOException this.spriteThomas = gameDesign.getThomasGroup(count); for (int i = 0; i count; i+) this.spriteThomasi.defineReferencePixel(8, 8); this.spriteThomasAnimatori = new SpriteAnimationTask(this.spriteThomasi, true); this.spriteThomasAnimatori.setMoving(true); this.timer.scheduleAtFixedRate( this.spriteThomasAnimatori, 0, gameDesign.ThomasSeqWalkHorizDelay); this.spriteThomasRandomMovementi = new SpriteRandomMovement( this, spriteThomasi, GameDesign.flagi, speed); this.spriteThomasRandomMovementi.setSequences( gameDesign.ThomasSeqWalkVert, Sprite.TRANS_NONE, gameDesign.ThomasSeqWalkVert, Sprite.TRANS_ROT180, gameDesign.ThomasSeqWalkHoriz, Sprite.TRANS_ROT180, gameDesign.ThomasSeqWalkHoriz, Sprite.TRANS_NONE); (new Thread(spriteThomasRandomMovementi).start(); 在 GameDesign 中添加 getThomasGroup()构造方法: public Sprite getThomasGroup(int count) throws java.io.IOException GameDesign.countThomas=count; Random rm = new Random(); for (int i = 0; i count; i+) flagi = Math.abs(rm.nextInt() % 4; if (ThomasGroupi = null) ThomasGroupi = new Sprite(getTopview_tiles(), 16, 16); switch (flagi) case 0: ThomasGroupi.setFrameSequence(ThomasSeqWalkVert); break; /此处省略其他case 语句 return ThomasGroup; 4.3.2 游戏环境设计背光灯是手机 LCD 发出的灯光,在 Java ME中可以通过 flashBacklight()方法设置背光灯的照亮时间。在 itemStateChanged()方法中添加以下监听代码:public void itemStateChanged(Item item) if (item = environmentchoice) if (environmentchoice.isSelected(0) Display.getDisplay(this).flashBacklight(40000); else Display.getDisplay(this).flashBacklight(0); 游戏的音效对游戏至关重要,好的游戏声音可以增强手机游戏的效果。MIDP 2.0 支持mid 格式和 wav 格式声音的播放。在Java ME 中可以通过 javax.microedition.media 包中提供的方法播放背景音乐。在 itemStateChanged()方法中添加以下代码:public void itemStateChanged(Item item) if (item = environmentchoice) if (environmentchoice.isSelected(1) isplaymusic = true; else isplaymusic = false; 修改 MainCanvas 构造方法,添加播放背景音乐的功能:public MainCanvas(boolean isplaymusic) if (isplaymusic) try player = Manager.createPlayer(getClass().getResourceAsStream(/res/bg.mid), audio/midi); player.realize(); player.setLoopCount(-1); player.start(); catch (Exception e) e.printStackTrace(); 4.3.3 游戏获胜失败设计为了刺激游戏玩家,可以为游戏添加获胜和失利的判断。在本游戏中,如果玩家获得场景中的宝剑,即为获胜;如果玩家不小心碰到爬虫,则失利。修改 MainCanvas 中的碰撞检测方法 spriteCollides(),在其中添加玩家获取宝剑后获胜的判断和玩家碰到爬虫失利的判断:public boolean spriteCollides(Sprite sprite) if (sprite = this.spriteKarel) if (this.spriteKarel.collidesWith(this.tljian, true) this.showAlert(null, midlet.getSvgMenu().getSvgCanvas(), /res/win.png, AlertType.INFO); this.stop(); for (int i = 0; i count; i+) if (this.spriteKarel.collidesWith(this.spriteThomasi, true) this.showAlert(null, midlet.getSvgMenu().getSvgCanvas(), /res/gameover.png, AlertType.INFO); this.stop(); /精灵Thomas 的碰撞检测 for (int i = 0; i count; i+) if (this.spriteThomasi.collidesWith(this.spriteKarel, true) this.showAlert(null, midlet.getSvgMenu().getSvgCanvas(), /res/gameover.png, AlertType.INFO); this.stop(); return sprite.collidesWith( sprite = this.spriteKarel ? this.spriteThomas0 : this.spriteKarel, true) | sprite.collidesWith(this.tlThings, true) | sprite.collidesWith(this.tlTrees, true) | sprite.collidesWith(this.tlWater, true) | sprite.getX() 0 | sprite.getY() (this.tlBase.getWidth() - sprite.getWidth() | sprite.getY() (this.tlBase.getHeight() - sprite.getHeight(); 5 运行与测试一个完整的开发周期通常包括:编辑源代码 - 打包 - 安装 - 运行 - 测试。Netbeans IDE能自动对MIDlet套件进行打包。打包产生两个文件,即一个 MIDlet描述符JAD和一个MIDlet套件JAR。描述符是一个JAD文件,包含有关 MIDlet套件的信息。JAR包含组成MIDlet套件的类文件和资源。在下载整个JAR之前,设备可以使用该描述符了解有关应用程序的信息,这在内存匮乏、带宽极缺的无线环境中很值得重视。通过Netbeans IDE运行该手机游戏程序生成的游戏界面如下图所示:图5-1启动进入游戏的各个画面6 发布与运营在Java当中,会有Class文件被反编译之后,程序代码就很容易被解析出来的弱点。Netbeans IDE

温馨提示

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

评论

0/150

提交评论