上次我們用Sprite實現了背景,但是這樣不便於通過地圖數據生成地圖。通常,游戲中的地圖都被分成NxN的方格,一般僅有幾種圖案。幸運的是,SUN在MIDP 2.0已經考慮到了游戲開發者需要的這個功能,TiledLayer便是通過貼圖實現的層,它的使用同樣異常簡單!
首先預備好我們需要的小塊區域,在坦克大戰的地圖中,一共有下面5種:
(注重這是放大的jpg格式,你需要處理成40x8的png格式)
分別是冰面,磚塊,巖石,河流,樹木,具體有什麼用玩過的肯定都知道,我就不多說了。
首先讀入Image:Image.createImage("/res/img/tile.png");
然後就可以創建TiledLayer了:new TiledLayer(4, 4, image, 8, 8);
前兩個參數指定NxN的方格數,後兩個參數指定方格大小(也不一定非得是方格),我們用8x8的大小,這樣讀入的40x8的png圖片便被分成了5個小塊,編號是1-5。為什麼不從0開始編號?因為0是用來表示透明塊的。
下面定義一個二維數組,表示地圖數據:
int[][] map = new int[][] {
{0, 0, 1, 4},
{1, 1, 2, 4},
{0, 1, 2, 4},
{0, 1, 1, 3},
};最後用TiledLayer.setCell(col, row, index);就給每個小塊貼上對應的圖片。假如index為0,則該小塊是透明的。
OK,我們把上次的spriteBackground改成layerBackground:
public class TankGameCanvas extends GameCanvas implements Runnable {
...
private TiledLayer layerBackground;
// ConstrUCtor and initialization
public TankGameCanvas() {
...
try {
layerBackground = new TiledLayer(22, 22, Image.createImage("/res/img/tile.png"), 8, 8);
int EMP = 0;
int ICE = 1;
int BRK = 2;
int ROC = 3;
int RIV = 4;
int TRE = 5;
// 地圖太大了!!!
int[][] map = new int[][] { // 22X22
{EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP},
{EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP, EMP},
{ROC, ROC, ROC, ROC, EMP, EMP, EMP, EMP, EMP, EMP, ICE, ICE, ICE, ICE, ICE, ICE, BRK, BRK, BRK, BRK, BRK, BRK},
{ROC, ROC, ROC, ROC, EMP, EMP, EMP, EMP, EMP, EMP, ICE, ICE, ICE, ICE, ICE, ICE, BRK, BRK, BRK, BRK, BRK, BRK},