Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java libgdx中的手势检测器_Java_Android_Libgdx_Pinchzoom_Gesturedetector - Fatal编程技术网

Java libgdx中的手势检测器

Java libgdx中的手势检测器,java,android,libgdx,pinchzoom,gesturedetector,Java,Android,Libgdx,Pinchzoom,Gesturedetector,我是libgdx的新手。我有以下问题。我想为我的游戏做点缩放。为此,我在我的GameStage中有gesturedtectorlistener类 在GameStage中,我有手势检测器的以下代码: OrthographicCamera camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); this.setCamera(camera); GestureDetector gestur

我是libgdx的新手。我有以下问题。我想为我的游戏做点缩放。为此,我在我的
GameStage
中有
gesturedtectorlistener

GameStage
中,我有
手势检测器的以下代码:

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
时,拖动我的演员不起作用。我想用相机和
手势检测器进行一次收缩缩放,但它不会对拖动产生影响。我该怎么做

请帮忙!
谢谢。

您需要创建一个InputMultiplexer
InputMultiplexer myInputMultiplexer=new InputMultiplexer()

然后将GestureDetector和InputListener添加到InputMultiplexer(
myInputMultiplexer.addProcessor()


最后,您必须将多路复用器设置为主输入处理器,如下所示:
Gdx.input.setInputProcessor(myInputMultiplexer)

CodeNoob走在正确的道路上,但我认为您可能希望采用不同的结构

您可以使用安装全局
手势监听器
和舞台监听器:

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

另一件需要注意的事情是输入侦听器中所有
boolean
方法的返回值。返回“true”的任何一个都会将事件标记为“已处理”,并且多路复用器不会将事件传递给其对等方。此外,多路复用器中输入处理器的顺序也会有所不同(因为它可能会对底层输入处理器隐藏事件)。因此,在您的示例中,返回“true”的自动生成存根将“吃掉”一堆事件。如果此处理程序是多路复用器中的第一个处理程序,则会对该阶段隐藏事件。

我相信,
InputMultiplexer
仅用于在
阶段之外多路复用侦听器。提问者在台内有一位听众,台外有一位听众。谢谢你的回答。我解决了输入多路复用器的问题。谢谢!你是对的。“返回真值”是问题所在。现在拖动和缩放正在工作。但我希望缩放不会影响整个舞台,而是影响某些容器。我想我不能用照相机,因为整个舞台都有照相机。你觉得怎么样?我可以为某个容器而不是整个舞台设置摄像机吗?谢谢。正确,更改相机会更改模型空间映射到整个屏幕的方式,因此仅缩放一个容器并不合适。