2011-08-21 64 views
1

請幫我,我的客戶正在殺我!actionscript 3動畫抖動問題

這裏是一個鏈接:http://aradon.co.il/test/circles.html

現在你看到圓是如何抖!我的客戶不會像這樣批准它。

有什麼可以導致的?

它建造這樣有enterFrame事件

和6圈,每圈有這樣的

一個一流的呼叫路徑:

private var _aPosition:Number = 0; 

    public function get aPosition():Number 
    { 
     return _aPosition; 
    } 

    public function get aRadians():Number 
    { 
     return 180/Math.PI * _aPosition; 
    } 

    public function set aPosition(value:Number):void 
    { 
     _aPosition = value % 360; 

     if(parentPath) 
     { 
      x = Math.cos(aRadians) * (parentPath.width/2); 
      y = Math.sin(aRadians) * (parentPath.height/2); 
     } 
    } 

不知道怎麼去繞了一圈路徑。

現在路徑分類有enterFrame事件驗證碼:

private function this_enterframe(e:Event=null):void 
    { 
     for(var i:int = 0; i < numCircles; i++) 
     { 
      getCircleAt(i).aPosition += direction == RIGHT ? -speed : speed; 


     } 
    } 

上圓的圖像動態,也是文本,但它在顫抖之前,我加入他們。

的幀率是30我也試過25 20 40,它搖晃?

請給我一點線索。

UPDATE: 我在圈內類的構造函數中添加:

 z = 1 

像@Sean藤原建議在有大的起色

這裏是一個鏈接:http://aradon.co.il/test2/circle.htm

但鋼客戶對我說,鋼鐵不好。

回答

0

因爲它聽起來就像你在忙亂之中,嘗試把這個在Path構造:

z = 1; 

你可以看到它現在做的子像素渲染如果你設置了speed = 0.00001

此外,我看到你在路徑對象中設置cacheAsBitmap = true。這隻對性能不利。

+0

我嘗試也,聲音整蠱(; – ygaradon

+0

怎麼敢給你投下來!!!!!!!!!!! – ygaradon

+0

z = 1伎倆給大改進!!!檢查:http://aradon.co.il/test2/circle.htm – ygaradon

0

嘗試在每個移動的DisplayObject上設置cacheAsBitmaptrue。這可能會消除你的動畫。

如果你的圈子是位圖,那麼你也可以嘗試轉動平滑。

+0

我試過在圓圈或主類中的任何地方,或在路徑中,它不工作。 :( – ygaradon

0

務必確保您的xy位置是整數,有沒有這樣的事,作爲一個半象素但是Flash試圖讓反正這一點.. * 嘆*

應該爲四捨五入爲簡單的xy值:

x = Math.round(Math.cos(aRadians) * (parentPath.width/2)); 
y = Math.round(Math.sin(aRadians) * (parentPath.height/2)); 
+0

它只是讓他們更難搖! – ygaradon

1

cacheAsBitmap可能有點幫助,如果你在Circle類設置。如果你把它放在主要課程上,它不會幫助,而且實際上可能會受到傷害。當將其設置在DisplayObject的子對象沒有改變時,您可以從cacheAsBitmap獲得最佳提升,因此它可以緩存一次,然後僅在舞臺周圍翻譯該對象。如果孩子正在移動(就像你的parent那樣),那麼它必須在每一幀重繪和重新緩存該元素,並且不會提高性能。 cacheAsBitmap在具有複雜矢量圖形的元素上非常有效,這些圖形很難重繪但很少發生變化。

我不認爲四捨五入你的x和y值會有幫助,我從來沒有太多的問題設置分數x,y。對於矢量圖形來說,它通常在子像素放置方面做得非常好,對於位圖而言,它通常以我期望的方式工作。

我想你可能想使用一些獨立於幀率的動畫。現在您的代碼的結構已經構建,每一幀渲染您正在移動特定的度數。這意味着,如果幀率因任何原因而口吃,那麼你仍然會移動相同數量的像素。

這裏是我會去的方向:

首先你輸入框事件處理程序獲取一些更新。 getTimer()返回自swf啓動以來的當前毫秒數。因此,通過記住我們渲染的lastTime並減去currentTime,我們應該能夠確定從上一幀開始已經過去了多少毫秒。然後,我們可以使用該時間來更新我們的圈子,而不是任意的速度/距離。

private var lastTime:int; 

private function this_enterframe(e:Event = null):void { 
    var currentTime:int = getTimer(); 
    var elapsedTime:int = currentTime - lastTime; 
    lastTime = currentTime; 

    for(var i:int = 0; i<numCircles; i++) 
    { 
     getCircleAt(i).updatePosition(elapsedTime, direction) 
    } 
} 

然後在您的Circle類,我們應該能夠計算出多遠,應該的時間長度期間(在這種情況下,我已經進入了它的速度每秒,它應該移動的弧度數)已經移動。

喜歡的東西:

public class Circle extends MovieClip { 

    // Set the default speed to 10 degrees per second 
    public const DEFAULT_SPEED:Number = 10 * Math.PI/180; 

    private var _radiansPerSecond = Circle.DEFAULT_SPEED; 
    private var _rotationPosition:Number = 0; 

    public function updatePosition(elapsedTime:int, direction:*):void { 
     var chng:Number = _radiansPerSecond * (elapsedTime/1000) * (direction == RIGHT ? -1 : 1); 
     _rotationPosition += chng; 
     this.x = Math.cos(_rotationPosition) * (parentPath.width/2); 
     this.y = Math.sin(_rotationPosition) * (parentPath.height/2); 
    } 
} 

使用弧度而不是度和動態找出一個圓圈應該移動多遠基礎上經過自上次渲染,我想你應該能夠減輕搖晃的時間之間你看到了。

+0

我嘗試...謝謝 – ygaradon

+0

感謝您提供非常有用的信息,但它不解決它 – ygaradon

-1

e.updateAfterEvent();

但要使用此功能,您需要使用Timer類。

這會在事情發生時增加平滑度。

+0

hello ...下降評論爲downvote ... – Benny

0

我得到這個,如果我嘗試動畫文字。所以,要解決它,我只是分開文本(單擊文本並按兩次CTRL + B)。

這些小男人的形象是分開的嗎?嘗試選擇一個,並打破它(按CTRL + B)。另外,圓圈內的文字,如果是靜態文字,只要試着打破它看看是否能修復震動。

0

將您的圈子繪製成位圖,然後應用平滑。