如何在 LibGDX 程序生成的 TiledMap 中正确呈现多个切片图层?
2024-03-06 22:32:54
## 如何在 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
对象来添加障碍物。