所以显然,即使我已经完成了微积分 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。