我试图让一个物体绕其中心点旋转, 但我注意到物体在旋转过程中远离其原始点。 这是我的代码:
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();
有没有办法旋转没有问题?
答案 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();