基本上,我的屏幕上有一个字符和一个按钮。当我触摸屏幕时,角色会跳跃(使用Gdx.input.justTouched实现)。单击该按钮时会打开PauseMenu(按钮是舞台的演员,并且单击是使用button.addListener(new ChangeListener(){....})实现的。我的InputProcessor设置在舞台上
HAVING COUNT(*) = 1
问题是当单击按钮时,我的角色跳了起来(但他不应该跳),并且暂停菜单打开了。我正在通过InputMultiplexer搜索,但是没有用(或者我使用了错误的方式)。
谢谢您的建议!
答案 0 :(得分:1)
您可以使用InputMultiplexer
。
首先InputMultiplexer
的工作方式。
在InputProcessor
中,您可以执行许多InputProcessor
,而InputMultiplexer
具有返回布尔值的方法。
这个布尔值表示事件是否被处理。
因此,如果该方法返回false,则InputProcessor
将事件传递给下一个InputProcessor
。
如果该方法返回true,则说明事件已处理,事件不会转到下一个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
touchDown
方法返回true,因此下一个InputProcessor不会成为Stage
事件
在屏幕类(TestScreen)中,我们创建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
Event
是ChangeEvent
的类型,并且Event
扩展了changed(ChangeEvent event, Actor actor)
在我们的ChangeEvent
方法中,我们有一个Event
。因此,我们要做的就是设置此事件的处理方式。
在public void handle () { handled = true;}
中,有一种方法:
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);
现在我们都知道创建Button了:
InputMultiplexer
最后,我们创建TestScreenInput
。重要的是该阶段早于我们的TestScreenInput
,因为touchDown
会将stage
标记为已处理,而InputMultiplexer multiplexer = new InputMultiplexer();
multiplexer.addProcessor(stage);
multiplexer.addProcessor(new TestScreenInput());
Gdx.input.setInputProcessor(multiplexer);
永远不会收到它们。
{{1}}