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