在Actionscript 3.0中围绕中心点完美旋转

时间:2013-12-08 08:17:42

标签: actionscript-3 object rotation center

我试图让一个物体绕其中心点旋转, 但我注意到物体在旋转过程中远离其原始点。 这是我的代码:

import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.display.Shape;


var rectangle:Shape = new Shape  ;
var timer:Timer = new Timer(1,360);

rectangle.graphics.beginFill(0xFF0000);
rectangle.graphics.drawRect(0, 0, 100,100);
rectangle.graphics.endFill();
rectangle.x = 200;
rectangle.y = 200;
addChild(rectangle);

timer.addEventListener(TimerEvent.TIMER,rotateNOW);
timer.addEventListener(TimerEvent.TIMER_COMPLETE,rotationDone);

function rotateNOW(e:TimerEvent)
{
    var matrix:Matrix = rectangle.transform.matrix;
    var rect:Rectangle = rectangle.getBounds(rectangle.parent);
    matrix.translate(- (rect.left + (rect.width/2)), - (rect.top + (rect.height/2)));
    matrix.rotate((1/180)*Math.PI);
    matrix.translate(rect.left + (rect.width / 2), rect.top + (rect.height / 2));
    rectangle.transform.matrix = matrix;
}
function rotationDone(e:TimerEvent)
{
    timer.reset();
    timer.start();
    trace("x:",rectangle.x,"y:",rectangle.y); //to observe the x y changes

}

timer.start();

有没有办法旋转没有问题?

1 个答案:

答案 0 :(得分:3)

嗯,我怀疑是否可能因精度损失而导致细微变化?

由于您从矩形中获取矩阵,进行调整,然后反复重复应用,因此可能会导致精度损失,导致移位。

如果我将旋转设置为90度的数字(导致没有小数的东西?),那么移位就会消失。

如果您坚持以这种方式进行旋转(通过读取显示对象的矩阵,转换它,然后重新应用它),不确定如何解决这个问题...但是还有其他方法可以旋转形状。我能想到的最简单的方法是使用DisplayObject的rotation属性。

以下示例(从您的代码更改):

import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.display.Shape;

var rectangle:Shape = new Shape();
var timer:Timer = new Timer(1,360);

rectangle.graphics.beginFill(0xFF0000);
// shifted the x and y by half negative width and height so 0, 0 is at the center
rectangle.graphics.drawRect(-50, -50, 100, 100);
rectangle.graphics.endFill();
rectangle.x = 200;
rectangle.y = 200;
addChild(rectangle);

timer.addEventListener(TimerEvent.TIMER,rotateNOW);
timer.addEventListener(TimerEvent.TIMER_COMPLETE,rotationDone);

function rotateNOW(e:TimerEvent):void {
    rectangle.rotation++;
}

function rotationDone(e:TimerEvent):void {
    timer.reset();
    timer.start();
    trace("x:",rectangle.x,"y:",rectangle.y); //to observe the x y changes
}

timer.start();