己的功能键标签。
7 MIDlet国际化
你有可能需要把你的MIDlet国际化--例如,用于不同的地区和语言。MIDP的系统属性"microedition.locale"定义了设备的当前区域。它的值可以使用System.getProperty.方法取得。MIDP规范允许在这个系统属性中使用一个空值。然而,在Nokia的MIDP实现中是不允许空值的。CLDC的系统属性"microedition.encoding"定义了设备的默认字符编码。它的值可以使用System.getProperty方法取得。
想要了解更多MIDlet本地化问题,可以参阅《Writing World Aware J2ME Applications》http://wireless.java.sun.com/midp/ttips/worldaware/ 的资源包。目前在MIDP中还没有一个标准机制用来处理资源包。这个文档使用一种简单的途径把用户界面文本从主程序中分离出来。它在Resource 类(二、9节)中被处理。
把国际化特色加入一个MIDlet非常重要,但是这可能会增加你的MIDlet的大小。如果MIDlet大小对于某种特定MIDP设备来说是一个问题,那么你可能希望产生好几个不同编译版本的MIDlet。每个版本可以为一个或多个区域、语言本地化。
8 设备特性:声音、振动和灯光
如果你使用Nokia用户界面应用编程接口类Sound或DeviceControl(振动、灯光),你应该提供一个Options或Settings菜单和一个设置编辑器,来允许最终用户启动或者取消这样的设置。
然而,如果你使用Nokia用户界面应用编程接口类Sound或DeviceControl(振动、灯光)并且通过设置JAD参数<>来把你的
游戏安装到Games菜单(见一、11节),Games菜单中已经提供的设置允许最终用户启动或者取消这些特性。因此应用程序没有必要自己创建这样一个特性。除Nokia UI API技术文档之外,你还可以参考《Nokia UI API Programmer ' s Guide》,它能提供很多有用的信息。
9 设备无关性
Nokia MIDP设备可能在屏幕尺寸、键盘布局和可用API等方面不同。为了创建可移植的
游戏,在设计
游戏时,这些差异应当被考虑在内。
应用程序应该向系统询问屏幕的尺寸,并且避免绘制屏幕内容的时候硬编码坐标。可以使用Canvas类的getHeight和getWidth方法来达到这个目的。
不同的Nokia MIDP设备中应用编程接口变化很大,开发者应该检查所要开发的设备平台上的应用编程接口。这是可以做到的,振动就是一个很好的例子。
|
try{ Class.forName("com.nokia.mid.ui.DeviceControl"); } catch(ClassNotFoundException e){ //Can't use vibration because the API //is not supported in the device } |
使用继承于默认MIDP Canvas类的游戏屏幕代替厂商特定的FullCanvas类,这有助于提高你的MIDlet的可移植性;然而,那就不可能实现全屏幕了。
10 最优化
MIDP设备的内存非常有限,所以使用内存时应格外小心。对于游戏来说一个很重要的限制就是有限的堆内存(heap memory):为了节省堆内存,对象引用不再需要被设置为"null",以便这些对象可被垃圾-收集(garbage-collected)。彩屏手机需要更多的内存来处理应用程序中的位图,这与更大的屏幕位深度和相关的内部数据结构有关。因此,虽然一个应用程序可能编写来使用在一个黑白屏幕的手机上,但是在彩屏手机上使用时,它可能消耗更多动态内存:就Nokia 7210来说,它显示一幅图片时比Nokia 6310i多用16倍的内存。
开发者应该在设计应用程序时考虑到这个因素,应该把同时加载的图片数降到最少的程度。例如,闪动屏幕图像应该能够在游戏图形图象创建之前被垃圾收集(通过设置所有到图像对象的引用为"null")。
11 安装
默认情况下MIDlet被安装到Nokia设备的Applications菜单下。如果设备有Games菜单的话,MIDlet还可以通过设置MIDlet的.jad文件中的Nokia-MIDlet-Category:Game参数来安装到这个菜单下。
二、实现游戏的步骤
下图显示的是一个游戏MIDlet在成功安装和运行之后用户界面状态的典型的变化流程。我们想通过一个游戏者的视角来阐述开发移动游戏的过程。

图3 用户界面状态图表
1 开始游戏
在用户启动MIDlet之后,将显示游戏特定的闪动屏幕。闪动屏幕是FullCanvas的一个实例。它可用于显示一个公司的标志或者用动画形式介绍游戏。除了End键以外的所有键盘事件(MIDlet可用的)都可以跳过闪动屏幕并显示主菜单。还应该设置一个时间限定,能够在一定的时间过后自动跳出闪动屏幕进入游戏屏幕。
GameMIDlet类是游戏的基本类;它处理MIDlet的生命周期并且处理游戏显示。下面的代码是闪动屏幕和游戏MIDlet类的构架。
|
//Skeleton for the base class of game import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class GameMIDlet extends MIDlet { private Display display = null; //Splash screen that starts the application private SplashFullCanvas splash; public GameMIDlet() { splash = new SplashFullCanvas(this); } protected void startApp() throws MIDletStateChangeException { if (display == null) { display = Display.getDisplay(this); } //splash screen to the display setDisplayable(splash); } protected void pauseApp() { }
protected void destroyApp(boolean p0) throws MIDletStateChangeException { }
public void setDisplayable(Displayable dl) { display.setCurrent(dl); } }
//Skeleton for the splash screen in Nokia Java Game import javax.microedition.lcdui.*; import java.util.Timer; import java.util.TimerTask; import com.nokia.mid.ui.*;
public class SplashFullCanvas extends FullCanvas { private GameMIDlet parent = null; private MainMenu menu = null; private Timer timer = null; public SplashFullCanvas(GameMIDlet parent) { this.parent = parent; menu = new MainMenu( Resources.getString(Resources.ID_GAME_NAME), List.IMPLICIT, parent); startTimer(); } protected void paint(Graphics g) { //Do the splash screen here } protected void keyPressed(int keyCode) { timer.cancel(); timer = null; //All key events received set the main menu to the screen parent.setDisplayable(menu); }
//Timer for the splash screen. Main menu is set to the display //after 5 seconds. private void startTimer() { TimerTask task =new TimerTask() { public void run() { parent.setDisplayable(menu); } }; timer = new Timer(); timer.schedule(task, 5000); } } |