您可以使用InputMultiplexer。
首先InputMultiplexer 是如何工作的。
在InputMultiplexer 中,您可以执行许多InputProcessors 并且InputProcessor 具有返回布尔值的方法。
此布尔值表示事件是否已处理。
因此,如果方法返回 false,InputMultiplexer 会将事件交给下一个 InputProcessor。
如果该方法返回 true,则该事件已被处理,并且该事件不会转到下一个 InputProcessor。
现在我们为我们的屏幕创建一个InputProcessor,在这种情况下为TestScreenInput:
public class TestScreenInput implements InputProcessor {
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
System.out.println("Touch down");
character.jump();
return true;
}
@Override
... //all other methods from InputProcessor
}
touchDown 方法返回 true,因此下一个 InputProcessor 不会收到 touchDown 事件
在我们的屏幕类 (TestScreen) 中,我们创建了 Stage:
public class TestScreen implements Screen {
private Stage stage;
@Override
public void show() {
stage = new Stage();
}
}
现在我们将使用ChangeListener 创建我们的TextButton。
问题是,我们怎么能说事件被处理了?
ChangeListener::changed(ChangeEvent event, Actor actor) 不返回布尔值。
当我们查看Stage 类时,我们可以找到touchDown 方法并且该方法返回:
boolean handled = event.isHandled();
return handled;
event 是 Event 和 ChangeEvent 扩展 Event 的类型
在我们的changed(ChangeEvent event, Actor actor) 方法中,我们有一个ChangeEvent。所以我们要做的就是设置这个事件被处理。
在Event中有一个方法:
public void handle () { handled = true;}
现在我们知道如何创建我们的 Button:
TextButton button = new TextButton("Click", skin);
button.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
System.out.println("Click Button");
event.handle(); //set the event handled = true
}
});
stage.addActor(button);
最后,我们创建了InputMultiplexer。重要的是该阶段出现在我们的TestScreenInput 之前,因为TestScreenInput 会将touchDown 标记为已处理,而stage 永远不会收到它们。
InputMultiplexer multiplexer = new InputMultiplexer();
multiplexer.addProcessor(stage);
multiplexer.addProcessor(new TestScreenInput());
Gdx.input.setInputProcessor(multiplexer);