MIDP 2.0 为移动开发者带来几项新特性,比如支持媒体、更好的用户界面、新的连通协议、enabled push、空中下载和更好的安全性。然而一个最让人感兴趣的新特性就是GAME API。
这篇文章重点介绍GAME API里的新类和它们的用法,开发环境使用J2ME Wireless Toolkit 2.0 Beta。
The Game API
The Game API 帮助开发者(游戏开发者或其他想得到更好用户界面的人)快速开发有较好可用性且节约设备资源(比如内存)的用户界面。The Game API也有利减小jar文件的大小。在MIDP 1.0中,开发者必须写自己的绘图程序来得到好的效果,这导致jar文件的增大。使用MIDP提供的程序可以得到较好的效果并且减小jar文件的大小,因此开发者应该信任所有支持MIDP 2.0 GAME API的设备。
JAVA手机网[www.cnjm.net]
Game API的基本概念是game screen包含了layers,背景在一个层上,道路在一层上,而英雄
的配角在其他层上。所有这些层能被分别的操作。API甚至允许直接在层上绘图。因此游戏区域也比screen大很多,并且在游戏代码卷屏也成为可能。The Game API提供一个观察窗口,它能观察整个游戏区域。这个窗口能很容易的被移动,观察窗口上的点可以对于实际屏幕上点。
The Game API能在javax.microedition.lcdui.game中找到。API中有5个新类,它们是:GameCanvas, Layer, LayerManager, Sprite和TiledLayer.
GameCanvas是个抽象类,它提供了游戏用户界面的基本。它比Canvas有2点益处。它拥有off-screen buffer;它能得到设备物理键的状态
Layer是个抽象类。它能描绘从Layer继承来的game.Sprite和TiledLayer元素。Layer通常被用做它自己的子类。
LayerManager是管理几个层物体并将它们绘到屏幕上的类。
Sprite是一个能包含存储在一个image里几帧的类。例如一个image包含4个图片表示运动的小狗。Sprite能用image的一部分表示一帧并构造一个显示序列来建立一个运做。它也被用来在其他Sprite或TiledLayer里检测碰撞。
TiledLayer有点象Sprite,但它主要用来显示背景、道路或其他大的区域。TiledLayer由单元网格组成,它能被图片和标题填充。因此背景要由
处理用户输入
在MIDP 2.0里处理用户输入和1.0里有少许的不同。在1.0里你能用getGameAciton()方法来得到游戏动作。但在2.0里你要用getKeyStates()方法来得到按键状态。下面的代码显示了怎么样做,首先我们通过检测变量keyState得到4个按键(up,down,left,right)的状态并做我们想做的。
protected void keyPressed(int keyCode) {
int move = 0;
int keyState = getKeyStates();
if ((keyState & LEFT_PRESSED) != 0) {
JAVA手机网[www.cnjm.net]
// do something
}
JAVA手机网[www.cnjm.net]
if ((keyState & RIGHT_PRESSED) != 0) {
// do something
}
if ((keyState & UP_PRESSED) != 0) {
// do something
}
JAVA手机网[www.cnjm.net]
if ((keyState & DOWN_PRESSED) != 0) {
// do something
}
}
使用off-screen buffer
使用off-screen buffer很容易创建无闪烁的动画而开发者不用额外的图形对象去建立两个缓冲。在GameCanvas里的off-screen buffer提供一个off-screen图形物体,它能被用来绘象素或层或sprites到canvas上。当有任何东西被绘的它都能立即被更新。
JAVA手机网[www.cnjm.net]
在下面的代码中getGraphics()方法被用来得到off-screen buffer。在循环里,buffer被用来绘LayerManager(layers object)的内容。当调用flushGraphics()方法时buffer被更新。这儿也有flushGraphics(int x,int y,int width,int hight)方法,被用来刷新特点范围的off-screen buffer。
public void run() {
JAVA手机网[www.cnjm.net]
Graphics g = getGraphics();
while (play) {
try {
// First draw all the layers
layers.paint(g, 0, 0);
// If the game is on, flush the graphics
if (play) {
flushGraphics();
}
JAVA手机网[www.cnjm.net]
try {
mythread.sleep(sleepTime);
JAVA手机网[www.cnjm.net]
} catch (java.lang.InterruptedException e) {}
} catch (Exception e) {
JAVA手机网[www.cnjm.net]
e.printStackTrace();
}
}
}