2013-12-08 78 views
1

我試圖讓一個對象圍繞其中心點旋轉,但我注意到在旋轉過程中對象正在遠離其原始點。 這是我的代碼:圍繞中心點在ActionScript 3.0中的完美旋轉

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(); 

有什麼辦法沒有問題旋轉?

回答

3

嗯,我懷疑這種微妙的轉變是由精確度損失引起的嗎?

由於您從矩形中獲取矩陣,調整矩陣​​,然後重複應用它,可能會導致精度損失在整個過程中相加。

如果我將旋轉設置爲像90度這樣的數字(導致沒有小數點的東西?),轉換就會消失。

不確定如果你堅持這樣做旋轉(通過讀取顯示對象的矩陣,變換它,然後重新應用它),不知道如何解決這個問題......但還有其他方法可以旋轉形狀。我能想到的最簡單的方法是使用DisplayObject的旋轉屬性。這

例子如下(從您的代碼更改):

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(); 
+0

我通過類似的方式解決了這個 - 使用其他container.Thank你! – user2987971