2010-02-20 81 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); 
}