使用 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();
}
}
无论如何,这似乎阻止了同时更新所有内容的集群效应。希望这会有所帮助,这是一个快速而肮脏的实现,因此欢迎反馈以完善解决方案。
抱歉问题措辞不佳,但这是我能想到的最好的了。
所以,我的游戏项目 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();
}
}
无论如何,这似乎阻止了同时更新所有内容的集群效应。希望这会有所帮助,这是一个快速而肮脏的实现,因此欢迎反馈以完善解决方案。