2014-06-06 7 views
8

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?

+0

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

Antwort

16

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.

+0

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

+1

Normalerweise würden Sie das über 'stage.getViewport() tun. SetCamera (camera)' wobei 'camera' diejenige ist, mit der Sie die TiledMap zeichnen. – noone

+0

@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. –

Verwandte Themen