【问题标题】:Get an actor by name in libgdx在 libgdx 中按名称获取演员
【发布时间】:2014-02-07 13:44:55
【问题描述】:

如何在 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);
        }
    };

上面的actor就是被触摸的actor。一旦这个特定的演员被触摸,我需要改变另一个演员的颜色。我究竟要怎样才能得到那个演员的名字?

【问题讨论】:

    标签: java android libgdx scene2d


    【解决方案1】:

    我想指出,已经有一种方法可以按名称找到Actor

    它的工作原理是这样的:stage.getRoot().findActor(name)

    无需自己实现。 :)

    【讨论】:

    • 每次我忘记这一点并记住正确的搜索词以再次找到此问题时,我很遗憾没有将其标记为答案。谢谢!
    【解决方案2】:

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

    myactor.setName("myactor");
    

    然后你可以得到这个舞台中的所有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;
        }
    }
    

    但如果您保留对所有 Actors 的引用并改为使用它,将会更简单并且性能更高

    【讨论】:

      【解决方案3】:

      我会推荐使用 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;
          }
      

      Link to Group Class

      如果您需要多次搜索以保持对 Actor 的引用。如果不只是使用 serch 方法。

      【讨论】:

      • 我不认为它更安全,因为stage.getActors() 还应该包含 all 演员。遍历该列表甚至可能更高效。但我仍然会使用已经存在的 API。我只是看不出你的答案对之前已经给出的两个答案有什么价值。
      • @noone "stage.getActors() 还应该包含所有参与者。"我不知道,如果你在那个Stage 中放一个Group,然后在stage.getActors() 组中放10 个Actors 只会返回Group 演员,它不会返回10 个演员在里面Group。我想这就是他说“分组系统”时的意思。
      猜你喜欢
      • 2020-01-03
      • 2014-11-15
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多