【问题标题】:Can an Actor handle click and key down events?Actor 可以处理点击和按键事件吗?
【发布时间】:2016-01-16 08:14:20
【问题描述】:

我正在尝试让Actor 处理 clickkey down 事件。我将actor(在本例中为Image)初始化如下:

stage = new Stage();
texture = new Texture("badlogic.jpg");
Image image = new Image(texture);
image.addListener(new ClickListener() {
    @Override
    public void clicked(InputEvent event, float x, float y) {
        Gdx.app.log("Image ClickListener", "clicked");
    }

    @Override
    public boolean keyDown(InputEvent event, int keycode) {
        Gdx.app.log("Image ClickListener", "keyDown. keycode=" + keycode);
        return true;
    }
});
stage.addActor(image);
Gdx.input.setInputProcessor(stage);

当我点击image 时,clicked 事件按预期触发,即我看到了相应的日志。但是,无论我按什么键,key down 事件都不会触发。我的问题是:为什么? Actor 不能同时处理 clickkey down 事件吗?

【问题讨论】:

    标签: java libgdx scene2d


    【解决方案1】:

    默认情况下,您应该将 keyboard listener 附加到舞台,因为舞台上有 键盘焦点,所以它应该类似于

        stage.addListener(new InputListener() 
        {
            @Override
            public boolean keyDown(InputEvent event, int keycode) 
            {
                Gdx.app.log("Image ClickListener", "keyDown. keycode=" + keycode);
                return true;
            }
        });
    

    如果您想将焦点转移到演员身上,您可以使用Stage 方法setKeyboardFocus(Actor actor) 来做到这一点。它应该是这样的:

        image.addListener(new ClickListener() 
        {
            @Override
            public void clicked(InputEvent event, float x, float y) {
                Gdx.app.log("Image ClickListener", "clicked");
            }
    
            @Override
            public boolean keyDown(InputEvent event, int keycode) {
                Gdx.app.log("Image ClickListener", "keyDown. keycode=" + keycode);
                return true;
            }
        });
    
        stage.setKeyboardFocus(image);
    

    【讨论】:

      【解决方案2】:

      创建一个自定义类,扩展Actor 类并实现InputProcessor 接口。

      设置游戏时,请使用InputMultiplexer

      InputMultiplexer inputMulti = new InputMultiplexer(stage);
      Gdx.input.setInputProcessor( inputMulti );
      

      然后,在您的自定义类的构造函数中,您可以将正在创建的实例添加到多路复用器中,如下所示:

      ((InputMultiplexer)Gdx.input.getInputProcessor()).addProcessor(this);
      

      处理按键输入功能变得更简单:您可以只使用InputProcessor 方法,而不是使用addListener 方法和创建一个扩展ClickListener 等的匿名内部类,例如:

      public boolean keyDown(int keycode)
      {
          if (keycode == Keys.SPACE)
          {
              // do something
          }
      
          return false;
      }
      

      这也避免了将键盘焦点设置在演员身上的需要,如果您有多个演员需要处理键盘输入,这可能无法很好地概括。

      但是,对这种方法的一个警告是,任何配置为输入处理器的参与者现在都将处理所有输入事件,包括不与参与者重叠的触摸事件,并且这种行为可能是不希望的,并且/ 或令人困惑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-25
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 1970-01-01
        相关资源
        最近更新 更多