Сначала создадим 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;
}
}
}
}
Тестируем: