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

时间:2015-02-27 03:15:34

标签: actionscript-3 rotation

我有一把枪和一名球员。我想约束枪的角度,这样玩家就不会把枪抬高太多或太低。当鼠标朝右时,播放器和枪转向右侧,如果鼠标朝左,则播放器和枪向左转。当它朝右时,我想把枪限制在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;
        }

1 个答案:

答案 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;
    }
}