- 浏览: 35549 次
- 性别:
- 来自: 上海
文章分类
最新评论
J2ME游戏开发实例讲解
以华容道这个游戏为例进行解释,主要有三个方面:1贴图、2游戏操作、3逻辑判断。这里讲讲贴图,其他两方面放在概要设计和详细设计里讲.所谓的贴图,其实就是画图,就是在要显示图形的位置上输出一副图片,(要是牵扯到动画就要麻烦一些,可以使用TimerTask.Thread或Rannable之类的技术),这副图片可以是事先准备好的也可以是临时处理的.在J2ME中有一个Image类,专门用于管理图片,它有createImage()方法,可以直接读取图片文件(J2ME只支持PNG格式的图片),也可以截取已有的图片的一部分(这样我们可以把很多图片放在一起,然后一张一张的截下来,好处是节省存储空间和文件读取时间,对于手机这两者都是性能的瓶颈).J2ME还有一个Graphics类,专门用于绘图,它有drawImage()方法,可以把一副图片在指定的位置上显示出来,它还有drawRect()方法和setColor()方法,这两个方法在后面我们进行游戏操作时就会用到,这里先交代一下.有了图片和绘图的方法,还需要知道把图画到谁身上,J2ME提供了一个Canvas类,字面意思就是画布,它有一个paint()方法用于刷新页面,还有一个repaint()方法用于调用paint()方法.听着有些糊涂是吧,不要紧,我来结合具体程序讲解一下.为了今后编程的方便,我们创建两个类Images和Draw,Images用于保存一些常量值和图片,Draw主要是用于画图,这两个类的源代码如下。
Images类的源代码如下:
package huarongroad; import javax.microedition.lcdui.*; public class Images {//保存常量 public Images() {//构造函数 public static boolean init() {//初始化游戏中用到的图片 return true; |
Draw类的源代码如下:
package huarongroad; import javax.microedition.lcdui.*; public class Draw { public static boolean paint(Graphics g, byte img, int x, int y) { public static boolean paint(Graphics g, byte img, int x, int y, int unit) { |
其中Images类存的是绘图位置常量(也就是在画图时每个格子的长度和相对坐标原点位置要进行的调整)、地图位置常量(地图的长、宽),地图标记常量(人物对应的记号),地图组合标记常量(后面会细说),图片常量(存放人物的图片);Draw类主要负责在制定的位置画出人物图片。下面我来说说Images类中的地图标记常量和地图组合标记常量。为了能够灵活的安排各个关面的布局,我们决定把游戏布局的信息存储在外部文件中,然后程序启动后把它读进来。这样我们制定了一套存储图片的代码,这就是地图标记常量,如上面Images类中定义的Caocao(曹操)用a字符来表示,当程序读到a字符时就能将它转化成曹操对应的图片,并在读到a字符的位置上进行显示。但是从实际观察中我们发现所有的图片并不是统一大小的,有的占4个格子,有的占2个格子,还有的占1个格子,而且即便同是占两个格子的图片还有横、竖之分。有鉴于此,我们引入了地图组合标记常量,就是说在遇到占有多个格子的时候,值1(也就是Images.LEFT)表示它的左边是一个真正的地图标记,值2(也就是Images.UP)表示它的上边是一个真正的地图标记,值1(也就是Images.LEFTUP)表示它的左上边是一个真正的地图标记。地图组合标记常量其实就是用来占位置的,与实际显示无关,当后面我们将到移动时还会再来分析组合标记的使用。
Draw类主要是用来在画布上画出图形,它有两个paint方法,这是很常见的函数重载。但是程序中实际上只用到了4个参数的paint方法,它直接获得要画图片的相对坐标位置信息,然后调用5个参数的paint方法。5个参数的paint方法将相对坐标位置信息转换成绝对位置,并实际调用Graphics.drawImage()方法,将Images中的图片画了出来。这种实现方法的好处是灵活和便于扩展,但你需要画图的位置并不能够对应到格子中的相对坐标位置时,你就可以直接调用5个参数的paint方法,而不必再去修改这各类;但你添加新的图片时,只要在Images中增加对应的常量,然后向Draw中5个参数的paint方法添加一条处理就可以了。
写到这里,两天的时间刚好用完。
需求分析
这部分叫做需求分析,听起来挺吓人的,其实就是搞清楚我们要做什么,做成什么样,那些不做。下面我引领着大家共同来完成这一步骤。首先,我们要做一个华容道的游戏,华容道的故事这里不再赘述了,但其中的人物在这里限定一下,如上面Images类里的定义,我们这个版本只提供曹操(Caocao)、关羽(Guanyu)、张飞(Zhangfei)、赵云(Zhaoyun)、黄忠(Huangzhong)、马超(Machao)和卒(Zu)。我们这里也限定一下游戏的操作方法:首先要通过方向键选择一个要移动的区域(就是一张图片),被选择的区域用黑色方框框住;选好后按Fire键(就是确定键)将这块区域选中,被选中的区域用绿色方框框住;然后选择要移动到的区域,此时用红色方框框住被选择的区域;选好要移动到的区域之后按Fire键将要移动的区域(图片)移到要移动到的区域,并去掉绿色和红色的方框。这里需要强调的概念有选择的区域、选中的区域、要移动的区域和要移动到的区域,这四个概念请读者注意区分,当然也应当把这一部分记入数据字典之中。为了使文章的重点突出(介绍如何制作一个J2ME的收集游戏),我们这里限定一些与本主题无关的内容暂不去实现:过关之后的动画(实现时要用到TimerTask或Thread类,后续的系列文章中我会详细介绍动画方面的知识)、关面之间的切换(其实很简单,当完成任务之后重新再做一边)、暂停和保存等操作(这部分的内容介绍的资料很多,我也写不出什么新的东东来,难免抄袭,故此免掉)。
需求分析基本完成,离下午还有一段时间,马上动手用ACDSee把从网上找来的BMP文件,调整其大小为271*177(我的这个图片是两个部分合在一起,所以比手机实际屏幕大了),另存为PNG格式。半天时间刚刚好,不但搞清楚了要做的东东,还把要用的图片准备好了。
概要设计
概要设计是从需求分析过渡到详细设计的桥梁和纽带,这一部分中我们确定项目的实现方法和模块的划分。我们决定将整个项目分成五个部分,分别是前面介绍的Images、Draw,还有Map和Displayable1和MIDlet1。Images和Draw类功能简单、结构固定,因此很多项目我们都使用这两各类,这里直接拿来改改就能用了,前面已经介绍过这里不再赘述。Map类是用来从外部文件读入地图,然后保存在一个数组之中,这部分的内容是我们在本阶段讨论的重点。Displayable1是一个继承了Canvas类的画布,它用来处理程序的主要控制逻辑和一部分控制逻辑所需的辅助函数,主要函数应该包括用来绘图的paint()函数、用来控制操作的keyPressed()函数、用来控制选择区域的setRange()函数、用来控制选择要移动到区域的setMoveRange()函数、用来移动选中区域的Move()函数和判断是否完成任务的win()函数,更具体的分析,我们放到详细设计中去细化。MIDlet1实际上就是一个控制整个J2ME应用的控制程序,其实也没有什么可特别的,它和我们前面介绍的"Hello World"程序大同小异,这里就不展开来说了,后面会贴出它的全部代码。
Map类主要应该有一个Grid[][]的二维数组,用来存放华容道的地图,还应该有一个read_map()函数用来从外部文件读取地图内容填充Grid数据结构,再就是要有一个draw_map()函数用来把Grid数据结构中的地图内容转换成图片显示出来(当然要调用Draw类的paint方法)。说到读取外部文件,笔者知道有两种方法:一种是传统的定义一个InputStream对象,然后用getClass().getResourceAsStream()方法取得输入流,然后再从输入流中取得外部文件的内容,例如
InputStream is = getClass().getResourceAsStream("/filename"); |
这里请注意文件名中的根路径是相对于便以后的class文件放置的位置,而不是源文件(java)。第二种方法是使用onnector.openInputStream方法,然后打开的协议是Resource,但是这种方法笔者反复尝试都没能调通,报告的错误是缺少Resource协议,估计第二种方法用到J2ME的某些扩展类包,此处不再深究。由于以前已经做过一些类似华容道这样的地图,这里直接给出Map类的代码,后面就不再详细解释Map类了,以便于我们可以集中精力处理Displayable1中的逻辑。Map类的代码如下:
package huarongroad; import java.io.InputStream; public class Map { public byte Grid[][];//存放地图数据 public Map() {//构造函数,负责初始化地图数据的存储结构 public int[] read_map(int i) { public boolean draw_map(Graphics g) { |
对于像华容道这样的小型地图可以直接用手工来绘制地图的内容,比如:
fa1c
2232
bd1e
2gg2
gihg
但是,如果遇到像坦克大战或超级玛莉那样的地图,就必须另外开发一个地图编辑器了(我会在后续的文章中介绍用vb来开发一个地图编辑器)。
详细设计
详细设计是程序开发过程中至关重要的一个环节,好在我们在前面的各个阶段中已经搭建好了项目所需的一些工具,现在这个阶段中我们只需集中精力设计好Displayable1中的逻辑。(两天的时间当然不只干这点活,还要把其他几个类的设计修改一下)
Displayable1这个类负责处理程序的控制逻辑。首先,它需要有表示当前关面的变量level、表示当前光标位置的变量loc、表示要移动区域的变量SelectArea、表示要移动到的区域的变量MoveArea、表示是否已有区域被选中而准备移动的变量Selected和Map类的实例MyMap。然后,我们根据用户按不同的键来处理不同的消息,我们要实现keyPressed()函数,在函数中我们处理按键的上下左右和选中(Fire),这里的处理需要我展开来讲一讲,后面我很快会把这一部分详细展开。
接下来,是实现paint()函数,我们打算在这一部分中反复的重画背景、地图和选择区域,这个函数必须处理好区域被选中之后的画笔颜色的切换,具体讲就是在没有选中任何区域时要用黑色画笔,当选重要移动的区域时使用绿色画笔,当选择要移动到的区域时改用红色画笔(当然附加一张流程图是必不可少的)</span
发表评论
相关推荐
Java 2 Micro Edition(J2ME)...总结,J2ME游戏开发实例讲解是一个深入学习移动设备游戏开发的好起点。通过对各种游戏实例的剖析,开发者能够掌握J2ME平台的特性和最佳实践,为构建富有吸引力的移动游戏奠定坚实基础。
**J2ME游戏开发实例详解** J2ME(Java 2 Micro Edition)是Java平台的一个子集,专门用于开发在移动设备和嵌入式设备上的应用程序,包括游戏。本资源包含多个J2ME游戏的源代码,对于学习J2ME游戏开发的初学者来说,...
10. **实际项目案例**:通过一个或多个完整的游戏开发实例,让读者能够将所学知识应用到实践中,理解开发流程。 11. **调试与测试**:介绍如何使用J2ME的模拟器和真机进行调试,以及如何进行跨设备测试,确保游戏在...
《手机游戏开发全书--J2ME完整实例精解》是一本深入探讨手机游戏开发的专业书籍,主要聚焦于Java Micro Edition(J2ME)平台。J2ME是Java平台的一个子集,专为资源有限的移动设备如早期的智能手机和平板电脑设计。这...
**J2ME开发工具** 开发J2ME应用通常需要使用Java IDE,如NetBeans、Eclipse或者JBuilder,它们都提供了J2ME项目的创建、编译和模拟器测试功能。此外,MIDlet Suite是J2ME应用的基本打包形式,包含了多个MIDlets...
理解这两个组件是进行J2ME开发的基石。 接着,书中会详细介绍如何创建J2ME项目,设置开发环境,如使用NetBeans或Eclipse等IDE,并配置模拟器进行调试。开发者需要掌握MIDlet,这是J2ME应用程序的主要组件,以及如何...
Eclipse是一款流行的开源集成开发环境,对于J2ME开发,需要安装WTK(Wireless Toolkit)或NetBeans等插件来支持。在Eclipse中配置J2ME项目,包括设置设备模拟器、导入MIDP库,并创建MIDlet Suite,这是J2ME应用程序...
在书中,读者将了解到J2ME开发环境的搭建,如使用MIDP(Mobile Information Device Profile)和CLDC(Connected Limited Device Configuration)进行开发。MIDP提供了用户界面和网络访问等功能,而CLDC则定义了运行...
在**郭克华**的J2ME实例讲解中,我们可能会深入学习以下几个核心知识点: 1. **基础概念**:首先,我们会了解J2ME的架构,包括CDC(Connected Device Configuration)和CLDC(Connected Limited Device ...
6. **Java魔方游戏(Rubik)J2ME源代码及讲解**:这是一个对3D物体建模和交互的好例子。通过源代码,可以学习到如何在J2ME中实现旋转、翻转等3D效果,以及如何实现用户的输入反馈。 7. **J2me游戏1945第二版源代码**...
《J2ME程序设计实例教程》通过实例教学的方式,全面讲解了J2ME应用开发的各个方面,包括环境配置、MIDlet开发、用户界面设计、网络通信、多媒体支持、数据存储以及事件和线程管理。配合源码学习,将帮助读者快速掌握...
通过上述讲解,你应该对J2ME开发有了更深入的理解。实践是检验真理的唯一标准,动手尝试解决一些实际问题,你的J2ME技能将得到显著提升。文件"200873170727.chm"可能是一个包含详细教程或实例代码的CHM帮助文档,...
通过对《J2MEMIDP1.0/2.0无线设备编程指南》参考书及其中综合实例的深度剖析,我们不仅学习了J2ME开发的基础知识,还掌握了MIDP v2.0的高级特性和开发工具的使用方法。这些知识和技能对于任何希望在移动设备上开发...
文件列表中的《J2ME_Game_Development_with_MIDP2.pdf》很可能是本书的主要内容,详细讲解了以上提到的知识点,并可能通过实例演示了游戏开发的全过程。而《说明.txt》文件可能包含了阅读指南、版权信息或其他教学...