ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:30.95KB ,
资源ID:3508109      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3508109.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(J2ME游戏开发实例讲解.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

J2ME游戏开发实例讲解.docx

1、J2ME游戏开发实例讲解J2ME游戏开发实例讲解写在前面的话:本文以华容道游戏为例详细讲解J2ME游戏开发的全过程,包括:调研、分析、设计、编码、测试和发布等方面的问题一、序言昨天在网上闲逛,发现一篇讲解用delphi实现华容道游戏的文章,颇受启发于是,产生了将华容道游戏移植到手机中去的冲动现在手机游戏琳琅满目,不一而足,华容道的实现版本也很多正巧不久前笔者对J2ME下了一番功夫,正想借这个机会小试牛刀。选用J2ME的原因还有一个就是目前Java开发大行其到,无线增殖业务迅猛发展,J2ME的应用日渐活跃起来,也希望我的这篇文章能够为J2ME知识的普及和开发团队的壮大推波助澜。由于长期受ISO规

2、范的影响,这次小试牛刀我也打算遵照软件工程的要求,并采取瀑布式的开发模式来规划项目,也希望借此机会向各位没有机会参与正式项目开发的读者介绍一下软件开发的流程。这里我们先定义项目组的人员体制(其实只有我一个人):技术调研、需求分析、概要设计、详细设计、编码、测试均有笔者一人担任;美工这里我找了个捷径,盗用网上现成的图片,然后用ACDSee把它由BMP转换成PNG格式(我出于讲座的目的,未做商业应用,应该不算侵权吧);至于发布工作,由于缺少OTA服务器,此项工作不做(但是我会介绍这步如何做)。接下来,我们规划一下项目实现的时间表,以我个人经验,设想如下:技术调研用2天(这部分解决项目的可行性和重大

3、技术问题,时间会长一些),需求分析用半天(毕竟有现成的东东可以参照,只要理清思路就行了,况且还有很多以前用过的设计模式和写好的代码),概要设计再用半天(有了需求,概要只不够是照方抓药),详细设计要用2天(这一步要把所有的问题想清楚,还要尽可能的准确描述出来),编码用2天(其实1天就够了,技术已经不是问题,多计划出一天来应付突发事件),测试用2天(测试应该至少占全部项目的四分之一,不过这个项目只是一个Demo,也太简单了),发布也要用上半天(尽管我们不去实际发布它,但是还要花点时间搞清楚应该如何做),最后就是项目总结和开庆功会(时间待定)。二.利其器“公欲善其事,必先利其器”,做项目之前第一步是

4、前期调研我们要做的华容道这个东东随处可见,我们要调研的是两个方面:1、游戏的内容:游戏本身很简单,就是有几个格子,曹操占据其中一个较大的格子,然后被几个格子包围,这些格子形状不一定相同,但是挡住了曹操移动的方向游戏者需要挪动这些格子最终把曹操移动到一个指定的位置才算是过关更具体的分析我们放在后面需求分析和概要设计中讨论。2、技术储备:谈到技术,这里简单介绍一下J2ME.Java有三个版本,分别是J2ME(微型版).J2SE(标准版).J2EE(企业版)J2ME是一个标准,采用层结构设计最低层是配置层(Configuration)也就是设备层,其上是简表层(Profile),再上是应用层(App

5、lication).MIDP就是移动信息设备简表,目前主流手机支持MIDP1.0,最新的是MIDP2.0,它比前一个版本增加了对游戏的支持,在javax.microedition.lcdui.game包中提供了一些类来处理游戏中的技术,比如我们后面会用到的Sprite类,它是用来翻转图片的.权衡再三,笔者决定使用MIDP2.0来做开发首先需要安装一个J2ME的模拟器,我们就用Sun公司的WTK2.0,我觉得Sun的东西最权威当然你也可以使用Nokia.Siemens或是Motolora等其他模拟器,但是他们的JDK不尽相同,写出来的程序移植是比较麻烦的Sun公司的WTK2.0可以到World程

6、序开始你的J2ME之旅我们启动WTK2.0工具集中的KToolBar,然后点击NewProject按钮,在弹出的输入框中输入ProjectName为HelloWorld,MIDletClassName为Hello,然后点击CreateProject,开始生成项目,工具会弹出MIDP配置简表,这里接受生成的默认值(以后还可以修改)点击OK,工具提示我们把写好的Java源程序放到WTK_HOMEappsHelloWorldsrc目录之下我们编辑如下代码,并保存在上述目录之下,文件名为Hello.java。importjavax.microedition.midlet.*;importjavax.m

7、icroedition.lcdui.*;publicclassHelloextendsMIDletprivateDisplaydisplay;publicHello()display=Display.getDisplay(this);publicvoidstartApp()TextBoxt=newTextBox(Hello,Hello,256,0);display.setCurrent(t);publicvoidpauseApp()publicvoiddestroyApp(booleanunconditional)保存好了之后,点击Build按钮,工具会为你编译程序,如无意外再点击Run按钮,

8、会弹出一个手机界面,剩下的就不用我教了吧(用鼠标对手机按键一顿狂点)。呵呵,你的第一个J2ME程序已经OK了.什么?你还一点都没懂呢(真是厉害,不懂都能写出J2ME程序来,果然是高手)我这里主要是介绍WTK2.0工具的使用,程序并不是目的,不懂的话后面还会有详细的解说,这里只是带你上路什么?你不懂Java!那也没有关系,后面我再讲得细一点。跳过J2ME,我们先来讲点游戏的理论具体到华容道这个游戏,主要有三个方面,贴图游戏操作逻辑判断这里讲讲贴图,其他两方面放在概要设计和详细设计里讲所谓的贴图,其实就是画图,就是在要显示图形的位置上输出一副图片,(要是牵扯到动画就要麻烦一些,可以使用TimerT

9、ask.Thread或Rannable之类的技术),这副图片可以是事先准备好的也可以是临时处理的在J2ME中有一个Image类,专门用于管理图片,它有createImage()方法,可以直接读取图片文件(J2ME只支持PNG格式的图片),也可以截取已有的图片的一部分(这样我们可以把很多图片放在一起,然后一张一张的截下来,好处是节省存储空间和文件读取时间,对于手机这两者都是性能的瓶颈)J2ME还有一个Graphics类,专门用于绘图,它有drawImage()方法,可以把一副图片在指定的位置上显示出来,它还有drawRect()方法和setColor()方法,这两个方法在后面我们进行游戏操作时就

10、会用到,这里先交代一下有了图片和绘图的方法,还需要知道把图画到谁身上,J2ME提供了一个Canvas类,字面意思就是画布,它有一个paint()方法用于刷新页面,还有一个repaint()方法用于调用paint()方法听着有些糊涂是吧,不要紧,我来结合具体程序讲解一下为了今后编程的方便,我们创建两个类Images和Draw,Images用于保存一些常量值和图片,Draw主要是用于画图,这两个类的源代码如下。Images类的源代码如下:packagehuarongroad;importjavax.microedition.lcdui.*;importjavax.microedition.lcdu

11、i.game.*;publicclassImages/保存常量/绘图位置常量publicstaticfinalintUNIT=32;/方块的单位长度publicstaticfinalintLEFT=10;/画图的左边界顶点publicstaticfinalintTOP=9;/画图的上边界顶点/地图位置常量publicstaticfinalintWIDTH=4;/地图的宽度publicstaticfinalintHEIGHT=5;/地图的高度/地图标记常量publicstaticfinalbyteCAOCAO=(byte)a;Ahref=file:/曹file:/曹/A操的地图标记publics

12、taticfinalbyteMACHAO=(byte)b;/马超的地图标记publicstaticfinalbyteHUANGZHONG=(byte)c;/黄忠的地图标记publicstaticfinalbyteGUANYU=(byte)d;/关羽的地图标记publicstaticfinalbyteZHANGFEI=(byte)e;/张飞的地图标记publicstaticfinalbyteZHAOYUN=(byte)f;/赵云的地图标记publicstaticfinalbyteZU=(byte)g;/卒的地图标记publicstaticfinalbyteBLANK=(byte)h;/空白的地图

13、标记publicstaticfinalbyteCURSOR=(byte)i;/光标的地图标记/地图组合标记常量publicstaticfinalbyteDLEFT=(byte)1;Ahref=file:/组file:/组/A合图形左边标记publicstaticfinalbyteDUP=(byte)2;Ahref=file:/组file:/组/A合图形上边标记publicstaticfinalbyteDLEFTUP=(byte)3;Ahref=file:/组file:/组/A合图形左上标记/图片常量publicstaticImageimage_base;/基本图片publicstaticIma

14、geimage_Zhaoyun;/赵云的图片publicstaticImageimage_Caocao;/曹操的图片publicstaticImageimage_Huangzhong;/黄忠的图片publicstaticImageimage_Machao;/马超的图片publicstaticImageimage_Guanyu;/关羽的图片publicstaticImageimage_Zhangfei;/张飞的图片publicstaticImageimage_Zu;/卒的图片publicstaticImageimage_Blank;/空白的图片publicstaticImageimage_Fra

15、me;/游戏框架的图片publicImages()/构造函数publicstaticbooleaninit()/初始化游戏中用到的图片tryimage_base=Image.createImage(/huarongroad/BITBACK.png);image_Frame=Image.createImage(image_base,126,0,145,177,Sprite.TRANS_NONE);/Sprite类是用来翻转图片的,是MIDP2.0新新增加的支持游戏的特性image_Zhaoyun=Image.createImage(image_base,0,0,UNIT,2*UNIT,Sprit

16、e.TRANS_NONE);image_Caocao=Image.createImage(image_base,UNIT,0,2*UNIT,2*UNIT,Sprite.TRANS_NONE);image_Huangzhong=Image.createImage(image_base,3*UNIT,0,UNIT,2*UNIT,Sprite.TRANS_NONE);image_Machao=Image.createImage(image_base,0,2*UNIT,UNIT,2*UNIT,Sprite.TRANS_NONE);image_Guanyu=Image.createImage(image

17、_base,UNIT,2*UNIT,2*UNIT,UNIT,Sprite.TRANS_NONE);image_Zhangfei=Image.createImage(image_base,3*UNIT,2*UNIT,UNIT,2*UNIT,Sprite.TRANS_NONE);image_Zu=Image.createImage(image_base,0,4*UNIT,UNIT,UNIT,Sprite.TRANS_NONE);image_Blank=Image.createImage(image_base,1*UNIT,4*UNIT,UNIT,UNIT,Sprite.TRANS_NONE);re

18、turntrue;catch(Exceptionex)returnfalse;Draw类的源代码如下:packagehuarongroad;importjavax.microedition.lcdui.*;publicclassDraw/绘制游戏中的图片publicDraw(Canvascanvas)/构造函数publicstaticbooleanpaint(Graphicsg,byteimg,intx,inty)/在地图的x,y点绘制img指定的图片trypaint(g,img,x,y,Images.UNIT);/把地图x,y点转化成画布的绝对坐标,绘图returntrue;catch(Ex

19、ceptionex)returnfalse;publicstaticbooleanpaint(Graphicsg,byteimg,intx,inty,intunit)tryswitch(img)caseImages.CAOCAO:/画曹操/变成绝对坐标,并做调整g.drawImage(Images.image_Caocao,Images.LEFT+x*unit,Images.TOP+y*unit,Graphics.TOP|Graphics.LEFT);break;caseImages.GUANYU:/画关羽g.drawImage(Images.image_Guanyu,Images.LEFT+

20、x*unit,Images.TOP+y*unit,Graphics.TOP|Graphics.LEFT);break;caseImages.HUANGZHONG:/画黄忠g.drawImage(Images.image_Huangzhong,Images.LEFT+x*unit,Images.TOP+y*unit,Graphics.TOP|Graphics.LEFT);break;caseImages.MACHAO:/画马超g.drawImage(Images.image_Machao,Images.LEFT+x*unit,Images.TOP+y*unit,Graphics.TOP|Grap

21、hics.LEFT);break;caseImages.ZHANGFEI:/画张飞g.drawImage(Images.image_Zhangfei,Images.LEFT+x*unit,Images.TOP+y*unit,Graphics.TOP|Graphics.LEFT);break;caseImages.ZHAOYUN:/画赵云g.drawImage(Images.image_Zhaoyun,Images.LEFT+x*unit,Images.TOP+y*unit,Graphics.TOP|Graphics.LEFT);break;caseImages.ZU:/画卒g.drawImag

22、e(Images.image_Zu,Images.LEFT+x*unit,Images.TOP+y*unit,Graphics.TOP|Graphics.LEFT);break;caseImages.BLANK:/画空白g.drawImage(Images.image_Blank,Images.LEFT+x*unit,Images.TOP+y*unit,Graphics.TOP|Graphics.LEFT);break;caseImages.CURSOR:/画光标g.drawRect(Images.LEFT+x*unit,Images.TOP+y*unit,Images.UNIT,Images

23、.UNIT);break;returntrue;catch(Exceptionex)returnfalse;其中Images类存的是绘图位置常量(也就是在画图时每个格子的长度和相对坐标原点位置要进行的调整)、地图位置常量(地图的长、宽),地图标记常量(人物对应的记号),地图组合标记常量(后面会细说),图片常量(存放人物的图片);Draw类主要负责在制定的位置画出人物图片。下面我来说说Images类中的地图标记常量和地图组合标记常量。为了能够灵活的安排各个关面的布局,我们决定把游戏布局的信息存储在外部文件中,然后程序启动后把它读进来。这样我们制定了一套存储图片的代码,这就是地图标记常量,如上面I

24、mages类中定义的Caocao(曹操)用a字符来表示,当程序读到a字符时就能将它转化成曹操对应的图片,并在读到a字符的位置上进行显示。但是从实际观察中我们发现所有的图片并不是统一大小的,有的占4个格子,有的占2个格子,还有的占1个格子,而且即便同是占两个格子的图片还有横、竖之分。有鉴于此,我们引入了地图组合标记常量,就是说在遇到占有多个格子的时候,值1(也就是Images.LEFT)表示它的左边是一个真正的地图标记,值2(也就是Images.UP)表示它的上边是一个真正的地图标记,值1(也就是Images.LEFTUP)表示它的左上边是一个真正的地图标记。地图组合标记常量其实就是用来占位置的

25、,与实际显示无关,当后面我们将到移动时还会再来分析组合标记的使用。Draw类主要是用来在画布上画出图形,它有两个paint方法,这是很常见的函数重载。但是程序中实际上只用到了4个参数的paint方法,它直接获得要画图片的相对坐标位置信息,然后调用5个参数的paint方法。5个参数的paint方法将相对坐标位置信息转换成绝对位置,并实际调用Graphics.drawImage()方法,将Images中的图片画了出来。这种实现方法的好处是灵活和便于扩展,但你需要画图的位置并不能够对应到格子中的相对坐标位置时,你就可以直接调用5个参数的paint方法,而不必再去修改这各类;但你添加新的图片时,只要在

26、Images中增加对应的常量,然后向Draw中5个参数的paint方法添加一条处理就可以了。写到这里,两天的时间刚好用完。三、需求分析这部分叫做需求分析,听起来挺吓人的,其实就是搞清楚我们要做什么,做成什么样,那些不做。下面我引领着大家共同来完成这一步骤。首先,我们要做一个华容道的游戏,华容道的故事这里不再赘述了,但其中的人物在这里限定一下,如上面Images类里的定义,我们这个版本只提供曹操(Caocao)、关羽(Guanyu)、张飞(Zhangfei)、赵云(Zhaoyun)、黄忠(Huangzhong)、马超(Machao)和卒(Zu)。我们这里也限定一下游戏的操作方法:首先要通过方向键

27、选择一个要移动的区域(就是一张图片),被选择的区域用黑色方框框住;选好后按Fire键(就是确定键)将这块区域选中,被选中的区域用绿色方框框住;然后选择要移动到的区域,此时用红色方框框住被选择的区域;选好要移动到的区域之后按Fire键将要移动的区域(图片)移到要移动到的区域,并去掉绿色和红色的方框。这里需要强调的概念有选择的区域、选中的区域、要移动的区域和要移动到的区域,这四个概念请读者注意区分,当然也应当把这一部分记入数据字典之中。为了使文章的重点突出(介绍如何制作一个J2ME的收集游戏),我们这里限定一些与本主题无关的内容暂不去实现:过关之后的动画(实现时要用到TimerTask或Threa

28、d类,后续的系列文章中我会详细介绍动画方面的知识)、关面之间的切换(其实很简单,当完成任务之后重新再做一边)、暂停和保存等操作(这部分的内容介绍的资料很多,我也写不出什么新的东东来,难免抄袭,故此免掉)。需求分析基本完成,离下午还有一段时间,马上动手用ACDSee把从网上找来的BMP文件,调整其大小为271*177(我的这个图片是两个部分合在一起,所以比手机实际屏幕大了),另存为PNG格式。半天时间刚刚好,不但搞清楚了要做的东东,还把要用的图片准备好了。四、概要设计概要设计是从需求分析过渡到详细设计的桥梁和纽带,这一部分中我们确定项目的实现方法和模块的划分。我们决定将整个项目分成五个部分,分别

29、是前面介绍的Images、Draw,还有Map和Displayable1和MIDlet1。Images和Draw类功能简单、结构固定,因此很多项目我们都使用这两各类,这里直接拿来改改就能用了,前面已经介绍过这里不再赘述。Map类是用来从外部文件读入地图,然后保存在一个数组之中,这部分的内容是我们在本阶段讨论的重点。Displayable1是一个继承了Canvas类的画布,它用来处理程序的主要控制逻辑和一部分控制逻辑所需的辅助函数,主要函数应该包括用来绘图的paint()函数、用来控制操作的keyPressed()函数、用来控制选择区域的setRange()函数、用来控制选择要移动到区域的setMoveRange()函数、用来移动选中区域的Move()函数和判断是否完成任务的win()函数,更具体的分析,我们放到详细设计中去细化。MIDlet1实际上就是一个控制整个J2ME应用的控制程序,其实也没有什么可特别的,它和我们前面介绍的HelloWorld程序大同小异,这里就不展开来说

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1