使用层
在游戏里(或在绘图应用程序里)Screen经常由不同的物体组成,他们任何一个都可能和其他一个或几个有联系。举个例子,一只蜜蜂能在森林、陆地、水面和空中飞,但在迷宫里主角去不能穿墙。
在MIDP2.0 Game API里介绍了层,它提供了方法来管理物体或屏幕上的内容。层能够是TiledLayer(背景,墙)、Sprite(蜜蜂)或其他从Layer继承来的类。
下面的代码是把程序里不同的部分重叠在一起,如图所示来介绍Layer的用法。代码中重要的类是TiledLayer,LayerManager,Image。image类是保存几个相同大小图片的。TiledLayer使用这些图片把他们绘在栅格里。
JAVA手机网[www.cnjm.net]
当一个TiledLayer实例被创建时,构造函数需要5个参数。这些参数是列号、行号、图片、宽、高。在例子中,栅格有40列,16行,图片是Tiles.png,高和宽是7个象素。代码开始最后一个整数参考具体的用法。
在TiledLayer实例被创建后,调用fillCells()方法来填充栅格。在代码最后一行TiledLayer被加到LayerManage中。append()方法是观察者最大限度的安置layer。当然你可以用insert()方法插入你的layer在任何位置。
private TiledLayer tiles;
private LayerManager layers;
private Image tilesImage;
public final int TILE_GROUND = 1;
public final int TILE_WATER = 2;
public final int TILE_SHORE_LEFT = 3;
public final int TILE_FOREST = 4;
public final int TILE_AIR = 5;
public final int TILE_SHORE_RIGHT = 5;
// ...
JAVA手机网[www.cnjm.net]
// Creating an instance of the TiledLayer
layers = new LayerManager();
try {
tilesImage = Image.createImage("/Tiles.png");
} catch (IOException e) {}
tiles = new TiledLayer(40, 16, tilesImage, 7, 7);
// ...
// Filling the TiledLayer with tiles
tiles.fillCells(0, 0, 40, 16, TILE_AIR);
tiles.fillCells(14, 12, 12, 4, TILE_WATER);
tiles.fillCells(0, 10, 14, 6, TILE_GROUND);
// and more tiles like FOREST and the shores...
layers.append(tiles);
下面的图片显示整个屏幕的状态。
使用Sprites
如前所述,Sprites描绘了屏幕上的一个单一物体。这个物体可以是推石头的小孩、一个射击敌人的战舰。Sprite类的工作方式有点类似tilesLayer类(他们都是从Layer继承来的)。Sprites也可以将几个相同大小图片当作一个图片来显示,无论如何这些图片没有标题,他们是动画里的帧。Sprites可以是活动的,可以显示帧让它看起来是活动的。
下面的代码说明怎样创建一个Sprites的实例,这个正确的原则也适用于TiledLayer.
try {
JAVA手机网[www.cnjm.net]
spriteImage = Image.createImage("/Sprite.png");
} catch (IOException e) {}
sprite = new Sprite(spriteImage, 7, 7);
JAVA手机网[www.cnjm.net]
在Layer类里,有2种方法让Sprites在游戏区域里移动
move(int dx, int dy)
setPositions(int x, int y)
让LayerManage控制Sprites的绘制和移动是重要的,在代码里设置和存储Sprites也是很重要的。下面的代码说明了怎么样移动Sprites。Sprites里的图片是7个象素高宽的,因此Sprites每次移动7个象素。
public static final int UP = 0;
JAVA手机网[www.cnjm.net]
public static final int RIGHT = 1;
public static final int DOWN = 2;
public static final int LEFT = 3;
// ...
JAVA手机网[www.cnjm.net]
switch (direction){
case UP:
sprite.move(0, -7);
break;
case DOWN:
sprite.move(0, 7);
break;
case RIGHT:
sprite.move(7, 0);
break;
case LEFT:
sprite.move(-7, 0);
break;
default: break;
}
在游戏中另一个重要的就是判断碰撞。Sprites可以停留在游戏区域中一个特定位置,这对判断Sprites是否和其他物体碰撞是很重要的。在游戏里碰撞意味着改变方向或游戏结束。Sprites用下面4个方法帮助开发者判断碰撞:
collidesWith(Image image, int x, int y,
boolean pixelLevel)
collidesWith(Sprite s, boolean pixelLevel)
collidesWith(TiledLayer t, boolean pixelLevel)
defineCollisionRectangle(int x, int y,
int width, int height)
总结
这篇文章介绍了MIDP2.0里的一个新特性,Game API并给出了一个例子,它用到了API里的许多特性。这些可以帮助开发者应付游戏区域比屏幕大很多的情况,并可以在多个层上绘物体。
来自Wireless Toolkit 2.0 Beta的竞争者不很快,事实上这些特性中的一些使用起来仍然有点慢,但它带给我们基本的支持。重要的是这些已经被软件开发者开始设计。你不得不思考2次你想做什么;怎样做更好。最后没有平台和API提供坏的设计。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1645526