【问题标题】:LibGDX Image rotation issueLibGDX 图像旋转问题
【发布时间】:2020-03-29 14:57:38
【问题描述】:

我在旋转图像时需要帮助解决一个小问题(图像类)。

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

我希望当球体的角度是 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 来纠正,但是球体会比我的手指慢得多.

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

【问题讨论】:

  • 我相信你看错了。您期望用户的手势/手指准确地停在 90 以触发新行为。行为会有所不同是 89、90 还是 91?
  • 不,它不一定要停在 90 的倍数,它可以经过 90 并继续转动,直到它到达下一个 90 的倍数并再次发生事件,我说的是倍数90,因为这是我能想到知道何时启动某个动作的唯一方法
  • 那么如果监听器收到 94,你可以算出你超过 90 的球体。然后触发更改
  • 我试过了还是不行,你说的我明白了,但是我无法正确转码
  • 我无法真正快速设置一个 android 环境。因此,请检查以下内容:首先发生的两个事件?好像很拖沓。您需要一种方法来跟踪最后一个学位。从 91 到 170 的更改不应该触发更改。通过两者之间的差异,您可以确定是否已跨越 90 * x

标签: java android libgdx


【解决方案1】:

建议你把之前的角度存起来,对比之前和新的角度,看看是否已经过了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;
}

【讨论】:

  • 这是制作我需要的东西的基础,现在可以使用了,谢谢!!!
猜你喜欢
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多