【问题标题】:How do I constrain an angle from rotating in AS3?如何在 AS3 中限制旋转角度?
【发布时间】:2015-02-28 20:03:57
【问题描述】:

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

【问题讨论】:

  • 你的意思是 60 到 -60 当它面对的时候? 160 到 -160 给出 320 范围。面朝右是不行的,因为在某个时候你会开始面朝左,
  • 抱歉,我对轮换周期有点困惑。
  • 你知道我该如何实现吗?谢谢。
  • 您不必从字面上“停止”它。只需像您一样计算角度并根据限制检查它。我不记得 AS3 角度值是如何与方向对应的,但我们假设例如正确的方向是从 0 到 180。所以,如果您的角度在 (0..180) 范围内,那么您就面向右侧。现在,对于这个范围,您的限制应该是 30 和 150。您可以:if (angle < 30) angle = 30; if (angle > 150) angle = 150;。左侧方向也类似。
  • 奇怪了,左边不行。我尝试切换你给我的代码,。对于第二个代码,我将 > 切换为

标签: actionscript-3 rotation


【解决方案1】:

好的,这就是发生的事情:

0° 处的闪光灯旋转严格朝上。所以右侧将从 0° 到 180°,左侧将从 0° 到 -180°。这很容易分开,因为所有右侧 > 0 和所有左侧

但是,Math.atan2(dy, dx) 计算了一个不能直接分配给对象旋转的不同角度。不是左右两边,而是上边0。如果你这样计算旋转,那将是一团糟。

因此,为了匹配 Flash 旋转,必须将 atan 计算顺时针移动 90°。这是通过转换参数来完成的,现在它看起来像 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;
    }
}

【讨论】:

  • 谢谢,但是我的子弹和枪需要转90度,这很复杂。有没有另一种方法可以做到这一点而不必将所有东西都转动 90 度谢谢。
  • 哦,等等,我实际上只是使用了常规旋转。我会将我的代码添加到您的代码中。
  • 我一直在努力寻找这个解决方案。没有多少人使用此代码。所以,很难找到方法。你帮了我很多。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多