gpt4 book ai didi

java - LibGDX:如何使平铺 map block 可点击?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:07:14 24 4
gpt4 key购买 nike

我如何为瓦片 map 中的瓦片添加点击监听器,以便在您用鼠标选择瓦片时它会突出显示?

最佳答案

libGDX 不直接支持,因为 TiledMap 仅用于渲染。

不过,您可以轻松地创建一个Stage,它将作为您的 TiledMap 的某种覆盖输入层。只需为每个瓦片创建一个 Actor,它的大小与该瓦片的位置相同。然后,您可以将 EventListener 添加到这些 actor,以便能够识别对这些 actor 的点击等操作。

那些 actor 应该保留对其“来源”的引用,即 TiledMapTileLayer.Cell。因此,在处理这些事件时,您可以随时从 actor 返回到 cell。

下面显示了您可以如何操作:

此 Actor 负责捕获事件并保留有关它所基于的图 block 的信息:

public class TiledMapActor extends Actor {

private TiledMap tiledMap;

private TiledMapTileLayer tiledLayer;

private TiledMapTileLayer.Cell cell;

public TiledMapActor(TiledMap tiledMap, TiledMapTileLayer tiledLayer, TiledMapTileLayer.Cell cell) {
this.tiledMap = tiledMap;
this.tiledLayer = tiledLayer;
this.cell = cell;
}

}

这个小监听器可以附加到其中一个 actor 上,并将执行任何类型的逻辑:

public class TiledMapClickListener extends ClickListener {

private TiledMapActor actor;

public TiledMapClickListener(TiledMapActor actor) {
this.actor = actor;
}

@Override
public void clicked(InputEvent event, float x, float y) {
System.out.println(actor.cell + " has been clicked.");
}
}

下面的类实际上从给定的 map 创建 Actor 并将它们连接到听众:

public class TiledMapStage extends Stage {

private TiledMap tiledMap;

public TiledMapStage(TiledMap tiledMap) {
this.tiledMap = tiledMap;

for (MapLayer layer : tiledMap.getLayers()) {
TiledMapTileLayer tiledLayer = (TiledMapTileLayer)layer;
createActorsForLayer(tiledLayer);
}
}

private void createActorsForLayer(TiledMapTileLayer tiledLayer) {
for (int x = 0; x < tiledLayer.getWidth(); x++) {
for (int y = 0; y < tiledLayer.getHeight(); y++) {
TiledMapTileLayer.Cell cell = tiledLayer.getCell(x, y);
TiledMapActor actor = new TiledMapActor(tiledMap, tiledLayer, cell);
actor.setBounds(x * tiledLayer.getTileWidth(), y * tiledLayer.getTileHeight(), tiledLayer.getTileWidth(),
tiledLayer.getTileHeight());
addActor(actor);
EventListener eventListener = new TiledMapClickListener(actor);
actor.addListener(eventListener);
}
}
}
}

现在 TiledMapStage 将为您完成所有工作。您只需执行以下操作:

Stage stage = new TiledMapStage(tiledMap);
Gdx.input.setInputProcessor(stage);

并且在 render(...) 中您需要调用 stage.act()。请记住为舞台使用与渲染 TiledMap 相同的 Viewport。否则输入和您渲染的 map 将不会对齐。

关于java - LibGDX:如何使平铺 map block 可点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24080272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com