开发易于移植的J2ME游戏(二)
2005.8.27
时间过得真快啊!第一篇是5.25写的,已经3个月过去了...我也开始了新的工作。这一篇算是对我以前工作的一些经验总结吧
更希望能抛砖引玉,有想和俺共鸣一下的,请一定给这篇文章留言喽。。(在其他地方看到此文者请去http://blog.csdn.net/n5留言)
二 编写易于移植的J2ME代码
我写第一个J2ME游戏的时候,根本就没想过移植的问题。所以那个游戏也就很难移植了。反过来,如果你已经计划好要移植了,那么事情就简单的多。这一节说的是代码问题。那就想想,不同手机之间在代码上会有哪些差异。
(1) 屏幕尺寸不同
这在第一篇里面已经重点谈过,但这儿谈的是另一个问题,即自适应控件。所谓控件,就是菜单、文本框、列表框、进度条等等。这些控件的大小必须可以根据屏幕大小自适应的调整。按照第一篇说的方法,将屏幕大小作为变量参与到控件尺寸的计算即可得到正确的尺寸(自适应后的)。这儿讲第二个问题,即得到正确尺寸后怎么把它画出来。这要看你的GUI是怎么画得了,如果是用线画的,那就很简单;如果使用了图片,那么就可能要更换图片了。我的控件使用了图片平铺和画线结合,所以可以很容易的改变尺寸。如果控件变大了,则绘制时增加平铺的次数即可。顺便说一下,这些控件我只用了一个类表示,使用参数化的方法区分使用,毕竟咱要尽量少用类吧。
(2) 支持的API不同
如果你的游戏只限于使用Midp1.0,那么移植的时候就不用考虑什么了。实际上由于我们经常要使用图片翻转、象素绘制、全屏等,往往要用到厂商API或Midp2.0。显然移植的时候要考虑到这些api的差异。我的办法是将这些api封装一层,比如我需要使用创建透明子图的API,于是封装了一个函数createSubImg。这是Nokia版本:
public static Image createSubImg(Image img,int []imgRect)
{
Image subImg = DirectUtils.createImage(imgRect[2],imgRect[3],0) ;
subImg.getGraphics().drawImage(img,-imgRect[0],-imgRect[1],20);
return subImg ;
}
这是Midp2.0版本:
public static Image createSubImg(Image img,int []imgRect)
{
return Image.createImage(img,imgRect[0],imgRect[1],imgRect[2],imgRect[3],0) ;
}
对于不同机型,该函数的实现不同,但功能相同,因此使用这个函数的代码在移植时无需修改。当然这样做增加了一些间接性,有可能降低性能。
(3) 按键代码不同
我们知道MIDP提供了Game Action,和按键代码无关,但这不够用啊,我们完全可以定义自己的Game Action,但首先让我们定义自己的虚拟按键码吧。我使用位记录每个键的状态,每个位代表一个按键,一个int有32个位所以足够了。当keyPressed发生时,我记下哪些键被按下;同样当keyReleased时,将那些被松开的键使用的位清0。某个键,也就是这个键盘状态整数里的某个位,就是我定义的一个虚拟键。当然它的值总是2的n次方了,和key code完全不搭边,所以需要我们用一个映射函数将key code映射到这些虚拟键。这个函数就是移植的关键,每个机型都要改写这个映射函数,在里面填入正确的key code。你可以在虚拟键的基础上再定义Game Action,支持在游戏中设置按键,这样就更灵活了。
(4) 封装库
如果想不更改一行代码就从MotorolaV600移植到Nokia N-Gage,那么为他们封装不同的库吧。我就这样在1分钟内完成了移植^-^。我的库包含了一个游戏框架类(内含游戏循环和渲染函数,键盘处理,以及若干跨机型的工具函数),一个图形组管理类(管理图片的载入切割旋转绘制和动画等,有点像GameAPI中的Sprite)和一个控件类(包含了所有我需要的控件)。这3个类封装了不同机型的所有差异,我需要为每种机型改写这三个类,当然大部分代码是相同的了。此外我还写了一个工具支持图形组管理类,所见即所得的编辑动画和管理图片-当然这也对移植有帮助。
总结:
以上几条,总得讲来,无非是拆合而以。主要是要将差异性独立出来,便于更改。但是移植总得来讲还是比较郁闷,主要原因是各种机型有各自的bug,这就需要特殊处理啦。各位写代码时一定要想好移植的问题啊,就算自己不移植也要为移植的兄弟着想啊————
分享到:
相关推荐
综上所述,开发易于移植的J2ME游戏需要在设计阶段就考虑兼容性问题,通过灵活的坐标系统、适应性字体处理、模块化代码以及性能优化策略,可以显著提高游戏的跨平台运行能力。同时,持续的测试和调试对于确保游戏在...
在J2ME游戏开发中,优化是至关重要的,特别是对于实时型游戏,如动作游戏,因为它们需要高帧率和快速响应。J2ME平台的限制,如有限的内存、小屏幕、慢CPU,使得在这样的设备上创建流畅的游戏体验是一项挑战。优化...
【标题】"j2me开发角色游戏 黑暗迷宫" 涉及的主要知识点包括J2ME(Java 2 Micro Edition)平台的基础知识、角色扮演游戏(RPG)的开发原理以及3D图形在移动设备上的实现。 1. **J2ME**:J2ME是Java平台的一个子集,...
在介绍完基础知识之后,本书最后介绍了手机游戏的精彩实例,包括单机游戏、联网游戏、3D游戏、滚屏游戏等,还介绍了游戏的开发理念和移植技术。.. 本书内容全面,实例丰富,易于理解,为读者更好地使用这些技术和...
《J2ME游戏开发:基于Java的射击类小游戏解析》 在移动设备的早期时代,J2ME(Java 2 Micro Edition)是开发者们构建移动应用程序的主流平台,尤其是在开发小游戏方面。标题中的"ShenDeng.rar"是一个包含J2ME游戏的...
在使用J2ME技术开发RPG游戏的过程中,按键处理机制是一个关键部分,它关系到游戏的响应速度和玩家体验。本文将深入探讨如何构建这样一个高效、可移植的按键处理系统。 首先,为了确保游戏对按键的反应快速且灵敏,...
《J2ME_MIDlet_手机游戏入门开发_俄罗斯方块》 在移动设备上开发游戏,J2ME(Java 2 Micro Edition)是一个广泛使用的平台,尤其在早期的智能手机和平板电脑中。MIDlet是J2ME中的一个应用程序模型,专为小型设备...
MC1000扫描软件采用J2ME,意味着该程序具备跨平台性,能在多种支持J2ME的设备上运行,适应性强,易于移植。 NetBeans作为一款开源的集成开发环境(IDE),为开发者提供了便捷的开发工具,支持多种编程语言,包括...
总之,J2ME技术为嵌入式系统开发提供了一个安全、可移植且功能丰富的平台,尤其是在资源受限的移动设备上。通过深入了解J2ME的体系结构和开发流程,开发者可以有效地利用这一技术,为市场带来创新的嵌入式解决方案。
此外,J2ME技术在游戏开发中的应用也十分广泛。通过优化的图形渲染和事件处理机制,开发者可以创建出丰富的交互式游戏体验,且游戏文件体积小,易于下载和分享。结合机器学习,J2ME游戏可以实现智能对手、个性化推荐...
根据需求选择合适的UI组件,高级UI易于使用,可移植性强;低级UI则提供更大的自定义空间。 6. **事件处理**:理解高级事件(如ActionEvent)和低级事件(如KeyEvent)的处理机制,以及如何在MIDlet中实现。 7. **...
1. J2ME游戏开发人员:专门开发特定平台上的游戏,需要精通高级和低级用户界面、线程以及可能的网络编程。 2. J2ME应用开发人员:负责移动应用的开发,如定位服务或移动商务应用,需要掌握高级用户界面、线程和网络...
- **易于移植**:虽然GSM和CDMA短消息格式有所差异,但基于应用工具箱技术开发的应用很容易在两种网络之间移植。 - **广泛应用**:如信息订阅、移动QQ、移动终端银行、移动终端炒股等。 #### 六、基于多媒体消息的...
随着手机软件市场的不断扩大,越来越多的开发者们致力于移动应用的开发,本文简要论述了在BREW和J2ME平台下应用程序开发的特点和区别,并从接口和框架设计方面提出了易于进行平台移植的方法,以便于帮助那些准备将...
《J2ME贪吃蛇源码解析:游戏开发与接口设计》 在移动设备的早期时代,J2ME(Java 2 Micro Edition)是开发者进行手机游戏开发的主要平台之一。其中,贪吃蛇游戏因其简单易玩、趣味性强的特点,成为许多初学者和爱好...
这通常需要开发者对不同手机硬件和操作系统版本的差异有深入了解,并通过J2ME的可移植性特性来实现广泛的设备支持。 【标签分析】 "基于J2ME的手机视频播放系统的开发"标签再次强调了项目的核心技术是J2ME,同时也...
Java ME 的设计目标是提供一种高效、可移植且易于使用的开发环境,以支持资源受限的小型设备上的应用程序开发。 #### 三、本书内容概览 本书详细介绍了 Java ME 平台的关键特性及其在游戏开发中的应用,主要包括...
尽管各手机厂商对JSR标准支持的不一致和虚拟机实现的差异对J2ME的跨平台性造成一定挑战,但其易用性和可移植性仍然吸引了众多开发者。 在企业级应用开发中,J2ME通常采用C/S(客户端/服务器)架构,其中服务器端...
6. **代码可移植性**:虽然这个实现是为J2ME设计的,但开发者可能也考虑了代码的可移植性,使得它可以在其他Java环境中运行,比如Android或者JavaFX。 7. **文件命名"me"**:这可能是项目或类库的简写,可能代表...