本讲视频地址:http://www.verycd.com/group/@u3138685
搭建开发平台
J2ME针对手机游戏开发是在CLDC、MIDP的配置和简表之上的。实际上可以简单理解为CLDC是一种标准,提供了一套基本类库;MIDP是针对手机开发的通用标准,提供了一套功能类库。如果要在PC上完成手机游戏的开发必须要安装KVM和模拟器。可能有些公司在面试一个手机游戏开发人员的时候会问到这个问题,就是虚拟机和模拟器的区别,实际上虚拟机是一个抽象平台如JVM、KVM,而模拟器是某种设备在PC上的模拟比如FC模拟器、GBA模拟器、某款手机在PC上的模拟器。
开发游戏之前,首先准备一下自己的开发环境。开发手机游戏对PC的要求不高,内存128MB、硬盘空间500MB以上就足以用来开发了。另外本书所有的开发工具都是免费的,只需要到官方网站下载,本书附带的光盘上也提供了相关文件。
1. 准备开发环境
开发工具:
l J2SDK1.4 下载地址 http://Java.SUN.com/
由于模拟器需要J2SE虚拟机支持,因此需要下载并安装J2SE,并且要首先安装J2SE,再安装J2ME平台。
l WTK2.2 下载地址 http://Java.SUN.com/
该平台包含了CLDC、MIDP的类库、开发环境、模拟器、调试打包工具等,而且包含了MIDP和CLDC的所有开发API文档。
2. 建立开发环境
J2ME的开发离不开JDK,Java基础部分已经已经在前面介绍过很多,JDK的安装在这里就不再赘述了。
SUN为J2ME开发提供的WTK,是最基本的开发工具。它是免费提供的,体积小、执行速度较快,完全遵守J2ME的各种规范,因此是J2ME程序员最基础的工具,也是必备的工具。
使用WTK搭建J2ME的开发环境,必须首先安装标准的Java开发环境JDK,例如jdk1.4,然后可以安装WTK。目前SUN提供的WTK版本有WTK 1.04、WTK 2.0、WTK 2.1和WTK 2.2,开发人员通常可以根据自己的目标选择安装其中之一,其中WTK 1.04用于MIDP 1.0的开发,而WTK 2.0则用于MIDP 2.0的开发,而WTK 2.1和WTK 2.2则同时包含了对MIDP 1.0和MIDP 2.0的支持。
1)安装WTK
正确安装JDK后,就可以安装J2ME_wireless_toolkit,即WTK了(如图3-2所示)。与JDK类似,WTK也可以从SUN的网站中免费下载。
正如上面提到过的,WTK 1.04对应的是MIDP 1.0的开发,WTK 2.0则是对应了MIDP 2.0的开发,而WTK 2.1则同时包括了MIDP 1.0及MIDP 2.0的支持,但是他们的安装和使用都比较类似。
图3-2 WTK安装过程
2)安装后的目录结构
正确完成了以上步骤后,可以说这个基本的J2ME开发平台已经搭建完毕了。安装J2ME WTK以后,会产生如表3-2所示的目录结构。
表3-2 WTK安装目录
文件目录 | 描 述 |
appdb文件夹 | 一些WTK用到的图片文件 |
apps文件夹 | 里面有J2ME的一些例子程序,所有项目文件通常也存放在该文件夹。 |
bin文件夹 | 工具程序 |
docs文件夹 | 帮助文档 |
Lib文件夹 | MIDP,CLDC以及其他手机开发的库文件 |
WTKlib文件夹 | 存放J2ME的手机模拟器文件,以及一些资源文件,比如按钮的图标,等等 |
在这些文件夹中,apps文件夹特别需要留意,因为这个文件夹通常被用于保存开发人员建立的项目的开发文件。
如果开发人员建立一个新的项目,那么通常可以放在apps文件中,作为一个独立的文件夹,它里面又包含一些子文件夹,每个文件夹就是一个J2ME的项目,每个项目包含一系列的文件,如表3-3所示:
表3-3 一个项目包含的文件夹
文件目录 | 描 述 |
bin | 存放项目的打包输出文件 .jad .jar |
classes | 存放编译器产生的class文件 |
lib | 存放该应用请求的外部类库 |
res | 存放资源文件,例如项目中用到的文本、图片、声音 |
src | 存放项目的源代码 |
tmpclasses | 存放编译器产生的class文件 |
tmplib |
|
3)手机模拟器
J2ME WTK本身提供了多种模拟器,例如:Default Color Phone、Default Gray Phone、Minimum Phone、Motolola i85s、PalmOS Device、RIM Java Handle等。这些模拟器虽然外观不一样,操作也不太一样,但是J2ME程序在其上运行的结果是类似的,与真实设备上的运行效果也基本相同,这体现了Java的跨平台特性。
除了WTK本身提供的模拟器之外(如图3-3所示),某些厂商也提供自己的模拟器,这需要额外安装。此外,开发人员还可以自定义一个手机模拟器,这在J2ME WTK的User Guide中有详细的描述。
图3-3 WTK选择模拟器
在J2ME WTK中,可以设定缺省的模拟器,只需从【开始】菜单选择【J2ME WTK】→【Default Device Selection】,在下拉列表框中选择模拟器的名字,然后单击OK按钮即可。此后J2ME WTK就会把这种模拟器认为是默认的模拟器。
可以在开发环境中每次手动选择模拟器,不过这样做比较麻烦。J2ME WTK初始默认的模拟器是Default Color Phone,这是一种虚拟的彩色屏幕手机设备。
J2ME 的WTK在开发中的作用就如同JDK在J2SE开发中的作用,提供了基本的开发库及工具。同样,WTK也不提供文本编辑功能,可以采用操作系统本身的写字板编辑源代码,也可以采用一些流行的第三方文字编辑器,如Ultraedit,Editplus等。
安装完成WTK马上要做的事情就是检测是否安装正确,最简单的办法是启动开发环境从【开始】菜单选择【J2MEWTK】→【Ktoolbar】,然后从菜单中选择 【文件】à 【打开项目】,选择一个项目名称然后确定,再单击工具菜单栏上的运行命令,如果WTK安装成功,就可以自动启动默认的模拟器来运行这个J2ME项目(如图3-4所示)。
3.1.3 程序的生命周期
首先,介绍一下MIDlet的生命周期,如果掌握了MIDPlet的生命周期,就会对MIDPlet的API结构有一个很清楚的认识了。
Java应用管理器(JAM)是管理Java 应用的机制。JAM的规范主要由目标环境决定,与Java规范无关。其功能包括:鉴定概要、解析AD(应用描述文件)、应用安装、应用更新、应用列表、应用执行和TCK支持。
JAM还管理JAR文件和ADF文件。JAR是Java应用档案文件,JAD是JAVA应用描述文件。此外,JAM还有管理Java虚拟机的功能。虽然在程序当中不和JAM打交道,但是应该知道JAM的存在以及它的作用。
当Java应用管理器将MIDlet装载进来,会生成一个MIDlet对象实例。该对象的生命周期完全由Java应用管理器控制,在需要改变MIDlet对象状态的时候,由Java应用管理器会调用MIDlet中对应的函数对这个对象进行控制。如果对象的状态转换发生错误,对象会抛出MIDletStateChangeException异常。
图3-5就是MIDlet对象的各种状态之间的转换:
destroyApp () |
JAM构造实例 |
暂停状态(Paused) |
运行状态(Actived) |
中止状态(Destoryed) |
startApp() |
pauseApp() |
destroyApp () |
图3-5 MIDPlet各种状态之间的转换
当JAM需要改变MIDlet状态的时候,需要调用对应方法,在方法调用成功以后,MIDlet的状态最终才会发生改变。
除了JAM可以改变MIDlet的状态,MIDlet自身也可以调用一些方法,改变自身的状态,然后再通过notify的系列函数通知JAM,MIDlet的状态需要进行改变。
图3-6是MIDlet改变自身状态的方法:
notifyDestroyed () |
暂停状态(Paused) |
运行状态(Actived) |
中止状态(Destoryed) |
resumeRequest() () |
notifyPaused () |
notifyDestroyed () |
图3-6 MIDlet改变自身状态的方法
从上面的两个图中,可以清楚地看到一个MIDlet对象有三种状态,分别是:运行状态、暂停状态和中止状态。
JAM通过调用startApp()函数使MIDlet进入到开始状态,也就是说让游戏进入开始状态;JAM通过调用pauseApp()使MIDlet进入暂停状态;通过调用destroyApp ()使之停止。
需要注意的是,和标准的Java应用不同,MIDlet不允许直接调用System.exit()或Runtime.exit()来结束MIDlet,这种方式会引起Java的安全异常。当MIDlet需要自己结束生命周期的时候,首先调用destroyApp(),然后通过notifyDestroyed()通知JAM结束MIDlet的运行。
3.1.4 第一个J2ME程序
进入Ktoolbar后不仅可以编译、运行旧的项目,也可以创建新的J2ME项目,在Ktoolbar中创建的项目会自动加载MIDP、CLDC的类库到项目中。首先需要单击【新建项目】,屏幕会弹出向导窗口(如图3-7所示)。在该窗口中输入项目的名称和MIDlet类名(入口类的类名),比如将项目名字设成First ,MIDlet类名设成myMIDlet(注意这里不需要写扩展名)。
图3-7 新建项目窗口
然后单击【产生项目】命令,在新的窗口要求设置MIDP和CLDC的版本,这里直接使用默认值,单击【确定】命令,系统会自动在WTK的APPS目录下创建名为 First的文件夹,在这个文件夹下面的src目录中,创建文件myMIDlet.Java 的代码如下:
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
//J2ME的入口类必须要继承Javax.microedition.midlet.MIDlet
public class myMIDlet extends MIDlet{
private Display display;//可以理解为屏幕控制对象
//构造函数
public myMIDlet(){
display = Display.getDisplay(this);
System.out.println("这里初始化");
}
public void startApp(){
System.out.println("这里开始了程序.");
Form f = new Form("J2ME学习网");//创建屏幕对象
f.append("www.IJ2ME.cn"); //向屏幕中增加文字
display.setCurrent(f);//显示这个屏幕
}
public void pauseApp(){
System.out.println("来电话了程序暂停.");
}
public void destroyApp(boolean unconditional){
System.out.println("程序退出.");
}
}
单击Ktoolbar中的【编译】命令,系统会自动编译myMIDlet.Java 生成myMIDlet.class在项目的class目录下。如果没有错误,单击【运行】编译该程序后运行,控制台上就会依次输出:
这里初始化
这里开始了程序.
退出该程序时,控制台就会输出:
程序退出.
手机模拟器会出现标题 “J2ME学习网”(如图3-8所示):
图3-8 第一个J2ME程序
Javax.microedition.midlet.MIDlet是一个抽象类,任何一个J2ME的程序入口都要是这个类的子类,它有三个抽象方法,分别是:startApp、pauseApp和destroyApp。任何入口类首先需要实现这三个抽象方法。当启动某个游戏时JAM会自动创建这个类的实例并调用这个类中的startApp方法,当在进行这个游戏时手机来电,JAM会自动调用这个类的pauseApp方法,当游戏退出时候JAM会自动调用destroyApp方法。
在程序的开头,定义了一个显示类(Display)。它是一个显示控制对象,代表了游戏显示屏和输入设备的管理器,包含用来获取手机属性的方法,以及请求要在手机上显示对象的方法。其他处理手机属性的方法主要用于Canvas对象,这些方法将在后面的课程中详细描述。对于Display,大家应该记住:
1) 一个MIDlet只能有一个Display实例,得到的方法是:
display= Display. GetDi splay (MIDlet对象);
2) Display可以设置手机当前的显示屏的对象,方法是:
display. SetCurrent (屏幕对象)。
在startApp函数中,首先实例化了一个Form。Form是一个屏幕对象,可以认为它是一个大面板,最后display.setCurrent(f)调用把Form设定为当前显示屏幕。
现在必须编译这个Java源文件。在J2ME编程中有一点是与J2SE是不同的,由于J2ME是一个微小版本,而且由于手机的性能和PC相比要差很多,所以去掉了很多J2SE中的API。为了检测代码编写的是否符合J2ME的规范,所以需要有一个预编译的过程。
(J2ME部分所有API手册使用在本书附带光盘)