1

ゲームでタイルの複数のレイヤーを描画しようとすると、一番上のレイヤーしか表示されないという、ちょっとした問題があります。たとえば、空気のタイルを描画する for ループがあり、その下に石のタイルを描画する別のループがあります。空気牌だけが引けるし、石牌は何をしても引けない。私のマップクラスは次のとおりです。

public class Map {

public static final int CLEAR = 0;
public static final int STONE = 1;
public static final int GRASS = 2;
public static final int DIRT = 3;

public static final int WIDTH = 32;
public static final int HEIGHT = 24;

public static final int TILE_SIZE = 25;

static ArrayList<ArrayList<Integer>> map = new ArrayList<ArrayList<Integer>>(WIDTH * HEIGHT);

Image air, grass, stone, dirt;

public Map() {

    for (int x = 0; x < WIDTH; x++) {
        ArrayList<Integer> yaxis = new ArrayList<Integer>();
        for (int y = 0; y < HEIGHT; y++) {
            yaxis.add(CLEAR);
        }
        map.add(yaxis);
    }

    for (int x = 0; x < WIDTH; x++) {
        ArrayList<Integer> yaxis = new ArrayList<Integer>();
        for (int y = 0; y < HEIGHT; y++) {
            yaxis.add(STONE);
        }
        map.add(yaxis);
    }

    try {
        init(null, null);
    } catch (SlickException e) {
        e.printStackTrace();
    }
    render(null, null, null);

}

public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {
    air = new Image("res/air.png");
    grass = new Image("res/grass.png");
    stone = new Image("res/stone.png");
    dirt = new Image("res/dirt.png");
}

public void render(GameContainer gc, StateBasedGame sbg, Graphics g) {

    for (int x = 0; x < map.size(); x++) {
        for (int y = 0; y < map.get(x).size(); y++) {
            switch (map.get(x).get(y)) {
            case CLEAR:
                air.draw(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE);
                break;
            case STONE:
                stone.draw(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE);
                break;
            case GRASS:
                grass.draw(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE);
                break;
            case DIRT:
                dirt.draw(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE);
                break;
            }
        }
    }
}

}

誰かが助けることができれば、それは素晴らしいことです!

4

1 に答える 1

0

ここに空気の列を追加してから、石の列を追加します。

for (int x = 0; x < WIDTH; x++) {
    ArrayList<Integer> yaxis = new ArrayList<Integer>();
    for (int y = 0; y < HEIGHT; y++) {
        yaxis.add(CLEAR);
    }
    map.add(yaxis);
}

for (int x = 0; x < WIDTH; x++) {
    ArrayList<Integer> yaxis = new ArrayList<Integer>();
    for (int y = 0; y < HEIGHT; y++) {
        yaxis.add(STONE);
    }
    map.add(yaxis);
}

問題は、石のタイルが予想されるマップ サイズ (32 x 24) から外れていることです。

リストのリストを配列に置き換えてみると、境界を超えていることがわかります。

編集:ランダムデータでマップを初期化する適切な方法は次のとおりです。

java.util.Random random = new java.util.Random();

for (int x = 0; x < WIDTH; x++) {
    ArrayList<Integer> yaxis = new ArrayList<Integer>();
    map.add(yaxis);
    for (int y = 0; y < HEIGHT; y++) {
        yaxis.add(random.nextInt(4));
    }
}

その後、タイルを追加するのではなく、値を変更するだけであることに注意してください。

map.get(10).set(5, CLEAR);
于 2012-11-10T12:51:42.587 に答える