【问题标题】:LibGDX - Multiple actors receiving key eventsLibGDX - 接收关键事件的多个参与者
【发布时间】:2014-02-05 18:50:13
【问题描述】:

我有多个演员(用于本地合作游戏)需要接收关键事件(例如,玩家 1 使用箭头键,玩家 2 使用 WASD 等...)。如果我只是将 Actors 添加到 Stage,他们不会通过 InputListener 接收关键事件,如果我这样做:

stage.setKeyboardFocus(p1);
stage.setKeyboardFocus(p2);

当然,只有玩家 2 接收关键事件。如何让两个(​​或更多)演员接收关键事件?

【问题讨论】:

    标签: input libgdx


    【解决方案1】:

    您可以使用可以包含其他演员的演员组或表格,并添加演员

    Gdx.setInputProcessor(stage);
    group = new Group();
    group.addActor(actor1);
    group.addActor(actor2);
    
    group.addListener(new InputListener(){
       @Override
       public boolean keyDown(InputEvent event, int keycode){
        if (keycode == Keys.A){
           update(actor1)
        }
        if (keycode == Keys.LEFT{
           update(actor2)
        }
        return true;
        });
    
    stage.addActor(group);
    stage.setKeyboardFocus(group);
    

    【讨论】:

    • 只是让您知道:Actor 会自动添加到舞台内名为 root 的组中。而且 Stage 扩展了 InputAdapter,因此您无需将侦听器添加到该组,您可以直接访问该方法。
    【解决方案2】:

    Libgdx Stage 扩展了 InputAdapter,这使您可以访问方法 keyDown(int keyCode)keyUp(int keyCode)。如果您使用Gdx.setInputProcessor(stage);Stage 设置为InputProcessor,您可以在Stage 中处理键输入。 一些伪代码:

    public boolean keyDown(int keyCode) {
        switch (keyCode) {
        case Input.Keys.A:
             player2.moveLeft();
        case Input.Keys.NUMPAD_4:
             player1.moveLeft();
        }
    }
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      奇怪的是没有人提到InputMultiplexer。试试看你的情况。

      【讨论】:

      • 他只有一个 InputProcessor - 阶段。所以他不能以任何方式应用 InputMultiplexer。
      【解决方案4】:

      想通了。与其将键盘焦点设置为单个 Actor,不如将其设置为一个通用 Actor,然后只需向该 Actor 添加一个侦听器。例如:

      public class Scene extends Stage
      {
          public Scene()
          {
              setKeyboardFocus(getRoot()); // getRoot() returns the parent actor group
              addActor(new Player(1));
              addActor(new Player(2));
          }
      }
      
      public class Player extends Actor
      {
          public Player(Stage stage)
          {
              stage.getRoot().addListener(inputListener);
          }
      }
      

      【讨论】:

      • 我不会直接将它设置为根组。就像我建议的那样,将您的舞台设置为 inputListener。因此您的舞台可以处理输入并将其提供给受影响的 Actor
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2021-12-15
      • 2014-08-07
      • 1970-01-01
      相关资源
      最近更新 更多