背景是游戏比较不重要但又不可或缺的一部分。这个游戏中需要有一个由上往下卷动的背景(就像游戏厅里所有的飞行射击游戏一样)。在MIDP2.0里,game包里新增的一些类型极大的方便了画面的制作(详见wireless toolkit 的api文档)。
LayerManager
顾名思义,图层管理。即把若干个图层叠加在一起,上层的覆盖下层的。LayerManager规定index号为0的为最上层,然后index号累加,号码越大的越“背景”。
用法:
1. 添加图层:
LayerManager layManager = new LayerManager();
layerManager.append(layer0);//第0层
layerManager.append(layer1);//第1层
最早添加的在最上层。
2. 变动每个图层:
此时每个图层上的图像的相应坐标原点就是layerManager的左上角而非屏幕了。
3. 画图:
在画图函数中直接写layerManager.paint(g,0,0);这样的句子,就分别把图层画出来了,不再需要一个一个图层自己画。
用LayerManager的好处是方便(显然),并且所有的图层位置直接和背景相关,更符合实际也更便于计算和管理。
TiledLayer
移动设备存储空间有限,不可能为游戏存储一幅一幅的背景,于是把相同的背景元素提取出来,然后根据需要在各个位置画不同的元素来组成一幅画——就像星际的地图编辑器,地形一共也就那么几种,地图就是各种地形像地砖一样拼凑起来的(tiled)。具体用法见api文档。
卷屏:
有了上面这两个东西,实现卷屏就简单了。先设计一个地图(由数字组成,表示每个地方放哪一个标号的地形元素),再在每帧设置背景层的位置(卷动):
int[][] map = { { 0, 0, 0, 0, 0, 0 }, { 3, 0, 0, 0, 0, 0 },
{ 6, 0, 0, 0, 0, 0 }, { 6, 0, 0, 0, 1, 2 },
{ 6, 0, 0, 0, 4, 5 }, { 6, 0, 0, 0, 7, 8 },
{ 6, 0, 0, 0, 0, 0 }, { 9, 0, 1, 2, 3, 0 },
{ 0, 0, 4, 5, 6, 0 }, { 0, 0, 7, 8, 9, 0 },
{ 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0 }, { 3, 0, 0, 0, 0, 0 },
{ 6, 0, 0, 0, 0, 0 }, { 6, 0, 0, 0, 1, 2 },
{ 6, 0, 0, 0, 4, 5 }, { 6, 0, 0, 0, 7, 8 },
{ 6, 0, 0, 0, 0, 0 }, { 9, 0, 1, 2, 3, 0 },
{ 0, 0, 4, 5, 6, 0 }, { 0, 0, 7, 8, 9, 0 },
{ 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0 }, { 3, 0, 0, 0, 0, 0 },
{ 6, 0, 0, 0, 0, 0 }, { 6, 0, 0, 0, 1, 2 },
{ 6, 0, 0, 0, 4, 5 }, { 6, 0, 0, 0, 7, 8 },
{ 6, 0, 0, 0, 0, 0 }, { 9, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0 }, { 3, 0, 0, 0, 0, 1 } };
public void tick() {
scrollTerrain();//卷动
}
private void scrollTerrain() {
if (terrainScroll < 0) {
terrainScroll += 2;
terrain.setPosition(0, terrainScroll);//通过设置位置来卷动。
}
}
源码打包:http://www.j2medev.com/bbs/dispbbs.asp?boardid=11&id=4028&star=1#21355