マウスでタイルを選択すると強調表示されるように、タイル マップからタイルのクリック リスナーを追加するにはどうすればよいですか?
1 に答える
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()
。Viewport
TiledMap のレンダリングに使用しているものと同じものをステージに使用することを忘れないでください。そうしないと、入力とレンダリングされたマップが整列しません。