您的位置:首页 > 编程语言 > Java开发

KJAVA MIDP 2.0: The Game API快速入门

2008-04-25 13:48 579 查看

MIDP2.0:TheGameAPI

byMikkoKontio
-01/09/2003翻译:bolowMIDP2.0为移动设备提供了众多新的特性,主要表现在媒体的支持,增强的Ui接口,更多的网络协议,OTA以及安全性等方面。然而最让我们感兴趣的是游戏API的新特性。本文意在通过一些例子来介绍新的游戏API类及其用法。例子调试环境为J2MEWirelessToolkit2.0Beta.
游戏API
游戏API帮助开发者(游戏开发者或者其他需要更好ui界面的开发者)帮助用户快速开发实用并且节省内存以及存储空间的程序界面。使用MIDP1.0Game开发者必须定义自己的一套图像类来获得好的界面及程序性能,这必然会增加程序存储方面的开销,使你的jar文件变得更大。新的游戏API可以解决这些问题。
游戏API的基本思想是游戏界面由图层组成。背景可以在一个图层上,而游戏人物可以在另一个图层上。每一个图层都可以分别被游戏API控制。按照经验,游戏的额场景通常会比手机的屏幕大,所以在传统的方法中控制屏幕的滚动是一件很痛苦的事情。新的游戏API一个新的观察窗口(viewwindow),通过它可以看到所有的游戏场景,并且它可以很容易的被移动很定位。
游戏API的路径为
javax.microedition.lcdui.Game
。这五个新的类是:
GameCanvas
,
Layer
,
LayerManager
,
Sprite
,
TiledLayer
.
GameCanvas
是一个提供了游戏的基本接口的抽象类。这个类与
Canvas
类相比有两个优点:1。它拥有屏幕缓冲,2。它可以直接得到设备键盘的物理状态。
Layer
是一个定义了游戏元素的抽象类。
Sprite
TiledLayer
继承了这个类。
Layer
是一个非常常用的类。
LayerManager
负责管理Layer对象,并且按照指定的顺序画他们。
Sprite
包含了若干帧图像的
Layer
。这些帧保存在Image对象中。通过
Sprite类我们可以只使用其中的部分帧,或者通过播放一个帧的序列来创建一个动画。
Sprite类还能检查它是否与其他的Sprite类
或者
TiledLayers
有重合。
TiledLayer
Sprite有点相似,但是它更多的被用来创建背景,比如赛道或者其他更大的区域。TiledLayer
包含一个表格(agridofcells),我们可以用图像或者文字来填充他。所以说一个背景或者一个场景是可以用一系列的小图片来创建的。
Handlinguserinput
MIDP2.0中,传递用户的输入与MIDP1.0有所不同.在1.0中你需要
Canvas的getGameAction()方法
来得到游戏中用户的按键。在2.0中你可以调用
GameCanvas
getKeyStates()
方法来直接得到键盘的状态。
下面是一个示例代码。首先我们得到键盘的状态
,然后通过bit操作判断方向键的状态后作出相应的响应。

protectedvoidkeyPressed(intkeyCode){
intmove=0;
intkeyState=getKeyStates();
if((keyState&LEFT_PRESSED)!=0){
//dosomething
}
if((keyState&RIGHT_PRESSED)!=0){
//dosomething
}
if((keyState&UP_PRESSED)!=0){
//dosomething
}
if((keyState&DOWN_PRESSED)!=0){
//dosomething
}
}
使用屏幕缓存
屏幕缓存(off-screenbuffer)使得用户可以很方便的创建无闪烁的动画,并且不需要创建额外的类来实现双缓冲。对象先被画到缓存中,准备好后在刷新到屏幕。
在下面的代码中
GameCanvas的
getGraphics()
用来的到一个显示缓存。在while循环中,缓冲用来绘制
LayerManager
(
layers
object)的组件.然后缓存被
flushGraphics()
方法刷新。调用
flushGraphics
(intx,inty,intwidth,intheight)方法可以只把指定的区域刷新到屏幕上。
publicvoidrun(){
Graphicsg=getGraphics();
while(play){
try{
//FirstdrawallThelayers
layers.paint(g,0,0);
//IfTheGameison,flushThegraphics
if(play){
flushGraphics();
}
try{
mythread.sleep(sleepTime);
}catch(java.lang.InterruptedExceptione){}
}catch(Exceptione){
e.printStackTrace();
}
}
}
使用图层
在一个游戏中(或者其他的图形程序),显示区域内通常包含不同的内容(图像可能是有关联的或者是没有关联的)。比如一只蜜蜂可以在森林,陆地,水面上飞翔,但是在一个迷宫中人却不能穿越围墙。
MIDP2.0游戏API为此引进了图层。图层提供了控制屏幕上的对象或者上下文的方法。图层可以是
TiledLayer
(比如背景),
Sprite
(比如飞机),或者通过继承
Layer类自定义的类
.
下面代码是对图层使用的示例,本例中最重要的类是
TiledLayer
,
LayerManager
,以及
Image
.
Image
是用来保存具有相同大小的图像或者图象元素的类。
TiledLayer
使用这些图像来布置背景

TiledLayer的实例被创建以时,
构造方法要求五个参数,列数,行数,图像,图像元素的宽度和高度。这里的例子中背景表格包含40行,16列,图像时
Tiles.png
并且长宽都是7。代码开头的一些常量(TILE_GROUNDetc.)表示对图像元素的引用。
TiledLayer
实例被创建后,图像元素的表格可以用
fillCells()方法来填充或者fillCell()
来填充。在代码的最后
TiledLayer
被加入到
LayerManager
.
append()
方法用来把图层加入到观察窗口最下面。使用
insert()可以把图层插入到指定位置。

privateTiledLayertiles;
privateLayerManagerlayers;
privateImagetilesImage;
publicfinalintTILE_GROUND=1;
publicfinalintTILE_WATER=2;
publicfinalintTILE_SHORE_LEFT=3;
publicfinalintTILE_FOREST=4;
publicfinalintTILE_AIR=5;
publicfinalintTILE_SHORE_RIGHT=5;
//...
//CreatinganinstanceofTheTiledLayer
layers=newLayerManager();
try{
tilesImage=Image.createImage("/Tiles.png");
}catch(IOExceptione){}
tiles=newTiledLayer(40,16,tilesImage,7,7);
//...
//FillingTheTiledLayerwithtiles
tiles.fillCells(0,0,40,16,TILE_AIR);
tiles.fillCells(14,12,12,4,TILE_WATER);
tiles.fillCells(0,10,14,6,TILE_GROUND);
//andmoretileslikeFORESTandTheshores...
layers.append(tiles);
效果如下。

使用精灵
正如前面提到的那样,精灵被定义为屏幕上的一个单独的对象.这个对象可以是推石头的小人,一架正在射击的飞机。
Sprite
类的工作方式有点类似
TilesLayer
(实事上他们都是从
Layer类继承来的
).
Sprite
也拥有一个包含几副等大小的图像的Image对象。但是这些图像与组成背景的图像元素不同,他们是表现游戏主角的动画的帧。因此精灵可以拥有动画效果,并且通过更换其中的一些帧就可以轻松改变精灵的形象。
下面代码展示了怎么创建一个
Sprite
的实例。原理其实和
TiledLayer一样
.
try{
spriteImage=Image.createImage("/Sprite.png");
}catch(IOExceptione){}
sprite=newSprite(spriteImage,7,7);
Layer
类中的以下两个方法可以轻松的控制精灵的移动:
move(intdx,intdy)
setPositions(intx,inty)
通过
LayerManager来控制精灵的移动,绘制使非常方便的
。下面的代码展示了怎样去控制一个精灵的移动。精灵的大小为7×7,并且每次移动的幅度也是7个象素
publicstaticfinalintUP=0;
publicstaticfinalintRIGHT=1;
publicstaticfinalintDOWN=2;
publicstaticfinalintLEFT=3;
//...
switch(direction){
caseUP:
sprite.move(0,-7);
break;
caseDOWN:
sprite.move(0,7);
break;
caseRIGHT:
sprite.move(7,0);
break;
caseLEFT:
sprite.move(-7,0);
break;
default:break;
}
游戏编写中还有一个重要的任务就是发现精灵间的碰撞。精灵可能必须呆在某个游戏区域或者指定的迷宫,同时判断精灵间的相互碰撞也是非常重要的。碰撞在有的游戏中意味着转换方向,有时候却意味着Gameover
Sprite
提供了以下四个方法,使我们可以对精灵的碰撞作出判断:
collidesWith(Imageimage,intx,inty,
booleanpixelLevel)
collidesWith(Sprites,booleanpixelLevel)
collidesWith(TiledLayert,booleanpixelLevel)
defineCollisionRectangle(intx,inty,
intwidth,intheight)
当两个
Sprite的实例
(也可以时
TiledLayer
Sprite
Image
)碰撞或者说重合时,我们可以对此作出响应。
结束语
本文结合几个例子介绍了MIDP2.0中最常用游戏API的新特性,有了这些特性,开发者不但可以方便的控制比屏幕大的游戏区域的绘制,而且可以方便的在不同图层上绘制物体。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: