Java 慢角旋转

Java 慢角旋转,java,slick2d,Java,Slick2d,所以很明显,尽管我已经通过了微积分3,我的trig还是让我非常失望(我甚至不能称之为trig,它只是基础数学)。 所以基本上我有一堆旋转的图像,我不希望它是瞬间的。 我知道如何使它旋转缓慢,但我不知道如何计算它应该转向哪个方向 因此,如果我想要转向的目标角度小于179度,请单向转向。 如果超过180度,则转向另一个方向。不确定我的措辞是否正确,但我基本上只想让它以最短的距离旋转。 我想是一枚寻的导弹吧 我有两种方法可以找到角度,一种方法是使用向量,如下所示: hero = new Vector2

所以很明显,尽管我已经通过了微积分3,我的trig还是让我非常失望(我甚至不能称之为trig,它只是基础数学)。 所以基本上我有一堆旋转的图像,我不希望它是瞬间的。 我知道如何使它旋转缓慢,但我不知道如何计算它应该转向哪个方向

因此,如果我想要转向的
目标
角度小于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
(这看起来更简单,我意识到我可以将其缩短为一个return语句):

我假设寻找最短旋转的方法对两者都适用。我已经尝试了一些尝试和错误的东西有一段时间了,我只是被难住了。 帮助我的编程技巧!感谢您的帮助

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

双重编辑: 所以我有一个我想要的工作版本,但由于某种原因,最终和当前的旋转被关闭了180度,这使得我的角色永远不会停止抽搐。 明天我还得做更多的工作。由于我的精灵最初的旋转方式,我必须在最后从当前旋转中减去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));
mouseX=input.getMouseX();
mouseY=input.getMouseY();
hero=新矢量2f(this.x,this.y);
目标=新矢量2f(mouseX,mouseY);
目标.sub(英雄);
//计算旋转
finalRotation=(int)target.getTheta();
如果(!(当前旋转=最终旋转-1)){
双时差;
if(当前旋转<最终旋转){
tempVal=最终旋转-当前旋转;
如果(临时值>180){
电流旋转-=.3*delta;
}否则{
电流旋转+=.3*增量;
}
}else if(当前旋转>最终旋转){
tempVal=当前旋转-最终旋转;
如果(温度<180){
电流旋转-=.3*delta;
}否则{
电流旋转+=.3*增量;
}               
}
}
如果(当前旋转<0)
电流旋转=359;
如果(当前旋转>360)
电流旋转=1;
此设置角度((int)(当前旋转+90));
输入的内容和向量来自Slick2D

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

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

哦,不。。。不可能那么简单。那会让我哭的@帕哈:哈哈。。。它甚至可能与
finalRotation=-finalRotation
一起工作,但是
360-finalRotation
将它很好地保持在0-360范围内。啊,太好了!谢谢你给了我一个简单的答案,我想不出来:(实际上我不确定这个方法是我想要的。我忘了在我的帖子中明确地说,我得到了一个指向鼠标的方向。所以如果鼠标与图像成200度角(我正在旋转的播放器)图像是19,我如何确定下降到0,从360开始,继续下降到200?你只需要最小的角度(见@Amadan的答案),还是需要知道旋转方向(顺时针或逆时针)这会产生最小的角度?我需要顺时针或逆时针旋转,这会产生最小的角度。就像,如果我想从0到60,我会正向移动(0到60),而不是反向移动(360到60)。
if (finalRotation >= 180) finalRotation = 360 - finalRotation;