libGDX 不直接支持这一点,因为 TiledMap 内容仅用于渲染。
您可以轻松创建一个Stage
不过,它将充当 TiledMap 的某种覆盖输入层。只需创建一个Actor
对于与该图块具有相同大小的位置的每个图块。然后你就可以添加EventListener
这些演员能够识别诸如点击这些演员之类的事情。
这些演员应该提及他们的“起源”,即TiledMapTileLayer.Cell
。因此,在处理这些事件时,您可以随时从参与者返回到单元格。
下面显示了您可以如何执行此操作:
该 Actor 负责捕获事件并保留有关其所基于的图块的信息:
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;
}
}
这个小监听器可以附加到其中一个参与者并执行任何类型的逻辑:
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.");
}
}
下面的类实际上从给定的地图创建参与者并将它们连接到侦听器:
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);
}
}
}
}
Now the TiledMapStage
将为您做所有工作。您需要做的就是以下操作:
Stage stage = new TiledMapStage(tiledMap);
Gdx.input.setInputProcessor(stage);
在 render(...) 中你需要调用stage.act()
。记得用同样的Viewport
用于渲染 TiledMap 的舞台。否则输入和渲染的地图将不会对齐。