Java ME综合实训报告.docx
- 文档编号:17890694
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:22
- 大小:714.11KB
Java ME综合实训报告.docx
《Java ME综合实训报告.docx》由会员分享,可在线阅读,更多相关《Java ME综合实训报告.docx(22页珍藏版)》请在冰点文库上搜索。
JavaME综合实训报告
JavaME综合实训
实训报告
姓名徐亮学号90917p35
系部软件学院
专业移动应用开发
软件项目JavaME实训
指导教师蒋理
完成时间2020年6月28日
目录
1软件项目概述1
1.1J2ME开发背景1
1.2手机游戏设计1
1.3项目名称1
2项目策划2
2.1游戏需求分析2
2.2游戏界面流程3
2.3搭建平台与环境3
2.3.1平台开发环境3
2.3.2关于WirelessToolKit3
2.3.3关于JavaAppicationManager4
3模块分析与设计4
3.1程序的总体流程4
3.2构建游戏框架5
3.2.1游戏启动界面5
3.2.2游戏设置界面5
4功能编码实现5
4.1游戏主类MameCanvas6
4.2通过游戏生成器生成的类7
4.3游戏设置模块9
4.3.1游戏难度设计9
4.3.2游戏环境设计12
4.3.3游戏获胜失败设计13
5运行与测试14
6发布与运营15
7实训小结16
8参考文献17
1.软件项目概述
1.1J2ME开发背景
现在全球超过十亿部移动电话正在被使用,并且这个数目正在逐渐增加。
在除美国之外的每个发达国家,拥有手机的人数比拥有计算机的人数还多。
统计表明,截止到2010年3月底,我国移动电话用户已达7.8亿户,普及率为58.4部/百人,大约平均每月增加720万户。
2009年对计算机通信行业的开发者和从业者来说有太多的期待,而最值得期待的就是被称之为纯技术驱动的第三代移动通信系统的商用。
姑且不谈纯技术驱动有没有市场,能不能成功,但是3G的商用必定会给移动开发插上飞翔的翅膀,而且J2ME(Java2MicroEdition)将是移动开发这场竞赛的领跑者。
传统手机出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部手机。
这极大的限制了手机软件的发展。
但随着Java技术在手机上的应用,成功地解决这一问题。
Java技术的开放性、安全性和庞大的社会已有资源,以及其跨平台性,即“编写一次,到处运行”的特点,使Java技术成为这种智能手机软件平台的事实标准。
1.2手机游戏设计
与传统的主流的PC游戏相比,手机游戏的价值在于打发一些无聊的时间,作为一个移动的娱乐终端,手机游戏施展身手的机会永远可能是在地铁站、公交车或者是洗手间这些地方,也许在庞大的游戏行业里,手机游戏将永远扮演着一个边缘者的角色,因为谁也不能指望一个人在家的时候用手机玩游戏或者看电影。
但是手机游戏的市场是巨大的,即便是只有十分之一的用户来购买游戏,那也是一笔有利可图的巨大利润。
1.3项目名称
基于NetbeansIDE游戏生成器的一个简单的神秘园游的手机游戏——SercetGarden。
2.项目策划
2.1游戏需求分析
本次实训程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性,运行程序后允许用户选择执行选项菜单;在开始游戏后先从外部文件载入游戏的图片文件,对背景物体进行绘图,并使用双缓存技术保证屏幕重绘的精确性和实施性;有序程序中设定的游戏区域可能会大于实际的手机屏幕,必须进行合理的算法进行虚拟游戏区域与实际游戏区域的转换,保证程序的正确性;同时,因为游戏中有众多的移动对象,必须保证对游戏对象功能完整的前提下,尽量减少系统的资源消耗,否则在资源有限的手机中运行此程序是不现实的。
根据游戏的特点,该游戏的需求如下:
1.一个玩家精灵Karel
2.随关卡而改变数量和速度的敌方蜘蛛
3.通用的游戏控制
4.难度增加的关卡模式
5.合理的过关功能
6.游戏背景音乐
7.游戏背景灯
2.2游戏界面流程
图2-1游戏界面流程
2.3搭建平台与环境
2.3.1平台开发环境
MicrosoftWindowsXPProfessionalSP3
JDK(JavaDevelopmentKit)
NetbeansIDE6.8
SunJavaWirelessToolkit2.5.2forCLDC
2.3.2关于WirelessToolKit
WTK(WirelessToolKit)是Sun公司针对J2ME推出的用于手机和Palm等移动设备的开发包,是除手机厂商的专用开发包外唯一的手机模拟器开发包。
它通用性高,开发出的应用程序可保证能运行在大部分设备上,而不像专用厂商具有一定的不兼容性。
虽然它没有强大的功能和完善的调试手段,但它提供运行模拟器的最基本组件,是其他IDE需集成采用的必备元素。
2.3.3关于JavaAppicationManager
手机中负责调配程序运行资源的管理后台是JavaApplicationManager。
它所使用的传输媒体可以是红外线、网络、以及其他可用来传输的媒体。
JavaApplicationManager会从网络上下载代表该ApplicationSuite的JAR文档,接着在手机上安裝此MIDletSuite,然后在手机开始执行该应用程序。
包括MIDPlet套件被安装、升级、删除、启动、停止以及常规的管理。
3.模块分析与设计
3.1程序的总体流程
游戏的总体流程包含了整个游戏中的动作切换过程,这些动作切换包括:
选择进入游戏或者退出游戏,游戏进入主绘线程开始绘制游戏界面以及在主绘线程中产生的各种命令和消息。
下图描述了游戏的主控流程。
图3-1程序的总体流程
3.2构建游戏框架
3.2.1游戏启动界面
为了增加软件的专业化效果,为游戏软件添加启动流程画面可以增强游戏的商业化效果。
下图是该游戏启动画面的流设计界面。
图3-2SecretGardenVisualMIDlet流设计视图
3.2.2游戏设置界面
游戏设置表单的设计分为游戏等级,游戏环境的设置。
其中游戏等级分为四个等级,分别是简单、高手、牛人、强人,依次对应游戏的难度的增加,即游戏中蜘蛛的数量和速度随着等级的增加而增加;游戏环境的设置有背景灯和背景音乐的开启。
4.功能编码实现
本手机游戏中共有四个类,其中SecretGardenVisualMIDlet类主要负责屏幕的切换,它们分别是,游戏启动的画面闪屏,游戏菜单,设置,关于以及游戏屏幕等。
游戏使用的类是主类MameCanvas以及SpriteRandomMovement类,游戏的设计类是GameDesign类,游戏的类UML图如下图所示:
图4-1游戏总体类图
游戏的线程主要由三个部分组成:
检测键盘输入(与玩家交互),更新游戏场景(处理游戏逻辑),绘制画布。
基本上所有的2D游戏都可以按章这三个模块来设计,三个模块相互联系,按照模块的思想来实现游戏线程将更加面向对象和便于理解。
如果程序运行快于预期速度会使玩家感觉到抖动,从而影响游戏效果,因此还需要检测每帧的运行时间,如果过快则等待一段时间,如果过慢则挂起当前线程允许其他线程执行,线程的模块如下图所示:
图4-2游戏线程模块图
4.1游戏主类MameCanvas
MainCanvas类是游戏的主类,控制着游戏角色的出现和行动方向,对游戏中的场景进行布局,并对游戏角色和场景中的装饰物进行碰撞检测。
为了实现MIDPAPI中的游戏功能,将该类继承自GameCanvas,并修改代码如下:
publicMainCanvas()extendedsGameCanvas{
super(true);
try{
this.setFullScreenMode(true);
initThomas(difficulty);
this.init();
}catch(IOExceptionex){
ex.printStackTrace();
}
}
privatevoidinit()throwsIOException{
}
由于为游戏软件添加启动流程画面,所以要将主类MainCanvas的实例显示到手机屏幕上,修改启动流程画面SecretGardenVisualMIDlet类如下:
if(__selectedElement.equals("loading")){
this.mainCanvas=newMainCanvas();
this.t=newThread(mainCanvas);
t.start();
d=Display.getDisplay(this);
d.setCurrent(mainCanvas);
}
4.2通过游戏生成器生成的类
在NetBeansIDE提供的游戏生成器中可以设计游戏中地图、场景和游戏角色等,通过简单的退拽可以减少不必要的重复劳动,我觉得这个是我认为NetBeansIDE比其他IDE要好的主要原因之一。
下图是通过游戏生成起生成GameDesign类并经过简单修改后形成的类图:
图4-3通过游戏生成起生成的GameDesign类
其中getTopview_titles()方法用于读取创建平铺层的图片资源;getBase()方法用于创建平铺层Base,返回TiledLayer类型对象。
其中的数组tiles即为平铺层的贴图单元;updateLayerManagerForForest()方法是游戏生成器的管理方法,用于管理场景中的平铺层和动画层。
其中的m是LayerManager类型对象,是图层的管理者。
将生成好的场景Forset添加到MainCanvas中并显示在屏幕上,在init()方法中初始化即可:
privatevoidinit()throwsIOException{
this.timer=newTimer();
this.gameDesign=newGameDesign();
this.waterAnimator=newTileAnimationTask(
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=newLayerManager();
gameDesign.updateLayerManagerForForest(lm);
}
4.3游戏设置模块
为了增加游戏的可玩性,在本游戏中设置了游戏的难度,游戏的背景灯和游戏的背景音乐。
4.3.1游戏难度设计
表4-1游戏难度的设计
难度名称
难度等级
蜘蛛数量
蜘蛛速度
简单
1
5
5
高手
2
10
7
牛人
3
15
10
超人
4
20
15
为了响应为了响应用户在setting窗口的难度选择,首先要在getSetting()方法中添加以下代码,以响应用户的选择:
setting.setItemStateListener(this);
同时,使SecretGardenVisualMIDlet扩展ItemStateListener接口,并实现下方的itemStateChanged()方法:
publicvoiditemStateChanged(Itemitem){
if(item==levelchoice){
if(levelchoice.isSelected(0)){
difficulty=1;
}elseif(levelchoice.isSelected
(1)){
difficulty=2;
}elseif(levelchoice.isSelected
(2)){
difficulty=3;
}elseif(levelchoice.isSelected(3)){
difficulty=4;
}
}
}
并修改MainCanvas构造方法,在try中添加初始化Thomas的方法:
initThomas(difficulty);
根据用户不同的选择生成的不同的Thomas对象组并初始化Thomas:
privatevoidinitThomas(intnumThomas){
if(numThomas==1){
count=5;
speed=5;
spriteThomas=newSprite[count];
spriteThomasAnimator=newSpriteAnimationTask[count];
spriteThomasRandomMovement
=newSpriteRandomMovement[count];
//此处省略用户选择其他的选项的代码实现
}
}
修改MainCanvas中的init()方法:
privatevoidinit()throwsIOException{
this.spriteThomas=gameDesign.getThomasGroup(count);
for(inti=0;i this.spriteThomas[i].defineReferencePixel(8,8); this.spriteThomasAnimator[i] =newSpriteAnimationTask( this.spriteThomas[i],true); this.spriteThomasAnimator[i].setMoving(true); this.timer.scheduleAtFixedRate( this.spriteThomasAnimator[i],0, gameDesign.ThomasSeqWalkHorizDelay); this.spriteThomasRandomMovement[i] =newSpriteRandomMovement( this,spriteThomas[i], GameDesign.flag[i],speed); this.spriteThomasRandomMovement[i] .setSequences( gameDesign.ThomasSeqWalkVert, Sprite.TRANS_NONE, gameDesign.ThomasSeqWalkVert, Sprite.TRANS_ROT180, gameDesign.ThomasSeqWalkHoriz, Sprite.TRANS_ROT180, gameDesign.ThomasSeqWalkHoriz, Sprite.TRANS_NONE); (newThread( spriteThomasRandomMovement[i])).start(); } } 在GameDesign中添加getThomasGroup()构造方法: publicSprite[]getThomasGroup(intcount) throwsjava.io.IOException{ GameDesign.countThomas=count; Randomrm=newRandom(); for(inti=0;i flag[i]=Math.abs(rm.nextInt())%4; if(ThomasGroup[i]==null){ ThomasGroup[i] =newSprite(getTopview_tiles(),16,16); switch(flag[i]){ case0: ThomasGroup[i] .setFrameSequence(ThomasSeqWalkVert); break; //此处省略其他case语句 } } } returnThomasGroup; } 4.3.2游戏环境设计 背光灯是手机LCD发出的灯光,在JavaME中可以通过flashBacklight()方法设置背光灯的照亮时间。 在itemStateChanged()方法中添加以下监听代码: publicvoiditemStateChanged(Itemitem){ if(item==environmentchoice){ if(environmentchoice.isSelected(0)){ Display.getDisplay(this).flashBacklight(40000); }else{ Display.getDisplay(this).flashBacklight(0); } } } 游戏的音效对游戏至关重要,好的游戏声音可以增强手机游戏的效果。 MIDP2.0支持mid格式和wav格式声音的播放。 在JavaME中可以通过javax.microedition.media包中提供的方法播放背景音乐。 在itemStateChanged()方法中添加以下代码: publicvoiditemStateChanged(Itemitem){ if(item==environmentchoice){ if(environmentchoice.isSelected (1)){ isplaymusic=true; }else{ isplaymusic=false; } } } 修改MainCanvas构造方法,添加播放背景音乐的功能: publicMainCanvas(booleanisplaymusic){ if(isplaymusic){ try{ player=Manager.createPlayer(getClass(). getResourceAsStream( "/res/bg.mid"),"audio/midi"); player.realize(); player.setLoopCount(-1); player.start(); }catch(Exceptione){ e.printStackTrace(); } } } 4.3.3游戏获胜失败设计 为了刺激游戏玩家,可以为游戏添加获胜和失利的判断。 在本游戏中,如果玩家获得场景中的宝剑,即为获胜;如果玩家不小心碰到爬虫,则失利。 修改MainCanvas中的碰撞检测方法spriteCollides(),在其中添加玩家获取宝剑后获胜的判断和玩家碰到爬虫失利的判断: publicbooleanspriteCollides(Spritesprite){ 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(inti=0;i if(this.spriteKarel.collidesWith( this.spriteThomas[i],true)){ this.showAlert(null, midlet.getSvgMenu().getSvgCanvas(), "/res/gameover.png",AlertType.INFO); this.stop(); } } } //精灵Thomas的碰撞检测 for(inti=0;i if(this.spriteThomas[i] .collidesWith(this.spriteKarel,true)){ this.showAlert(null, midlet.getSvgMenu().getSvgCanvas(), "/res/gameover.png",AlertType.INFO); this.stop(); } } returnsprite.collidesWith( sprite==this.spriteKarel ? this.spriteThomas[0] : this.spriteKarel,true) ||sprite.collidesWith(this.tlThings,true) ||sprite.collidesWith(this.tlTrees,true) ||sprite.collidesWith(this.tlWater,true) ||sprite.getX()<0||sprite.getY()<0 ||sprite.getX()>(this.tlBase.getWidth() -sprite.getWidth()) ||sprite.getY()>(this.tlBase.getHeight() -sprite.getHeight()); } 5.运行与测试 一个完整的开发周期通常包括: 编辑源代码->打包->安装->运行->测试。 NetbeansIDE能自动对MIDlet套件进行打包。 打包产生两个文件,即一个MIDlet描述符JAD和一个MIDlet套件JAR。 描述符是一个JAD文件,包含有关MIDlet套件的信息。 JAR包含组成MIDlet套件的类文件和资源。 在下载整个JAR之前,设备可以使用该描述符了解有关应用程序的信息,这在内存匮乏、带宽极缺的无线环境中很值得重视。 通过NetbeansIDE运行该手机游戏程序生成的游戏界面如下图所示: 图5-1启动进入游戏的各个画面 6.发布与运营 在Java当中,会有Class文件被反编译之后,程序代码就很容易被解析出来
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java ME综合实训报告 ME 综合 报告