在 libgdx 中确定平底锅的抛掷

Determining a fling from a pan in libgdx

我正在使用 LibGDX 开发游戏,但我无法从 pan 中确定 fling

我的GestureListener:

@Override
public boolean fling(float velocityX, float velocityY, int button) {
    //if (velocityX > 1000f) {
    // I can use this to exclude slow pans from the executing a fling
        System.out.println("Flinged - velocityX: " + velocityX + ", button: " + button);
    //}
    return false;
}

@Override
public boolean pan(float x, float y, float deltaX, float deltaY) {
    // but there doesn't seem to be a way to have this not fire on a fling
    System.out.println("Panned - deltaX: " + deltaX);
    return false;
}

@Override
public boolean panStop(float x, float y, int pointer, int button) {
    System.out.println("Pan Stop - pointer: " + pointer + ", button: " + button);
    return false;
}

问题是,如果 panfling 都触发。我知道 fling 基本上是快速的 pan,但我需要能够确定这两种手势,以便我可以分别处理每个手势。

一种简洁的提问方式是,如何为 flingpan 提供独特的操作?

在我看来,最合理的解决方案是使用 longPress 将一些 布尔值 标志设置为 'enter the panning mode' 当不长按的情况下滑动只会是关于放纵。

我是这样看的:

    //the flag for checking if pan mode entered
    boolean PAN = false;

    @Override
    public boolean longPress(float x, float y) {
        PAN = true;
        return false;
    }

    @Override
    public boolean fling(float velocityX, float velocityY, int button) {
        if(!PAN) {
            System.out.println("Flinged - velocityX: " + velocityX + ", button: " + button);
        }
        return false;
    }

    @Override
    public boolean pan(float x, float y, float deltaX, float deltaY) {
        if(PAN) {
            System.out.println("Panned - deltaX: " + deltaX);
        }
        return false;
    }

    @Override
    public boolean panStop(float x, float y, int pointer, int button) {
        if(PAN) {
            PAN = false;
            System.out.println("Pan Stop - pointer: " + pointer + ", button: " + button); 
        }
        return false;
    }

当然,如果 longPress 对于您的目的而言太长,您可以使用 GestureDetector 实例

setLongPressSeconds(float longPressSeconds) 方法来更改它