返回

如何在 LibGDX 程序生成的 TiledMap 中正确呈现多个切片图层?

java

## 如何在 LibGDX 中正确呈现程序生成的 TiledMap 中的多个切片图层

问题陈述

在使用 LibGDX 程序生成的 TiledMap 时,你可能会遇到这样的问题:无法呈现多个切片图层,只能显示第一个添加的图层。这可能是因为你在每个图层都使用了相同的 layer 变量,导致后面的图层覆盖了前面的图层。

解决方法

要解决这个问题,你需要为每个图层创建一个新的 TiledMapTileLayer 对象。以下是如何修改代码:

for (l = 0; l < mapLayers; l++) {
    TiledMapTileLayer layer = new TiledMapTileLayer(mapWidth, mapHeight, tileWidth, tileHeight);
    ...
    layers.add(layer);
}

这样,每个图层都有自己专用的 TiledMapTileLayer 对象,从而确保所有图层都能正确呈现。

优化

在优化方面,你可以避免在每个循环中创建新的 TiledMapTileLayer 对象。相反,可以在循环外创建这些对象,然后在循环中重新使用它们。这将提高代码的性能。

代码示例

以下是修改后的代码示例:

public static TiledMap GenerateWorld(int mapWidth, int mapHeight, int tileWidth, int tileHeight, int exponent, int mapLayers, String noiseType) {
    int x;
    int y;
    int l;

    tiles = new Texture(Gdx.files.internal("spriteAtlas.png"));
    TextureRegion[][] splitTiles = TextureRegion.split(tiles, tileWidth, tileHeight);

    map = new TiledMap();
    TiledMapTileLayer floorLayer = new TiledMapTileLayer(mapWidth, mapHeight, tileWidth, tileHeight);
    MapLayers layers = map.getLayers();

    x = 0;
    y = 0;
    // 生成地板层
    for (int i = 0; i < (mapWidth * mapHeight); i++) {
        Cell cell = new Cell();
        cell.setTile(new StaticTiledMapTile(splitTiles[1][0]));
        floorLayer.setCell(x, y, cell);
        x++;
        if (x == mapWidth) {
            y++;
            x = 0;
        }
    }

    layers.add(floorLayer);

    // 创建程序生成层的 TiledMapTileLayer 对象
    TiledMapTileLayer[] layerArray = new TiledMapTileLayer[mapLayers];
    for (l = 0; l < mapLayers; l++) {
        layerArray[l] = new TiledMapTileLayer(mapWidth, mapHeight, tileWidth, tileHeight);
    }

    for (l = 0; l < mapLayers; l++) {
        double[] noise;
        switch (noiseType) {
            case "perlin":
                noise = NoiseGenerator.normalise(NoiseGenerator.perlinNoise(mapWidth, mapHeight, exponent));
                break;
            case "smooth":
                noise = NoiseGenerator.normalise(NoiseGenerator.smoothNoise(mapWidth, mapHeight, exponent));
                break;
            case "turbulence":
                noise = NoiseGenerator.normalise(NoiseGenerator.turbulence(mapWidth, mapHeight, exponent));
                break;
            default:
                throw new IllegalStateException("Unexpected value: " + noiseType);
        }
        for (double v : noise) {
            Cell cell = new Cell();
            if (Math.round(v) == 1) {
                cell.setTile(new StaticTiledMapTile(splitTiles[0][1]));
            }
            layerArray[l].setCell(x, y, cell);
            x++;
            if (x == mapWidth) {
                y++;
                x = 0;
            }
        }
        layers.add(layerArray[l]);
    }

    return map;
}

通过这些修改,程序现在可以正确呈现程序生成的 TiledMap 中的多个切片图层。

结论

现在,你已经了解了如何在 LibGDX 中正确呈现程序生成的 TiledMap 中的多个切片图层。通过创建每个图层自己的 TiledMapTileLayer 对象,你可以确保所有图层都按预期呈现。如果你遵循上述步骤,你应该能够解决此问题并在游戏中呈现多个切片图层。

常见问题解答

1. 为什么我只能看到第一个添加的图层?

这可能是因为你使用了相同的 layer 变量来添加所有图层。每个图层都需要有自己专用的 TiledMapTileLayer 对象。

2. 如何在循环外创建 TiledMapTileLayer 对象?

你可以创建一个 TiledMapTileLayer 对象数组,并在循环外分配它们:

TiledMapTileLayer[] layerArray = new TiledMapTileLayer[mapLayers];
for (l = 0; l < mapLayers; l++) {
    layerArray[l] = new TiledMapTileLayer(mapWidth, mapHeight, tileWidth, tileHeight);
}

然后,你可以在循环中使用这些对象。

3. 如何优化代码以提高性能?

通过在循环外创建 TiledMapTileLayer 对象并重新使用它们,你可以提高代码的性能。

4. 我可以在 TiledMap 中使用哪些不同的切片类型?

LibGDX 支持多种切片类型,包括静态切片、动画切片、对象切片和地面切片。

5. 如何在程序生成的 TiledMap 中添加障碍物?

你可以通过在程序生成地图时添加 TiledMapTile 对象来添加障碍物。