libgdx中的GestureDetector

7
我是libgdx的新手,我遇到了以下问题。我想为我的游戏实现捏合缩放功能。为此,我在我的GameStage中有一个GestureDetectorListener类。
在GameStage中,我有以下代码用于GestureDetector:
OrthographicCamera camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
this.setCamera(camera);


GestureDetector gestureDetector = new GestureDetector(20, 0.5f, 2, 0.15f, new GestureDetectorListener());
Gdx.input.setInputProcessor(gestureDetector);

class GestureDetectorListener implements GestureListener {
    float initialScale = 1;

    @Override
    public boolean touchDown(float x, float y, int pointer, int button) {
        initialScale = camera.zoom;
        return true;
    }

    @Override
    public boolean tap(float x, float y, int count, int button) {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean longPress(float x, float y) {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean fling(float velocityX, float velocityY, int button) {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean pan(float x, float y, float deltaX, float deltaY) {
        return true;
    }

    @Override
    public boolean zoom(float initialDistance, float distance) {
        float ratio = initialDistance / distance;
        camera.zoom = initialScale * ratio;
        return true;
    }

    @Override
    public boolean pinch(Vector2 initialPointer1, Vector2 initialPointer2,
            Vector2 pointer1, Vector2 pointer2) {
        // TODO Auto-generated method stub
        return true;
    }

}

我在我的舞台上为演员设置了InputListener,以便拖动它们。问题是,当我将InputProcessor设置为GestureDetector时,我的Actors的拖动不起作用。我想使用相机和GestureDetector进行捏合缩放,但这不会影响拖动。我该怎么做?
请帮忙!谢谢。
2个回答

8

CodeNoob的想法是正确的,但我认为你可能希望以不同的方式构建事物。

您可以使用InputMultiplexer来安装全局GestureListener和舞台的监听器:

GestureDetector gd = ...
Stage myStage = ...
InputMultiplexer im = new InputMultiplexer(gd, myStage); // Order matters here!
Gdx.input.setInputProcessor(im);

另一件需要注意的事情是在输入监听器中所有布尔方法的返回值。任何一个返回"true"的方法都会将事件标记为"已处理",多路复用器将不会将事件传递给其对等方。此外,多路复用器中输入处理器的顺序也很重要(因为它可能会隐藏底层输入处理器的事件)。因此,在您的示例中返回'true'的自动生成存根将会“吞噬”大量事件。如果此处理程序是多路复用器中的第一个,则会隐藏舞台上的事件。

谢谢!你是对的。"return true" 是问题所在。现在拖动和缩放都可以了。但我想让缩放只影响某个容器,而不是整个舞台。我猜我不能使用相机,因为相机是针对整个舞台设置的。 - Karmar
你对此有何看法?我能否为某个容器设置相机,而不是整个舞台?谢谢。 - Karmar
更正一下,改变相机会改变模型空间映射到整个屏幕的方式,因此它并不是缩放单个容器的正确方法。 - P.T.

3

您需要创建一个InputMultiplexer,代码如下:InputMultiplexer myInputMultiplexer = new InputMultiplexer()

然后将您的GestureDetector和InputListener添加到InputMultiplexer中 (myInputMultiplexer.addProcessor())。

最后,您需要将多路复用器设置为主输入处理程序,代码如下:Gdx.input.setInputProcessor(myInputMultiplexer)


我认为 InputMultiplexer 只有在需要多路复用 Stage 外的监听器时才需要使用。提问者在舞台内有一个监听器和一个舞台外的监听器。 - P.T.
感谢您的答案。我使用InputMultiplexer解决了这个问题。 - Karmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接