【问题标题】:Actionscript 3 - Rotating one object towards anotherActionscript 3 - 将一个对象旋转到另一个对象
【发布时间】:2015-09-17 02:01:44
【问题描述】:

我正在开发一款 2D 平面格斗游戏,试图设计敌方 AI。 AI 非常简单:将敌人转向玩家,然后向前飞行。我已经设置了一个函数,它获取玩家的位置并返回敌人应该尝试实现的旋转值以直接向他们飞行,如下所示:

        public function getFlyAngle( player:PlaneGeneric ):Number
    {
        var playerX:Number = player.x;
        var playerY:Number = player.y;
        var xDistance:Number = playerX - x;
        var yDistance:Number = playerY - y;
        var slope:Number = yDistance/xDistance;
        var angle:Number = 180/Math.PI * Math.atan(slope);

        if(slope < 0 && yDistance < 0 || 
           slope > 0 && yDistance > 0)
            angle += 90;
        else if(slope < 0 && yDistance > 0 ||
                slope > 0 && yDistance < 0)
            angle += 270;

        return angle;
    }

这将返回一个介于 0(包括)和 360(不包括)之间的值,表示当直接在玩家平面上飞行时,rotateReference 对象的旋转应该是多少。

问题在于转动它的功能:我只是让它将当前旋转与它需要飞行的角度进行比较,然后添加或减去我想要的固定量 (9) 以使当前旋转旋转更接近所需的旋转。

public function turnTowardsPlayer( player:PlaneGeneric ):void
    {

        var angleToPlayer:Number = getFlyAngle( player );
        var rotation360:Number = rotateReference.rotation;
        if(rotateReference.rotation < 0)
            rotation360 = (360 - (rotateReference.rotation * -1) );

        trace("angleToPlayer: " + angleToPlayer + ", rotation360: " + rotation360);

        if(angleToPlayer - 9 <  rotation360 && rotation360 < angleToPlayer + 9);
        else if(rotation360 > angleToPlayer)
        {
            rotateReference.rotation -= 9;
            if(currentFrame == 1)
                gotoAndStop (totalFrames);
            else
                prevFrame();
        }
        else if(rotation360 < angleToPlayer)
        {
            rotateReference.rotation += 9;
            if(currentFrame == totalFrames)
                gotoAndStop(1);
            else
                nextFrame();
        }

当玩家飞过敌机时出现问题,并且 angleToPlayer 值突然从 360 跳到 ~0。因为 0 远小于平面的 300~ 旋转值,所以它开始旋转很长的距离以再次尝试匹配角度。

这似乎是一个简单的问题,但我一直在努力解决它很长时间,我觉得我需要一双新的眼睛来帮助我编写修复程序。

感谢您的宝贵时间。

【问题讨论】:

  • 旋转有点混乱,因为 eventho 度数是 0-360,旋转返回 -180 到 180。尝试将 angle 转换为那个,这里超级好 explanation

标签: actionscript-3 rotation trigonometry angle


【解决方案1】:

如果角度差大于 180,则减去 360。

示例.... 350 - 10 = 340(你知道这超过半个圆)所以减去... 340 - 360 = -20(你想要的实际差异)

希望对您有所帮助。请记住,您始终可以在最终出现在同一个位置的圆圈上加上或减去 360 b/c!

【讨论】: