Плавное вращение к заданному углу

Сначала создадим Document class и добавим объект, которому мы будем задавать вращение. Еще нам нужен слушатель ENTER_FRAME для обновления параметров объекта и событие клика, по которому мы будем задавать объекту новый угол для вращения. Так же добавим кнопку, с помощью которой будем задавать скорость вращения для объекта.

Код BasicExample.as:

package {
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
    import flash.text.*;
    
    import com.bit101.components.*;
    
    
    [SWF(width="660", height="320", backgroundColor="0xeeeeee", frameRate="30")]
    public class BasicExample extends Sprite {
        private const RADIANS:Number = 180 / Math.PI;
        private const WIDTH:int = 660;
        private const HEIGHT:int = 320;
       
        private var unit:Unit;
        private var target:Sprite;
       
        private var angleButton:PushButton;
        private var angleLabel:Label;
       

        public function BasicExample() {
            target = new Sprite();
            target.x = WIDTH/2; target.y = HEIGHT/2;
            target.graphics.beginFill(0x666666);
            target.graphics.drawCircle(0, 0, 10);
            target.graphics.drawCircle(0, 0, 5);
            target.graphics.endFill();
            stage.addChild(target);
           
            addUnit();
           
            angleLabel = new Label(stage, 330, 40, "angle: "+unit.angle.toFixed(2));
            angleButton = new PushButton(stage, 285, 280, "speed: medium", angleButtonClicked);
            angleButton.tag = 6;
           
            stage.addEventListener(MouseEvent.CLICK, rotate);
            stage.addEventListener(Event.ENTER_FRAME, update);
        }
       
        private function addUnit():void {
            unit = new Unit();
           
            unit.x = WIDTH / 2;
            unit.y = HEIGHT / 2;

            stage.addChild(unit);
        }
       
        private function angleButtonClicked(event:MouseEvent):void {
            if (angleButton.tag == 6) {
                angleButton.label = "speed: slow";
                angleButton.tag = 12;
            }
            else if (angleButton.tag == 12) {
                angleButton.label = "speed: fast";
                angleButton.tag = 3;
            }
            else if (angleButton.tag == 3) {
                angleButton.label = "speed: medium";
                angleButton.tag = 6;
            }
           
            unit.torgue = angleButton.tag;
        }
       
        private function rotate(event:MouseEvent):void {
            target.x = stage.mouseX; target.y = stage.mouseY;
           
            var dx:Number = target.x - unit.x;
            var dy:Number = target.y - unit.y;
           
            unit.angle = -Math.atan2(dx, dy) * RADIANS;
        }
       
        private function update(event:Event):void {
            angleLabel.text = "angle: "+unit.angle.toFixed(2);
           
            unit.update();
        }
    }
}

Теперь создадим наш объект. У объекта будет свойство angle, в котором будет храниться угол на который нужно повернуться и свойство torgue, которое будет отвечать за скорость поворота. Чем меньше значение torgue, тем быстрее объект будет поворачиваться. В методе update мы будем проверять равен ли текущий угол значению angle и, если нет, будем высчитывать новое значение для поворота.

Код Unit.as:

package {
    import flash.display.Sprite;
    

    public class Unit extends Sprite {
        private const RADIANS:Number = 180 / Math.PI;
        public var angle:Number = 0;
        public var torgue:int = 6;
       
        
        public function Unit() {
            graphics.beginFill(0xff0060);
            graphics.drawCircle(0, 0, 20);
            graphics.endFill();
            graphics.beginFill(0xc00000);
            graphics.drawCircle(0, 0, 10);
            graphics.endFill();
            graphics.beginFill(0xff0060);
            graphics.drawRect(-10, 10, 20, 20);
            graphics.endFill();
        }
       
        public function update():void {
            if (rotation != angle) {
                if (angle > rotation + 180) angle -= 360;
                if (angle < rotation - 180) angle += 360;
               
                rotation += (angle - rotation) / torgue;
            }
        }
    }
}

Тестируем: