使用 libgdx 和 Tiled 为每个动画图块单独设置计时器

Separate timer for each animated tile with libgdx and Tiled

抱歉问题措辞不佳,但这是我能想到的最好的了。

所以,我的游戏项目 libGDX(Java,桌面)和使用 Tiled 创建的平铺地图出现了一个小问题。

使用 Tiled 中新的动画图块编辑器功能,我创建了我的动画,一个爆炸的炸弹。效果很好。

我使用以下代码(经过简化以仅保留重要部分)以编程方式将炸弹放置在地图上(在其第二层):

tiledMap = new TmxMapLoader().load("maps/mymap.tmx");
TiledMapTileSet tileset = tiledMap.getTileSets().getTileSet("bombe");
animatedBomb= tileset.getTile(882);

showBomb(my_random_x, my_random_y);

public void showBomb(int x, int y){
 TiledMapTileLayer layer = (TiledMapTileLayer) tiledMap.getLayers().get(1);
 TiledMapTileLayer.Cell cellToChange = layer.getCell(x, y);
 if(cellToChange != null){
      cellToChange.setTile(animatedBomb);
 }
}

正如我所说,它工作得很好,但有一个小问题(对我来说是个大问题)我似乎无法解决:添加每个炸弹时,它们似乎共享内部动画计时器。 例如:

动画持续 17 帧 * 100ms。如果我在游戏时间的 0.0 秒添加一个炸弹,然后在 1.0 秒添加另一个,新炸弹将生成并直接更改为第 10 帧,这也是第一个炸弹的当前帧。

我希望每个图块都有单独的动画计时器。可能吗?

我已经尝试使用 Tiled 的动画图块实现或手动动画(使用 AnimatedTiledMapTile 及其静态图块数组以编程方式创建)来实现它,但行为是相同的。

更新:

即使我尝试逐帧复制对象,手动间隔 0.2f,炸弹仍在同时爆炸。

        TiledMapTileSet tileset = tiledMap.getTileSets().getTileSet("bombe");
        AnimatedTiledMapTile originalBomb = (AnimatedTiledMapTile)tileset.getTile(882);

        //copying the StaticTiledMapTile array of originalBomb
        Array<StaticTiledMapTile> bombTiles = new Array<StaticTiledMapTile>();
        StaticTiledMapTile[] copyArray = bombeAnimee.getFrameTiles().clone();
        for(StaticTiledMapTile tile : copyArray){
            bombTiles.add(tile);
        }

        AnimatedTiledMapTile anotherBomb = new AnimatedTiledMapTile(0.2f,bombTiles);

        TiledMapTileLayer.Cell cellToChange = layer.getCell(x, y);
        cellToChange.setTile(anotherBomb);

我认为您使用的是同一个 animatedBomb 实例,因为

tileset.getTile(882) 

可能总是为您提供相同的实例。您只在不同的单元格上显示对象。

您可以尝试在您的方法中实例化一个新炸弹:

animatedBomb = new AnimatedBomb();

我遇到了同样类型的问题,最终创建了一个自定义的 AnimatedTiledMapTile,删除了该文件中的所有静态内容并更改为私有,您的创建方式与创建 AnimatedTiledMapTile 等的方式相同,

public class SimpleAnimatedTile implements TiledMapTile {

private long lastTiledMapRenderTime = 0;

private int id;

private BlendMode blendMode = BlendMode.ALPHA;

private MapProperties properties;

private MapObjects objects;

private StaticTiledMapTile[] frameTiles;

private int[] animationIntervals;
private int frameCount = 0;
private int loopDuration;
private long initialTimeOffset = TimeUtils.millis();

然后我在我的主 GDX 中创建了一个数组,当用户选择一个图块时,它会向数组添加一个新的 SimpleAnimatedTile

private Array<SimpleAnimatedTile> animated_tile_array = new Array<SimpleAnimatedTile>();

用户选择图块时,

animated_tile_array.add(new SimpleAnimatedTile(0.05f,tile_array));

然后用这个替换地图块,

tileCell.setTile(animated_tile_array.get(animated_tile_array.size - 1));

然后在渲染中,你需要调用一个方法来迭代和更新每个,

updateTileAnimations();

调用此方法,

private void updateTileAnimations()
{
    for(int i = 0; i < animated_tile_array.size; i++)
    {
        SimpleAnimatedTile tile = animated_tile_array.get(i);

        //something to be added to sort which tile will animate or not etc <-IMPORTANT
        //or call something in custom SimpleAnimatedTile
        tile.updateAnimationBaseTime();

    }

}

无论如何,这似乎阻止了同时更新所有内容的集群效应。希望这会有所帮助,这是一个快速而肮脏的实现,因此欢迎反馈以完善解决方案。