Java 参与者可以处理点击和按键事件吗?

Java 参与者可以处理点击和按键事件吗?,java,libgdx,scene2d,Java,Libgdx,Scene2d,我正试图让一个演员同时处理点击和按键事件。我初始化了actor(在本例中是一个图像),如下所示: 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, fl

我正试图让一个
演员
同时处理点击和按键事件。我初始化了actor(在本例中是一个
图像
),如下所示:

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

当我单击
图像
时,单击的事件按预期触发,即我看到相应的日志。但是,无论我按哪个键,key down事件都不会触发。我的问题是:为什么?演员不能同时处理点击和按键事件吗

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

    stage.addListener(new InputListener() 
    {
        @Override
        public boolean keyDown(InputEvent event, int keycode) 
        {
            Gdx.app.log("Image ClickListener", "keyDown. keycode=" + keycode);
            return true;
        }
    });
如果要将焦点更改为演员,可以使用方法setKeyboardFocus(演员-演员)。应该是这样的:

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

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

设置游戏时,请使用
输入多路复用器

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;
}
这还避免了将键盘焦点设置在角色上的需要,如果您有多个角色需要处理键盘输入,则这可能无法很好地概括

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