为了账号安全,请及时绑定邮箱和手机立即绑定

单击按钮时屏幕响应

单击按钮时屏幕响应

蓝山帝景 2021-09-29 13:41:08
基本上,我有一个屏幕,其中有一个字符和一个按钮。当我触摸屏幕时字符跳跃(使用 Gdx.input.justTouched 实现)。单击按钮时会打开 PauseMenu(按钮是舞台的演员,单击是使用 button.addListener(new ChangeListener() {.... })实现的。我的 InputProcessor 设置在舞台上Gdx.input.setInputProcessor(stage);问题是当单击按钮时,我的角色会跳跃(但他不应该)并打开暂停菜单。我正在搜索 InputMultiplexer 但这没有用(或者我可能以错误的方式使用它)。感谢您的任何建议!
查看完整描述

1 回答

?
阿晨1998

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


查看完整回答
反对 回复 2021-09-29
  • 1 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信