10

マウスでタイルを選択すると強調表示されるように、タイル マップからタイルのクリック リスナーを追加するにはどうすればよいですか?

4

1 に答える 1

23

TiledMap はレンダリング専用であるため、libGDX では直接サポートされていません。

Stageただし、TiledMap のある種のオーバーレイ入力レイヤーとして機能するものを簡単に作成できます。Actorそのタイルと位置と同じサイズの for each タイルを作成するだけです。次に、これらのアクターに を追加EventListenerして、それらのアクターのクリックなどを認識できるようにします。

これらのアクターは、その「起源」、つまり への参照を保持する必要がありますTiledMapTileLayer.Cell。そのため、これらのイベントを処理しているときに、いつでもアクターからセルに戻ることができます。

以下は、その方法を示しています。

このアクタは、イベントをキャッチし、基になっているタイルに関する情報を保持する責任があります。

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;
    }

}

この小さなリスナーは、これらのアクターの 1 つにアタッチでき、あらゆる種類のロジックを実行します。

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);
            }
        }
    }
}

これで、TiledMapStageがすべての作業を行います。あなたがする必要があるのは次のことだけです:

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

render(...) では、 を呼び出す必要がありますstage.act()ViewportTiledMap のレンダリングに使用しているものと同じものをステージに使用することを忘れないでください。そうしないと、入力とレンダリングされたマップが整列しません。

于 2014-06-06T11:22:40.913 に答える