1 回答
TA贡献2037条经验 获得超6个赞
您可以使用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();
}
}
现在我们将创建我们TextButton的ChangeListener.
问题是,我们怎么能说事件被处理了呢?
将ChangeListener::changed(ChangeEvent event, Actor actor)不返回一个布尔值。
当我们查看Stage类时,我们可以找到该touchDown方法并且该方法返回:
boolean handled = event.isHandled();
return handled;
event是一个 Type ofEvent和ChangeEventextendsEvent
在我们的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);
添加回答
举报