LibGDX 图片旋转问题

LibGDX Image rotation issue

我在旋转图像(图像 class)时遇到了一个小问题,需要帮助。

想法是旋转一个球形图像,移动是通过触摸和拖动手指,可能是顺时针也可能不是顺时针,到目前为止这是正确的。

我希望当球体的角度是 90 的倍数时发生一些事情,问题是当我用手指旋转球体时有时速度太快以至于球体的角度并不总是通过90 的倍数,例如如果它是 87,当我移动手指时它会变成 94 而不会碰到 90。

这是我的拖动旋转代码

tapeImage.addListener(new DragListener() {
        int initDegree;

        @Override
        public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
            initDegree = (int) new Vector2(x, y).sub(new Vector2(tapeImage.getOriginX(), tapeImage.getOriginY())).angle();
            return true;
        }

        @Override
        public void touchDragged(InputEvent event, float x, float y, int pointer) {
            int touchDegree = (int) (new Vector2(x, y).sub(new Vector2(tapeImage.getOriginX(), tapeImage.getOriginY()))).angle();
            tapeImage.rotateBy(touchDegree - initDegree);
        }
    });

我知道捕获这个的最好方法是将旋转增加 1 但这不会跟随手指速度,所以我想知道是否有更好的方法来捕获旋转事件,感谢您的帮助.

更新

我制作了一个快速图像,以便能够轻松地表示我需要的东西:

情况:(灰色球体表示黄色球体当前的角度)我顺时针转动黄色表盘,当黄色球体的角度为90的倍数时,会发生事件x,你可以在事件发生时继续旋转球体,所以如果你继续旋转,你将到达下一个 90 的倍数,在该位置将再次发生相同的事件,我使用 rotateBy 方法将角度量添加到对象的当前角度,问题是如果我将球体移动得太快,它的角度跳跃会阻止它达到 90 的倍数,正如我之前所说,这可以通过简单地增加 1 乘 1 来纠正,但球体会比我的手指。

我需要的是当球体的角度朝向这 4 个边之一时发生事件,无论您移动球体的速度有多快,也许使用 90 的倍数检测它不是最好的方法知道角度在哪一侧,或者我应该使用 rotateBy 以外的方法?

我建议你把之前的角度存起来,然后对比一下之前的角度和新的角度,看是否过了90的倍数:

int previousDegree = 0;
@Override
public void touchDragged(InputEvent event, float x, float y, int pointer) {
    int touchDegree = (int) (new Vector2(x, y).sub(new Vector2(tapeImage.getOriginX(), tapeImage.getOriginY()))).angle();
    tapeImage.rotateBy(touchDegree - initDegree);
    if(previousDegree < 90 && tapeImage.getRotation() >= 90) {
        // 90 degrees passed, put code
    } else if (previousDegree < 180 && tapeImage.getRotation() >= 180) {
        // 180 degrees passed, put code
    } else if (previousDegree < 270 && tapeImage.getRotation() >= 270) {
        // 270 degrees passed, put code
    } else if (previousDegree < 360 && tapeImage.getRotation() >= 360) {
        // 360 degrees passed, put code
    }
    previousDegree = touchDegree;
}