2014-06-06 65 views
8

如何爲平鋪貼圖中的貼磚添加點擊偵聽器,以便在使用鼠標選擇貼磚時它會變得高亮?LibGDX:如何使拼貼地圖貼磚可點擊?

+0

首先,您需要將鼠標屏幕座標轉換爲世界座標系座標。那裏有足夠的資源告訴你如何。然後,只要用戶點擊 - >檢查磁貼 - >運行代碼就可以做到這一點。 – Madmenyo

回答

16

這不是由libgDX直接支持的,因爲TiledMap的東西只用於渲染。

雖然你可以很容易地創建一個Stage,它將充當你的TiledMap的某種疊加輸入層。只需爲每個與該圖塊位置大小相同的圖塊創建一個Actor即可。然後,您可以向演員添加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; 
    } 

} 

這個小聽衆可以連接到這些演員之一,將做任何類型的邏輯:

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

下面的類實際上創建一個給定的地圖的演員,並將他們連接到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); 
      } 
     } 
    } 
} 

現在TiledMapStage將爲你做所有的工作。所有你需要做的是以下幾點:

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

而在渲染(......),你需要調用stage.act()。請記住使用相同的Viewport作爲渲染TiledMap的階段。否則,輸入和您的渲染地圖將不會對齊。

+0

我無法設置相機的舞臺,使輸入層將與瓷磚層對齊...我該如何解決問題? – Andrew

+1

通常你可以通過'stage.getViewport()。setCamera(camera)'來實現,其中'camera'是你用來繪製TiledMap的那個。 – noone

+0

@noone我很抱歉讓你跳出了你擁有的10101代表得分,但是'stage.getViewport().setCamera(camera)'正是我錯過的,並且讓我有很多時間迴歸向前。你搖滾。 –