Wie kann ich Klick-Listener für die Kacheln aus einer gekachelten Karte hinzufügen, so dass, wenn Sie eine Kachel mit der Maus auswählen, diese hervorgehoben wird?LibGDX: Wie können gekachelte Kartenkacheln klickbar gemacht werden?
Antwort
Das wird nicht direkt von libGDX unterstützt, da das TiledMap-Zeug nur zum Rendern dient.
Sie könnten jedoch problemlos eine Stage
erstellen, die als eine Art Overlay-Eingabe-Layer für Ihre TiledMap fungiert. Erstelle einfach eine Actor
für jede Kachel, die dieselbe Größe wie die Position dieser Kachel hat. Dann können Sie diesen Akteuren EventListener
s hinzufügen, um Dinge wie Klicks auf diese Akteure erkennen zu können.
Diese Akteure sollten einen Verweis auf ihren "Ursprung" behalten, nämlich TiledMapTileLayer.Cell
. So können Sie jederzeit vom Akteur zur Zelle zurückkehren, wenn Sie diese Ereignisse verarbeiten.
Im Folgenden wird gezeigt, wie Sie könnte es tun:
Dieser Schauspieler ist dafür verantwortlich, die Ereignisse zu fangen und die Informationen über die Fliese zu halten ist es, basierend auf:
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;
}
}
Dieser kleine Zuhörer kann angebracht werden einer jener Schauspieler und jede Art von Logik tun:
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.");
}
}
die folgende Klasse tatsächlich schafft die Schauspieler aus einer bestimmten Karte und Drähte sie an den l isteners:
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);
}
}
}
}
Nun ist die TiledMapStage
wird alle Arbeit für Sie tun. Alles, was Sie tun müssen, ist die folgende:
Stage stage = new TiledMapStage(tiledMap);
Gdx.input.setInputProcessor(stage);
Und machen (...) Sie müssen stage.act()
nennen. Denken Sie daran, dieselbe Stufe Viewport
für die Bühne zu verwenden, die Sie zum Rendern der TiledMap verwenden. Andernfalls werden die Eingabe und die gerenderte Karte nicht ausgerichtet.
Ich kann es nicht schaffen, die Kamera für die Bühne zu setzen, so dass die Eingangsebene mit den Kachelschichten ausgerichtet wäre ... Wie kann ich das Problem lösen? – Andrew
Normalerweise würden Sie das über 'stage.getViewport() tun. SetCamera (camera)' wobei 'camera' diejenige ist, mit der Sie die TiledMap zeichnen. – noone
@noone Ich entschuldige mich dafür, dass ich Sie aus dem netten 10101 Rep-Score herausgeholt habe, aber die 'stage.getViewport() .setCamera (Kamera)' ist genau das, was ich vermisst habe und verursachte mir eine Menge Zeit her. Du schaukelst. –
- 1. Wie kann dieser Button in AndroidStudio klickbar gemacht werden?
- 2. Wie können Benutzernamen wie die Twitter- und Facebook-App klickbar gemacht werden?
- 3. Google Maps API v2: Wie können Marken nicht klickbar gemacht werden?
- 4. Wie können Links in einem QTextEdit anklickbar gemacht werden?
- 5. Die URL kann in UITextView nicht klickbar gemacht werden.
- 6. Wie können Fremdschlüsseleinschränkungen vertrauenswürdig gemacht werden?
- 7. HTML- und CSS-basierte Galerie, Bilder können nicht klickbar gemacht werden
- 8. Können Menüs in Vim "dynamisch" gemacht werden?
- 9. Können SQLite-DB-Dateien schreibgeschützt gemacht werden?
- 10. Wie kann ein DIv mit einem Rails Link klickbar gemacht werden?
- 11. Wie können einige Django-Einstellungen für Mitarbeiter zugänglich gemacht werden?
- 12. Wie können JavaFX TableView-Zellen editierbar gemacht werden?
- 13. Wie können diese dynamisch typisierten Funktionen typsicher gemacht werden?
- 14. Wie können Eigenschaften eines WPF DataTemplate verfügbar gemacht werden?
- 15. Wie können die nicht separierbaren Daten separierbar gemacht werden?
- 16. Wie können Matplotlib-Streudiagramme als Gruppe transparent gemacht werden?
- 17. Wie können Änderungen an einem Modell rückgängig gemacht werden?
- 18. Wie können benutzerdefinierte GUI-Steuerelemente für Bildschirmleseprogramme sichtbar gemacht werden?
- 19. Wie können "undefined ist keine Funktion" Fehler nützlicher gemacht werden?
- 20. Wie können Azure-Websites während der Entwicklung "privat" gemacht werden?
- 21. Wie können Resigs Mikrovorlagen XHTML-kompatibel gemacht werden?
- 22. Wie können $ (document) .ready() Funktionen global verfügbar gemacht werden?
- 23. Wie können Steuerzeichen in einer Zeichenfolge sichtbar gemacht werden?
- 24. Wie können Inline-Plots im Jupyter Notebook größer gemacht werden?
- 25. Wie können DataTables innerhalb von jQuery-Registerkarten reaktionsfähig gemacht werden?
- 26. Wie können statische Konstruktoren nicht privat gemacht werden?
- 27. Wie können Sequenzdiagramme in Papyrus voneinander unabhängig gemacht werden?
- 28. Wie können Spalten im Datenrahmen eindeutig gemacht werden?
- 29. Wie können lokale Änderungen an einem ActiveSecord-Objekt rückgängig gemacht/rückgängig gemacht werden?
- 30. User Stories - Probleme, die nicht User Stories gemacht werden können
Zuerst müssen Sie Maus Bildschirm Coords zu World Tiles Coords konvertieren. Viele Ressourcen da draußen sagen dir wie. Dann mach einfach dein Ding wenn ein User klickt -> check tile -> run code. – Madmenyo