LibGDX:如何使平铺地图图块可点击?

And*_*rew 9 java libgdx tiled

如何为平铺地图中的切片添加单击侦听器,以便在使用鼠标选择切片时它会突出显示?

noo*_*one 21

libGDX不直接支持这一点,因为TiledMap的东西仅用于渲染.

你可以轻松创建一个Stage,它将作为你的TiledMap的某种覆盖输入层.只需Actor为每个瓷砖创建一个与该瓷砖具有相同尺寸的瓷砖.然后,您可以向EventListener这些演员添加s,以便能够识别诸如对这些演员的点击之类的内容.

这些演员应该提及他们的"起源",即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;
    }

}
Run Code Online (Sandbox Code Playgroud)

这个小听众可以附加到其中一个演员身上,并且可以做任何逻辑:

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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

以下类实际上从给定的地图创建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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,TiledMapStage遗嘱将为您完成所有工作.您需要做的就是以下内容:

Stage stage = new TiledMapStage(tiledMap);
Gdx.input.setInputProcessor(stage);
Run Code Online (Sandbox Code Playgroud)

在渲染(...)中你需要打电话stage.act().请记住Viewport在舞台上使用相同的方法来渲染TiledMap.否则输入和渲染的地图将不对齐.