2014-01-18 44 views
4

如何在libgdx中按名稱獲取演員?在libgdx中按名稱獲取演員

目前,我有以下的ChangeListener:

ChangeListener colorPickerListener = new ChangeListener() 
    { 
     public void changed(ChangeEvent event, Actor actor) 
     { 
      //Popup Window 
      toolboxStage.addActor(blockWindow); 
      //toolboxStage.getRoot().removeActor(blockWindow); 
      Gdx.app.log("LevelEditorScreen", "Color Picker Selected"); 
      Gdx.app.log("LevelEditorScreen", "HUD Width: " + HUD_WIDTH); 

      Gdx.input.setInputProcessor(toolboxStage); 
     } 
    }; 

演員是上面已經觸碰演員。一旦這個特殊的演員被觸動,我需要改變另一個演員的顏色。我究竟如何才能通過名字獲得這位演員?

回答

3

首先,你需要爲你的演員設置一個名稱:(Actor#setName

myactor.setName("myactor"); 

然後你就可以得到所有的演員在舞臺這是,這樣的:(Stage#getActors

Array<Actor> stageActors = mystage.getActors(); 

然後,您可以用Actor#getName檢查所有演員的那個名字:

int len = stageActors.size; 
for(i=0; i<len; i++){ 
    Actor a = stageActors.get(i); 
    if(a.getName().equals("myactor")){ 
     //a is your Actor! 
     break; 
    } 
} 

但是,如果您保留對所有Actor的引用並改爲使用它,它將更容易更高性能

15

我想指出,已經有一種方法可以按名稱找到Actor

它的工作原理是這樣的:stage.getRoot().findActor(name)

不需要自己實現它。 :)

+1

每當我忘記這一點,並記住正確的搜索條件再次找到這個問題,我很難過,這沒有標記爲答案。謝謝! –

1

我會重新使用本集團的已知功能。每個階段都有一個根組,這實現了通過名稱查找演員。在使用分組系統的情況下,它的代碼比答案中給出的代碼更安全。

該組的代碼看起來像這樣,並且更安全,因爲如果您將組添加到舞臺上,它也會在組內查找。

/** Returns the first actor found with the specified name. Note this recursively compares the name of every actor in the group. */ 
    public Actor findActor (String name) { 
      Array<Actor> children = this.children; 
      for (int i = 0, n = children.size; i < n; i++) 
        if (name.equals(children.get(i).getName())) return children.get(i); 
      for (int i = 0, n = children.size; i < n; i++) { 
        Actor child = children.get(i); 
        if (child instanceof Group) { 
          Actor actor = ((Group)child).findActor(name); 
          if (actor != null) return actor; 
        } 
      } 
      return null; 
    } 

Link to Group Class

如果你需要搜索很多的時間來保存演員的refrence。如果不是隻使用serch方法。

+1

我不認爲它更安全,因爲'stage.getActors()'還應該包含* all * actors。遍歷該列表甚至可能更具性能。但我仍然會使用現有的API。我只是沒有看到你的答案對於之前已經給出的兩個答案有什麼價值。 – noone