2

所以显然,即使我已经完成了微积分 3,我的三角函数也让我非常失望(我什至不能称之为三角函数,它只是基本的数学)。所以基本上我有一堆旋转的图像,我不希望它是即时的。我知道如何让它缓慢旋转,但我不确定如何计算它应该转向的方向。

因此,如果target我要转向的角度低于 179 度,请向一侧转。如果超过 180 度,则转向另一个方向。不确定我的措辞是否正确,但我基本上只是希望它使用最短距离旋转。想想我想的寻的导弹。

我有两种寻找角度的方法,一种是使用向量,如下所示:

hero = new Vector2f(this.x, this.y);
target = new Vector2f(mouseX, mouseY);
target.sub(hero);

// Calculates the rotation
finalRotation = (int) target.getTheta();

另一种方法是使用atan2(看起来更简单,我意识到我可以将它缩短为一个返回语句):

direction = Math.atan2(player.x - this.x, player.y - this.y);
return (int) Math.toDegrees(direction);

我认为找到最短旋转的方法对两者都适用。一段时间以来,我一直在尝试一些反复试验的事情,但我很困惑。帮助我一文不值的编程技巧!任何帮助表示赞赏!

编辑: 我实际上忘记提到的是我指向鼠标。因此,如果我的鼠标与我的“图像” (即玩家)的角度为 200,并且玩家当前面向 19,我将如何确定它应该变为正值到 200 还是下降到 0,转移到 360 并继续下降到200。

双重编辑: 所以我有一个我想要的工作版本,但由于某种原因,最终和当前的旋转偏离了 180,这导致我的角色永远不会停止抽搐。明天我得加倍努力。currentRotation由于我的精灵最初旋转的方式,我必须从末尾减去 90 。

三重编辑: 好的,所以我将增量和减量语句反转,因此它试图超过 180,然后反转方向。我已经完善了!

mouseX = input.getMouseX();
mouseY = input.getMouseY();

hero = new Vector2f(this.x, this.y);
target = new Vector2f(mouseX, mouseY);
target.sub(hero);

// Calculates the rotation
finalRotation = (int) target.getTheta();

if(!(currentRotation <= finalRotation + 1 && currentRotation >= finalRotation - 1)) {
    double tempVal;

    if (currentRotation < finalRotation) {
        tempVal = finalRotation - currentRotation;

        if (tempVal > 180) {
            currentRotation -= .3 * delta;
        } else {
            currentRotation += .3 * delta;
        }
    } else if (currentRotation > finalRotation) {
        tempVal = currentRotation - finalRotation;

        if (tempVal < 180) {
            currentRotation -= .3 * delta;
        } else {
            currentRotation += .3 * delta;
        }               
    }
}

if (currentRotation < 0)
    currentRotation = 359;

if (currentRotation > 360)
    currentRotation = 1;

this.setAngle((int) (currentRotation+90));

输入的东西和向量来自 Slick2D。

4

1 回答 1

3
if (finalRotation >= 180) finalRotation = 360 - finalRotation;

这将反转 180 或以上的任何角度的方向。

于 2012-05-22T04:38:26.930 回答