【问题标题】:Libgdx clickable object?Libgdx 可点击对象?
【发布时间】:2019-06-05 12:50:48
【问题描述】:

有人可以解释一下如何检测对象的点击吗?我已经看到了这个问题的答案,但它不起作用。

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; //THE ERROR IS IN THIS LINE
            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);
            }
        }
    }
}

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

我已经尝试使用此代码,但收到以下错误消息:

 com.badlogic.gdx.maps.MapLayer cannot be cast to com.badlogic.gdx.maps.tiled.TiledMapTileLayer

我不明白如何选择可点击的对象

【问题讨论】:

    标签: libgdx tiled


    【解决方案1】:

    正如您已经发现的那样,问题在于您的选角:

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

    看起来图层不是 TiledMapTileLayer 类型 - 或者至少不是所有图层。 (Afaik TiledMap 中也有 ObjectLayers)让您的代码再次运行的最简单的方法是使用 instanceof 检查:

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

    【讨论】:

    • 感谢现在可以工作,但是如果我点击黑屏点,就会出现“已被点击”的打印,如果我想检测与对象层的触摸?你能帮帮我吗?
    • 您应该调试地图中的图层类型。然后您必须为这些图层类型添加特殊处理。
    • 如果您有时间,您想再次查看代码,因为它不精确,如果我单击屏幕上没有平铺层的点,例如屏幕中的黑色空间有“已被点击”消息
    • 只是猜测:您应该检查是否正确地将屏幕/鼠标坐标转换为贴图坐标。取决于您的相机视口。
    • 我解决了,在 TiledMapStage 中我必须添加视口和超级(视口),感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    相关资源
    最近更新 更多