I want to fly higher
programming Explorer
posts - 114,comments - 263,trackbacks - 0
 

序言

做了一段时间的j2me的手机游戏开发,学习到了很多东西,包括j2me体系结构,2d手机游戏开发常用技术等等。现在把一些总结和心得写出来,以供手机游戏开发爱好者学习和交流。(有很多是参考别人写的东西)

一.    研究背景

近年来随着移动通信技术的突飞猛进,移动开发这个新鲜的字眼慢慢成为

开发者关注的热点。目前的移动开发技术大体分为三个阵营:首当其冲的便是由SUN公司提出的,与具体操作系统无关的,已得到各种设备广泛支持的J2ME技术,还有就是主要由NOKIA公司倡导的,主要使用C++语言的基于Symbian操作系统的开放应用平台,以及微软力推的主要使用C#配合.NETCF进行开发的Windows Mobile Smart Phone平台。

由于J2ME秉承了Java技术的跨平台、稳定安全、开放易扩展等优秀特性,

加上支持J2ME技术的终端设备的大量普及,使其很自然的成为了当前嵌入式/移动应用开发的首选平台。

中国作为全球最大的移动通信市场,手机游戏产业一旦启动,其能量将不亚于目前的电脑网络游戏,可以预见手机游戏行业正蕴藏了无数的商机,未来拥有广阔的市场前景。

二.    J2ME的体系结构

2.1 Java技术

Sun公司的Java目前有三个平台,即J2EE( Java2 Enterprise Edition ),J2SE( Java2 Standard Edition )和J2ME。作为平台, J2EE定位于服务器端, J2SE定位于客户端,J2ME则定位于嵌入式系统。它们都要基于Java虚拟机(JVM)才能运行。

2.2 J2ME的层次结构

J2ME采用模块化的结构,底层是宿主机的操作系统,内部则分为三层, Java Virtual Machine(虚拟机层); Configuration(配置层); Profile(简表层)。J2ME有两类虛拟机:CVM(C虚拟机)和KVM(K虚拟机), CVM功能比KVM功能更为强大; Configuration层:Configuration是J2ME对于嵌入式设备的规范,在这些规范中,定义了设备至少要符合的运算能力、供电能力和内存大小等规范,按照规范一般把嵌入式设备分为CLDC(Connected Limited Device Configuration)和CDC(Connected Device Configuration)两大类。Profile层:这一层对于用户和程序开发人员来说是最常见的。Profile中定义了与特定嵌入式设备紧密相关的扩充类库,这些扩充类库是建立在Configuration所定义的核心类库基础上的,它是架构在Configuration之上的规范。针对移动电话内存小、速度慢和I/O差的特点, J2ME对JVM、Configuration和Profile三层做了特殊的实现。在JVM层,J2ME在手机上移植了KVM(Kilobyte Virtual Machine),只需要几百KB的内存就可以运行;在Configuration层, J2ME规定了CLDC(Connected Limited Device Configuration),它对设备的运算能力和内存大小都有具体的限制。CLDC不支持浮点运算;在Profile层, J2ME规定了MIDP(Mobile Information Device Profile)。MIDP定义了在手机上运行的Java程序的规范,包括应用程序生命周期、各种UI界面组件、支持Record存储数据和HTTP连接等等,这些在CLDC的基础上的附加功能是通过扩充新的Java类库来实现的。

下面的图是Java2的体系结构图:

Java2体系结构图

2.3 M ID let介绍

手机程序其实是完全基于MIDP开发的。使用J2MECLDC/MIDP编写的Java程序被称为MIDletMIDlet具有良好的兼容性和可移植性。所有基于MIDP的程序的主类都必须是基于MIDlet的。MIDlet是一个Java,主要实现startApp( )pauseApp( )destroyApp()方法,以实现MIDlet程序的状态转换功能。MIDlet在应用程序生命周期中有三种可能的状态,分别是:运行、暂停和退出。MIDlet在移动电话上运行的完整过程,就是一个MIDlet状态转换过程。MIDlet程序运行时,总是从实现java.microedition.midletMIDlet接口类的构造方法开始,构造方法执行完一次后就不再重复执行。然后通常是运行startApp()pauseApp(),这两个方法可以重复多次执行。最后是运行destroyApp()方法,这个方法执行完时就意味整个MIDlet程序运行结束。

目前MIDP的最新版本是2.0MIDP2.0是在MIDP1.0规范的基础上设计的,保证了同MIDP1.0的兼容性,即MIDP2.0的手机能运行MIDP1.0的应用程序。

MIDP 2.0为移动设备提供了众多新的特性,主要有:对多媒体支持的增强,

支持对声音文件的处理;支持更多的网络协议,增加了对HTTPsSocket、报文

以及串口通讯的支持;支持OTAOver the air Provisioning)技术,让用户可以动态的安装更新移动设备的应用程序等。MIDP 2.0相对于MIDP 1.0来说,最大的进步就是新添加了用于支持游戏的API,它们被放在javax.microedition.lcdui.game包中。游戏开发包提供了一系列针对无线设备的游戏开发类,使得游戏程序可以更加充分的利用设备自身的图形处理功能,并将原来很多需要手动编写的代码如屏幕双缓冲、图像剪裁等都交给API间接调用本地代码来实现,在提高处理性能的同时也大大的提高了开发工作的效率。

       下面是MIDlet的状态转换图:

MIDlet状态转换图

三.    MIDP开发环境配置

所需要的主要软件:EclipseEclipseMeAntenna,JbossJ2seJ2ME Wireless Toolkit

首先安装J2se SDK,注意环境变量设置。

其次安装WTK,设置环境变量。

Eclipse无需安装,自解压,绿色软件。

打开Eclipse后,安装EclispeMe插件。

Jboss为服务器,与OTA发布程序结合使用。

四.游戏设计思想

在开发Java游戏程序时,通常要考虑使用多线程来实现:负责改变图形和刷新显示屏幕、处理用户的输入,处理游戏中各种角色动作的参数变化。

游戏的大体处理流程可以整理为:初始化游戏,接收用户输入,游戏逻辑处理,屏幕显示输出。具体流程如下图所示:

游戏处理流程图

用户输入和刷新显示屏幕的处理过程会自动放入事件处理线程中运行,改变各种角色动作的参数和改变图像的位置和形态的代码放入由用户创建的新线程中运行,并且它们在用户线程中周期性地执行。

五.游戏框架            

游戏程序的框架实质上就是指游戏引擎,无论游戏的大小,都要有游戏引擎起控制作用。简单的来说,游戏引擎就是用于控制所有游戏功能的主程序,从计算碰撞、物理系统和物体的相对位置,到接受玩家的输入,以及按照正确的音量输出声音等。游戏框架打好后,就意味游戏引擎的完成,游戏引擎的完成就意味整个游戏基本成型。游戏引擎的结构各不相同,不过基本上都是在一个游戏主循环内实现。程序里面的主循环包含了程序框架的最主要的结构体。J2ME的程序一般都包含两个类,一个是MIDlet,一个是Canvas。一般都是把游戏的主要代码放在Canvas这个类里面。这个类是基于事件驱动的程序,有三个主要相应函数void paint(Graphics g), void keyPressed( int keyCode), void keyReleased( int keyCode)。众所周知, Java语言在语言的低层就支持多线程,Java中可以使用两种方式来实现多线程操作,这两种方式依次是: (1)继承Thread类或实现Runnable接口; (2)就是java. util包中的TimerTimerTask类。

下面给出一个通用的游戏框架:

游戏通用框架

其中SplashForm显示进入游戏前的欢迎画面,MenuForm管理菜单操作,

InstructionForm显示游戏的介绍及帮助信息,HscoreForm显示高分记录信息,

GameOverForm显示游戏结束信息,GamePlayForm为游戏运行的主界面,负责游戏的内部逻辑处理,GameMIDlet作为一个状态机来管理系统各个界面之间的调度切换。

六.手机游戏程序设计

6.1 MIDP高级界面开发

       高级界面开发类Screen类共有4个继承它的子类,分别是AlertForm,List,TextBox,这四个子类本身就是屏幕类,可以直接在屏幕上显示。其中Alert是用来显示提示信息的屏幕类,List是用来显示列表的屏幕类,TextBox是用来输入文字信息的屏幕类。Form屏幕类被设计成可以包含多个不同类型的控件,使用Form类可以管理屏幕上的Item控件,基本的Item控件有ItemimageimageItemstringItemTextField,dataField,ChoiceGroup。在MDIP2.0中开发平台中,Form类新增加了CustomItem类和Spacer类。

6.2 MIDP低级界面开发

       正如高级界面屏幕类都是继承Screen类,低级界面屏幕都是继承一个名为Canvas的屏幕类。Canvas类提供了一系列键盘低级事件和绘图接口,据图绘图的操作则有一个名为Graphics的图形类来完成。 Canvas的中文意思是画布,既表示可以在它上面绘制不同的图案。因此Canvas本身提供了一个绘图接口函数Paint(Graphics g),凡是继承Canvas的类都必须实现Paint函数,因此可以在Paint函数中实现屏幕的绘画代码。因此继承canvas的继承类的程序结构如下所示:

 Class MyCanvas extends Canvas

 {

 ......

 protected void paint(Graphics g)

 {

 ......

 }

…..

 }

6.3 MIDP2.0游戏开发包

MIDP2.0的众多新特性中,最重要的一个便是新增加的游戏开发包。由于移动信息设备通常仅有非常有限的计算能力,因此游戏开发包中提供了许多

能够提高Java游戏的性能的API,并且把原来很多需要手动编写的代码如屏幕

双缓冲、图像剪裁等都交给API间接调用本地代码来实现,加上各个设备厂家

有相当大的自由来对其进行优化,所以在MIDP2.0下游戏程序的性能比MIDP1.0

版本的有了更加优秀的表现。游戏开发包的推出简化了游戏开发的复杂,提高

了游戏的效率,并为游戏开发者提供了更多的灵活性。目前市场上已经有多款

支持MIDP2.0的手机,如SonyEricssonW700MOTO E680Nokia 3250等等。

MIDP游戏开发包,放在javax.microedition.lcdui.game中,其包结构非常简洁,由GameCanvasLayerLayerManagerSpriteTiledLayer五个类组成,如下图所示:

MIDP游戏开发包

1.GameCanvas:该类是javax.microedition.lcdui.Canvas类的子类,提供了基本的游戏用户接口。GameCanvas除了从Canvas继承下来的方法外,还提供了专门针对游戏的功能,例如键盘状态查询功能、利用双缓冲同步屏幕图像输出功能等,这些功能都极大的简化了游戏开发工作并提高了程序运行的性能。

2.Layer:该类是一个抽象类,代表游戏中的一个可视化元素,SpriteTiledLayer都是它的子类。这个抽象类搭好了层(Layer)的基本框架并提供了一些基本的属性,如位置,大小,可视与否。出于优化的考虑,不允许直接产生Layer的子类(不能包外继承),另外Layer的子类必须实现一个paint(Graphics)方法,使得它们能够被渲染。

3.LayerManager:该类是用于管理游戏中的层次(Layer的子类),LayerManager通过实现分层次的自动渲染,实现期望的图像视觉效果,从而简化了游戏开发。开发者可以通过设置一个可视窗口(ViewWindow),来控制用户在游戏中的可视范围。

4.Sprite:该类是Layer的子类,中文通常翻译为“精灵”,在游戏中通常用于显示一帧或多帧的连续图像,而且所有的帧都是相同大小的,并且由一个Image对象提供。Sprite可以通过控制来显示其中的任意一帧,从而实现任意顺序的动画;Sprite类还提供了许多变换(翻转和旋转)模式和碰撞检测方法,能大大简化游戏逻辑的实现。

5.TiledLayer:该类也是Layer的子类,TiledLayer又称“砖块”,这个类允许开发者在不必使用非常大的Image对象的情况下创建一个大的图像内容。TiledLayer有许多单元格构成,每个单元格能显示由一个单一Image对象提供的一组贴图中的某一个贴图。单元格也能被动画贴图填充,动画贴图的内容能非常迅速地变化;这个功能对于动画显示非常大的一组单元格非常有用,例如一个充满水的动态区域。通常游戏中的地图场景都是用这样的技术来设计实现的。

七.游戏开发核心技术

7.1多线程技术

众所周知, Java语言在语言的低层就支持多线程,Java中可以使用两种方式来实现多线程操作,这两种方式依次是: (1)继承Thread类或实现Runnable接口; (2)就是java. util包中的TimerTimerTask类。

7.2双缓存技术

在游戏中,当角色在一定的场景中有动作时,如行走。就要用背景擦除角色,然后在另外一个位置重画角色,这样在某一瞬间,可能在角色的位置看到背景。由于这发生在瞬间,所以会出现闪烁。用双缓存技术可以消除动画闪烁。缓存区是绘图时使用的屏外内存区。使用双缓存不是直接绘制屏幕,而是绘制到后缓存区,然后将整个缓存区复制到屏幕上,后缓存区只是普通的图像环境。

3.GameCanvas

       2D游戏开发的基本思想是游戏界面有多个图形层次组成,例如游戏背景可以在一个图形层次上,而游戏任务可以在另一个图形层次上。每一个图形层次都可以分别使用Layer控制。而Layer类包含了制作游戏背景的TiledLayer和制作游戏精灵的Sprite类。由于一个界面的图形层次可能不仅仅局限在两个层次上,可能背景本身就是由多个层次的图形构成的,所以处理多个图形层次是有LayerManager类负责。

4.数据存储

       数据存储技术是游戏开发中一项重要的技术,在游戏程序中通常都有一些

配置信息需要保存,例如:游戏难度设置、控制设置和高分记录等等。在J2ME

中实现这些都需要用到持久性存储-即记录管理系统(Record Management

SystemRMS)。

八.关于3D手机游戏开发

       MIDP 2.0 3D游戏开发API式有JSR-184包提供的,在进行3D游戏开发的时候需要引入JSR-184开发包。JSR-184开发包是为通用的支持Java技术的各种移动设备提供开发3D图像而设计的,但是由于是为移动设备提供的,所以被设计成轻量级别。正如2D游戏开发需要图片资源一样,3D游戏的开发也需要3D模型的资源,即使用一些3D模型或者3D动画编辑工具提前创建了3D动画所需要的模型数据,JSR-184支持的3D数据的文件是后缀名为.m3g的文件。这种资源文件可以使用一些3D工具生成,比如3D max等。

       3D动画的创建本身就是及其复杂的,需要处理建模,渲染,光线来源等多方面的内容。而3D游戏的开发需要处理大量的3D动画,因此开发过程也是非常复杂的。

 

结束语

      关于手机游戏开发的东西很多,不能逐一介绍,只能将一些核心的东西。建议几本书籍:

       《精通Java手机游戏与应用程序设计》

J2ME手机游戏开发技术详解》

posted on 2010-03-18 21:14 landon 阅读(4313) 评论(5)  编辑  收藏 所属分类: Program

FeedBack:
# re: 基于J2ME手机游戏开发项目总结和心得
2010-03-19 12:11 | lovo罗莱家纺
的么你发的你发给  回复  更多评论
  
# re: 基于J2ME手机游戏开发项目总结和心得
2010-03-19 18:36 | landon
没看懂。@lovo罗莱家纺
  回复  更多评论
  
# re: 基于J2ME手机游戏开发项目总结和心得
2010-03-22 16:23 | landonlv
对方开始的发生?@乐蜂精油专卖店
  回复  更多评论
  
# re: 基于J2ME手机游戏开发项目总结和心得[未登录]
2014-04-01 22:32 | 无风
大学学习中,作为了解..  回复  更多评论
  
# re: 基于J2ME手机游戏开发项目总结和心得[未登录]
2014-04-01 22:33 | 无风
大学中,有J2ME课程,作为了解  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: