0

我正在尝试(到目前为止没有成功)以编程方式增加和减少舞台上对象的比例。有一个 Grow 按钮 (grow_btn) 和一个 Shrink 按钮 (shrink_btn),它们随着时间的推移增加和减少选定对象(redObject、greenObject 或 blueObject)的 scaleX 和 scaleY 属性。

我遇到的问题似乎是随机的,有时只有一个属性(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);
    }
4

3 回答 3

2

将补间对象移到侦听器函数之外,并且不要对增长()和收缩()使用不同的补间对象。我认为你的问题是你没有在应用新的补间之前破坏以前的补间,所以他们互相踩踏。

var tweenScaleX:Tween;
var tweenScaleY:Tween;

你的 grow() 和 shrink() 方法都应该使用这两个补间变量,而不是在方法中创建补间变量(即使补间尚未完成,当函数完成时,它们也可用于垃圾回收)。当你调用 grow() 时,tweenScaleX 和 tweenScaleY 都被分配了新的补间对象。如果在grow() 完成之前单击了收缩按钮,则shrink() 方法将开始,并且在grow() 期间分配的补间将基本上被“销毁”,以便为新的收缩补间让路。

此外,您的问题可能与 AS3 的垃圾收集有关。提供的第一个答案说代码工作正常,但由于性能和内存可用性,垃圾收集因计算机而异。内存密集型 Flash 应用程序会更频繁地执行垃圾收集,但在具有大量内存和性能的机器上,它可能根本不会发生。正如我上面提到的,由于您是在 grow() 和 shrink() 函数内创建补间变量,因此它们的范围仅在该函数内。当函数完成时,在函数内部创建的变量就可以进行垃圾回收了。如果发生垃圾收集,即使这些补间尚未完成补间(并且“完成”事件永远不会触发),您的补间对象也将被销毁。通过将补间变量移到示例中的函数之外(或使它们成为类中的类成员),您将范围移动到父对象,因此只要该父对象存在,补间就会存在。垃圾收集的变化是从 AS2 到 AS3 的最重要但可能最不为人所知的变化之一。作为开发人员,您可能拥有大量 RAM,因此垃圾收集并不频繁(或者只要有足够的内存来容纳所有内容,则不存在),但在生产中,您的用户可能会遇到奇怪的行为,因为项目被垃圾收集以释放RAM,但这些项目在其他地方被引用,因为你认为它们仍然存在并且代码对你来说很好。

于 2010-02-21T06:00:45.703 回答
1

你的代码是正确的。正常工作。在转换面板中检查你的电影剪辑的比例,它们应该设置为 100 100。

于 2010-02-20T23:51:08.227 回答
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);
}
于 2012-02-20T16:44:47.870 回答