我有一把枪和一名球员。我想约束枪的角度,这样玩家就不会把枪抬高太多或太低。当鼠标朝右时,播放器和枪转向右侧,如果鼠标朝左,则播放器和枪向左转。当它朝右时,我想把枪限制在160到-160之间。并且当它面向左侧时将枪限制在20和-20之间。所以它不会超过约束限制。
我有一个代码可以让它旋转360度,但我不确定如何在它到达某个点时停止旋转。
if (parent != null)
{
var dx = MovieClip(parent).crosshair.x - x;
var dy = MovieClip(parent).crosshair.y - y;
var angle = Math.atan2(dy, dx)/Math.PI * 180;
rotation = angle;
}
答案 0 :(得分:0)
好的,这就是发生的事情:
0°时的闪光旋转面朝上。因此右侧将从0°到180°,左侧将从0°到-180°。这很容易分开,因为右侧> 0和所有左侧< 0
但是,Math.atan2(dy,dx)计算一个不能直接分配给对象旋转的不同角度。而不是左侧和右侧,它是<上侧为0且> 0在较低的一侧。如果以这种方式计算旋转,那将是一团糟。
因此,atan计算必须顺时针移动90°才能匹配Flash旋转。这是通过转换参数来完成的,现在它看起来像Math.atan2(dx,-dy)。之后,计算出的角度和旋转角度将匹配。
var angle:Number = Math.atan2(dx, -dy) / Math.PI * 180;
if (angle < 0) { // facing left
if (angle > -30) angle = -30;
if (angle < -150) angle = -150;
} else { // facing right
if (angle < 30) angle = 30;
if (angle > 150) angle = 150;
}
这是不使用-dy而是使用dy的解决方案。 (由OP添加的代码我没有检查它:)
var angle = Math.atan2(dy, dx) / Math.PI * 180;
if (rotation > -180 && rotation < -90 || rotation > 90 && rotation < 180 )
{ // facing left
if (rotation > -150 && rotation < 0)
{
rotation = -150;
}
if (rotation < 120 && rotation > 0)
{
rotation = 120;
}
}
else
{
{ // facing right
if (rotation < -30)
{
rotation = -30;
}
if (rotation > 60)
{
rotation = 60;
}
}