Actor 可以处理点击和按键事件吗?
Can an Actor handle click and key down events?
我正在尝试让 Actor
处理 click 和 key down 事件。我初始化演员(在本例中,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 不能同时处理 click 和 key down 事件吗?
默认情况下,您应该将 键盘侦听器 附加到舞台,因为舞台上有 键盘焦点,所以它应该类似于
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);
创建一个扩展 Actor
class 并实现 InputProcessor
接口的自定义 class。
设置游戏时,使用 InputMultiplexer
:
InputMultiplexer inputMulti = new InputMultiplexer(stage);
Gdx.input.setInputProcessor( inputMulti );
然后,在您自定义的class的构造函数中,您可以将正在创建的实例添加到多路复用器中,如下所示:
((InputMultiplexer)Gdx.input.getInputProcessor()).addProcessor(this);
处理键输入功能变得更简单:不用使用 addListener
方法并创建一个扩展 ClickListener
等的匿名内部 class 等等,您可以只使用InputProcessor
方法,例如:
public boolean keyDown(int keycode)
{
if (keycode == Keys.SPACE)
{
// do something
}
return false;
}
这也避免了将键盘焦点设置在演员身上的需要,如果您有多个演员需要处理键盘输入,这可能无法很好地概括。
但是,对这种方法的一个警告是任何配置为输入处理器的 actor 现在都将处理 所有 输入事件,包括不与 actor 重叠的触摸事件,并且这行为可能是不受欢迎的 and/or 令人困惑。
我正在尝试让 Actor
处理 click 和 key down 事件。我初始化演员(在本例中,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 不能同时处理 click 和 key down 事件吗?
默认情况下,您应该将 键盘侦听器 附加到舞台,因为舞台上有 键盘焦点,所以它应该类似于
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);
创建一个扩展 Actor
class 并实现 InputProcessor
接口的自定义 class。
设置游戏时,使用 InputMultiplexer
:
InputMultiplexer inputMulti = new InputMultiplexer(stage);
Gdx.input.setInputProcessor( inputMulti );
然后,在您自定义的class的构造函数中,您可以将正在创建的实例添加到多路复用器中,如下所示:
((InputMultiplexer)Gdx.input.getInputProcessor()).addProcessor(this);
处理键输入功能变得更简单:不用使用 addListener
方法并创建一个扩展 ClickListener
等的匿名内部 class 等等,您可以只使用InputProcessor
方法,例如:
public boolean keyDown(int keycode)
{
if (keycode == Keys.SPACE)
{
// do something
}
return false;
}
这也避免了将键盘焦点设置在演员身上的需要,如果您有多个演员需要处理键盘输入,这可能无法很好地概括。
但是,对这种方法的一个警告是任何配置为输入处理器的 actor 现在都将处理 所有 输入事件,包括不与 actor 重叠的触摸事件,并且这行为可能是不受欢迎的 and/or 令人困惑。