在libgdx中通过名称获取一个演员

7

如何在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个回答

22

我想指出,已经有一种方法可以通过名称查找Actor

它的用法如下:stage.getRoot().findActor(name)

无需自行实现。 :)


2
每次我忘记了正确的搜索词来找到这个问题,并记住它,我都会感到遗憾,因为这不是标记为答案。谢谢! - James Skemp

5

首先你需要为你的Actor设置一个名称:(Actor#setName)

myactor.setName("myactor");

然后你可以通过以下方式获取舞台(Stage)中的所有演员(Actor):(Stage#getActors)

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

然后,您可以使用Actor#getName检查该名称的所有Actor:

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的引用并使用它,将更加易于操作和性能更高。


1
我建议使用Group已经提供的功能。每个阶段都有一个根组,它通过名称实现了对演员的查找。如果您使用分组系统,则其代码比答案中给出的代码更安全。
Group的代码如下所示,并且更加安全,因为它还会在将组添加到舞台时查看组内部。
    /** 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;
    }

小组课链接

如果您需要多次搜索来保存演员的参考文献,那么就使用搜索方法。


1
我认为这并不更安全,因为stage.getActors()应该包含所有演员。遍历该列表甚至可能更高效。但我仍然会使用已经存在的API。我只是不明白你的答案如何对之前给出的两个答案有任何价值。 - noone
stage.getActors() 应该包含所有的演员。” 我不知道,如果你在 Stage 中放置一个 Group,并将 10 个 Actor 放入该组中,stage.getActors() 只会返回 Group 演员,而不会返回该 Group 中的 10 个演员。我认为这就是他所说的“分组系统”的意思。 - centenond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接