2010-02-20 127 views
0

我試圖(迄今不成功)以編程方式增加和減少舞臺上的對象的比例。有一個Grow按鈕(grow_btn)和一個Shrink按鈕(shrink_btn),可以隨着時間的推移增加和減少選定對象(redObject,greenObject或blueObject)的scaleX和scaleY屬性。Actionscript 3.0 Tween錯誤

我遇到的問題似乎是隨機的,有時只有一個屬性(scaleX或scaleY)會改變,而另一個不會。另外,補間函數的目標和原始大小不能正確調整。例如:1.0幾乎是舞臺上的對象的兩倍。

//Imports 
import fl.transitions.Tween; 
import fl.transitions.easing.*; 

//Constants And Variables 
const starRotationAngle:Number = 0.5; 
const starSpeed:Number = 2; 

var moveForward:Boolean = true; 
var selectedObject:MovieClip; 

//Event Listeners & Functions 
star_mc.addEventListener(MouseEvent.CLICK, rotateStar); 
function rotateStar(e:MouseEvent):void 
    { 
    star_mc.rotation += 5; 
    } 

addEventListener(Event.ENTER_FRAME, starMove); 
function starMove(e:Event):void 
    { 
    if (star_mc.x >= stage.stageWidth + star_mc.width) 
     {moveForward = false;} 
    else if (star_mc.x <= stage.x - star_mc.width) 
     {moveForward = true;} 

    if (moveForward == true) 
     { 
     star_mc.x += starSpeed; 
     star_mc.rotation += starRotationAngle; 
     }  
     else 
     { 
     star_mc.x -= starSpeed; 
     star_mc.rotation -= starRotationAngle; 
     } 
    } 

redObject.addEventListener(MouseEvent.CLICK, changeSelectedObjectVariable); 
greenObject.addEventListener(MouseEvent.CLICK, changeSelectedObjectVariable); 
blueObject.addEventListener(MouseEvent.CLICK, changeSelectedObjectVariable); 
function changeSelectedObjectVariable(e:MouseEvent):void 
    { 
    selectedObject = e.currentTarget as MovieClip; 
    } 

grow_btn.addEventListener(MouseEvent.CLICK, grow); 
function grow(e:MouseEvent):void 
    { 
    var tweenGrowX:Tween = new Tween(selectedObject, "scaleX", None.easeIn, 1.0, 2.0, 3.0, true); 
    var tweenGrowY:Tween = new Tween(selectedObject, "scaleY", None.easeIn, 1.0, 2.0, 3.0, true); 
    } 

shrink_btn.addEventListener(MouseEvent.CLICK, shrink); 
function shrink(e:MouseEvent):void 
    { 
    var tweenShrinkX:Tween = new Tween(selectedObject, "scaleX", None.easeIn, 2.0, 1.0, 3.0, true); 
    var tweenShrinkY:Tween = new Tween(selectedObject, "scaleY", None.easeIn, 2.0, 1.0, 3.0, true); 
    } 

回答

2

將補間對象移到偵聽器函數之外,並且不要使用不同的補間對象來放置grow()和收縮()。我認爲你的問題在於,在應用新補間之前,你並沒有破壞以前的補間,所以他們正在相互踩踏。

var tweenScaleX:Tween; 
var tweenScaleY:Tween; 

你成長()和收縮()方法應該都使用的替代方法中創建補間變量(這使得它們可用於垃圾收集,當函數結束即使Tween在這兩個吐溫變量未完成)。當您調用grow()時,tweenScaleX和tweenScaleY都被分配了新的補間對象。如果在grow()完成之前單擊縮小按鈕,則shrink()方法將開始,並且在grow()期間分配的補間將基本上被「銷燬」以爲新的縮放補間讓路。

此外,您的問題可能與AS3的垃圾收集有關。提供的第一個答案表明,代碼工作正常,但由於性能和內存的可用性,垃圾收集因計算機而異。內存密集的Flash應用程序將更頻繁地執行垃圾回收,但在具有大量內存和性能的盒子上,它可能根本不會發生。正如我上面提到的那樣,因爲您正在grow()和shrink()函數內創建補間變量,所以它們的作用域僅在該函數內。當函數完成時,函數內部創建的變量就有資格進行垃圾回收。如果垃圾收集發生,即使這些補間尚未完成補間(並且「完成」事件永遠不會觸發),您的補間對象也將被銷燬。通過在示例中的函數外部移動補間變量(或使其成爲類中的類成員),您將範圍移動到父對象,因此只要該父對象存在,補間就會存在。垃圾收集的改變是AS2到AS3中最重要但可能理解最少的變化之一。作爲一名開發人員,您可能擁有大量內存,因此垃圾回收並不經常(或者只要內存足夠容納所有內容),但在生產中,用戶可能會遇到奇怪的行爲,因爲垃圾回收會釋放垃圾內存,但這些項目被引用其他地方,因爲你認爲他們仍然存在,並且代碼適合你。從AS3開發者那裏可以看出,這是一個抱怨,他們指責Adobe進行更改,導致Flash不再獨立於平臺,但這是需要添加的一項重要功能,才能使Flash更加強大。

+0

謝謝。就是這樣。 :) – TheDarkIn1978 2010-02-21 07:09:49

+0

wpjmurray謝謝你的好解釋。我知道垃圾收集,但完全錯過了2個變量變量的範圍可能導致的問題。 – 2010-02-21 20:39:29

1

你的代碼是正確的。按原樣工作。在變換面板中檢查動畫片段的縮放比例,它們應該設置爲100 100.

+0

確定,尺度不是100×100。然而,我仍然看到奇怪的行爲,但我相信縮放比例在後臺被動畫中斷。當我刪除不斷的動畫時,所有縮放都是正確的。如果不移除常量背景動畫,首先縮放對象將是錯誤的。前幾次執行縮放功能時,所選對象將開始正確縮放,但突然寬度將停止,而高度繼續增加。我已更新我的原始帖子以顯示我的整個腳本。希望有一個解釋。 – TheDarkIn1978 2010-02-21 00:54:31

0

不要在函數內部聲明補間對象,它們會在補間結束之前被CG清除。 全球聲明。

不正確的:

function grow(e:MouseEvent):void 
{ 
    var tweenGrowX:Tween = new Tween(selectedObject, "scaleX", None.easeIn, 1.0, 2.0, 3.0, true); 
    var tweenGrowY:Tween = new Tween(selectedObject, "scaleY", None.easeIn, 1.0, 2.0, 3.0, true); 
} 

正確:

var tweenGrowX:Tween; 
var tweenGrowY:Tween; 
function grow(e:MouseEvent):void 
{ 
    tweenGrowX = new Tween(selectedObject, "scaleX", None.easeIn, 1.0, 2.0, 3.0, true); 
    tweenGrowY = new Tween(selectedObject, "scaleY", None.easeIn, 1.0, 2.0, 3.0, true); 
}