如何在 AS3 中限制旋转角度?

How do I constrain an angle from rotating in AS3?

我有枪有玩家。我想限制枪的角度,这样玩家就不会把枪举得太高或太低。当鼠标面向右侧时玩家和枪转向右侧,如果鼠标面向左侧则玩家和枪转向左侧。当枪面向右时,我想将其限制在 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° 到 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;
    }
}