4

我是 libgdx 的新手,我想要在这里实现的是我希望我的 GestureDetector 与 InputListener 同时工作。我在左侧有两个按钮,即使我同时开始滑动(多点触控),我也需要它们保持反应。我使用了 InputMultiplexer,但它不能按照我需要的方式工作。我检查了 InputListener 和 GestureDetector 的所有返回值,我需要的所有内容都返回 true,GestureInputListener 也是一个实现 GestureDetector.GestureListener 的类。我只用过一扔。GestureInputListener 和 InputListener 都可以工作,但不能同时工作。你能帮我解决这个问题吗?链接,想法。谢谢。下面的代码:

inputMultiplexer.addProcessor(stage);
inputMultiplexer.addProcessor(new GestureDetector(gestureInputListener));
Gdx.input.setInputProcessor(inputMultiplexer); 
4

3 回答 3

2

在使用以下任何类(GestureDetector 或 InputProcessor)时,如果您从其函数中返回 true,则它不会检查连接到您的游戏的任何其他处理器。

在您的代码中,您首先添加了阶段,然后添加了手势检测器,如果您的阶段正在工作并处理输入并返回 true,那么您的手势检测器将不会调用各种函数。

如果您希望舞台和手势检测器都工作,那么永远不要从手势侦听器和舞台中的任何函数返回 true


InputMultiplexer multiplexer = new InputMultiplexer();
multiplexer.addProcessor(new MyUiInputProcessor());
multiplexer.addProcessor(new MyGameInputProcessor());
Gdx.input.setInputProcessor(multiplexer);

InputMultiplexer 会将任何新事件交给添加到它的第一个 InputProcessor。如果该处理器从为处理事件而调用的方法返回 false,这表明该事件未被处理,并且多路复用器将把该事件交给链中的下一个处理器。通过这种机制,MyUiInputProcessor 可以处理属于其一个小部件的任何事件,并将任何其他事件传递给 MyGameInputProcessor。

Libgdx Wiki 输入事件

于 2013-09-01T18:43:08.313 回答
1

然后不使用输入多路复用器,而是使用以下代码:

public class MyGestureDetector extends GestureDetector {
    public MyGestureDetector(GestureListener listener) {
        super(listener);
    }

    @Override
    public boolean touchUp(float x, float y, int pointer, int button) {
        super.touchUp(x, y, pointer, button);

        // Your Code Here
        return true;
    }
}

类似地,可以在此处添加其他功能,例如 touchdown 等,不要忘记从功能中调用 super,因为这将使各种功能(例如 fling 和 tap)工作

编辑:

将实现更改为

public class MyGestureDetector extends GestureDetector {
    private Stage stage;
    public MyGestureDetector(GestureListener listener,Stage stage) {
        super(listener);
        this.stage = stage;
    }


    @Override
    public boolean keyDown(int keycode) {
        stage.keyDown(keycode);
        super.keyDown(keycode);
        return false;
    }

    @Override
    public boolean keyUp(int keycode) {
        stage.keyUp(keycode);
        super.keyUp(keycode);
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean keyTyped(char character) {
        // TODO Auto-generated method stub
        stage.keyTyped(character);
        super.keyTyped(character);
        return false;
    }

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        stage.touchDown(screenX, screenY, pointer, button);
        super.touchDown(screenX, screenY, pointer, button);
        return false;
    }

    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
        stage.touchUp(screenX, screenY, pointer, button);
        super.touchUp(screenX, screenY, pointer, button);
        return false;
    }

    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {
        // TODO Auto-generated method stub
        stage.touchDragged(screenX, screenY, pointer);
        super.touchDragged(screenX, screenY, pointer);

        return false;
    }

    @Override
    public boolean mouseMoved(int screenX, int screenY) {
        stage.mouseMoved(screenX, screenY);
        super.mouseMoved(screenX, screenY);
        return false;
    }

    @Override
    public boolean scrolled(int amount) {
        stage.scrolled(amount);
        super.scrolled(amount);
        // TODO Auto-generated method stub
        return false;
    }


}

这里的 stage 是 scene2d Stage,根据您使用的 libgdx 版本,参数中可能存在一些 float 或 int 错误,这是用 0.9.9 nightlies 编写的

PS-此实现是根据您的问题定制的,但应该尝试通过返回 true 或 false 来处理每个案例,如前所述

于 2013-09-02T16:38:34.527 回答
0

ActorGestureListener在某些情况下的帮助:

        this.ball.addListener(new ActorGestureListener() {
            public void touchDown(InputEvent event, float x, float y, int pointer, int button) {
            }
            public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
            }
            public void tap(InputEvent event, float x, float y, int count, int button) {
            }
            public boolean longPress(Actor actor, float x, float y) {
                return false;
            }
            public void fling(InputEvent event, float velocityX, float velocityY, int button) {
            }
            public void pan(InputEvent event, float x, float y, float deltaX, float deltaY) {
            }
            public void zoom(InputEvent event, float initialDistance, float distance) {
            }
            public void pinch(InputEvent event, Vector2 initialPointer1, Vector2 initialPointer2, Vector2 pointer1, Vector2 pointer2) {
            }
        });

其中“球”是一个演员。

于 2019-11-25T13:42:17.307 回答