libgdx中的GestureDetector和InputListener

时间:2013-09-01 14:53:37

标签: java android libgdx gesturedetector

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

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

3 个答案:

答案 0 :(得分:1)

在使用以下任何类(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 InputEvent

答案 1 :(得分: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;
    }
}
同样可以在这里添加触地等其他功能,不要忘记从功能中调用超级功能,因为这会产生各种功能,比如投掷和点击工作

编辑:

将实施更改为

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


}

这个阶段是scene2d阶段,并且在参数中可能会有一些float或int的错误,具体取决于您使用的libgdx版本,这是在0.9.9晚上编写的

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

答案 2 :(得分:0)

在某些情况下

ActorGestureListener 帮助:

std::vector<Test*> values;

void addValue( const std::string &id, int a, double b ) {
    // Keep stockpiles sorted by weight (large to small)
    auto itr = values.begin();
    while ( itr != values.end() && ((*itr)->b > b) ) ++itr;
    Test* t = new Test{id,a,b};
    values.insert( itr, t );
    // end sort
}

“球”是演员。