Actor可以处理点击和按键事件吗?

时间:2016-01-16 08:14:21

标签: java libgdx scene2d

我尝试{em}点击和按下事件Actor。我将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时,点击的事件会按预期触发,即我看到相应的日志。但是,无论我按什么键,键向下事件都不会触发。我的问题是:为什么?演员能否同时处理点击按键事件?

2 个答案:

答案 0 :(得分:1)

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

    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);

如果您想将焦点更改为演员,可以使用Stage方法 setKeyboardFocus(演员演员)来完成此操作。它应该是这样的:

{{1}}

答案 1 :(得分:1)

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

设置游戏时,请使用InputMultiplexer

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

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

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

处理键输入功能然后变得更简单:不使用addListener方法并创建扩展ClickListener等的匿名内部类,您可以使用InputProcessor方法,例如:

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

    return false;
}

这也避免了在actor上设置键盘焦点的需要,如果有多个actor需要处理键盘输入,这可能不会很好地概括。

然而,这种方法的一个警告是,任何配置为输入处理器的actor现在都将处理所有输入事件,包括不与actor重叠的触摸事件,这种行为可能是不受欢迎的, /或令人困惑。