显然,即使我已经通过微积分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
(看起来更简单,我意识到我可以将它缩短为一个return语句):
direction = Math.atan2(player.x - this.x, player.y - this.y);
return (int) Math.toDegrees(direction);
我认为找到最短旋转的方法对两者都有效。我已经尝试了一些试验和错误的事情,我只是难倒了。 帮助我毫无价值的编程技巧!任何帮助表示赞赏!
修改 我实际忘记提到的是我指向鼠标。 因此,如果我的鼠标与我的'image'(即播放器)的角度为200,并且播放器当前面向19, 我如何确定它应该变为200还是下降到0,转移到360并继续下降到200.
DOUBLE EDIT:
所以我有一个我想要的工作版本,但由于某种原因,最终和当前的旋转关闭了180,它导致我的角色永远不会停止抽搐。
明天我将不得不继续努力。由于我的精灵最初旋转的方式,我必须在最后从currentRotation
减去90.
TRIPLE EDIT: 好的,所以我的增量和减量语句被反转,因此它试图超过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。
答案 0 :(得分:3)
if (finalRotation >= 180) finalRotation = 360 - finalRotation;
对于任何180°或以上的角度,这将反转方向。