为什么Tween类在使用Flash AS3的for内部不起作用?

时间:2014-03-06 13:00:31

标签: actionscript-3 flash actionscript flash-cs6

问题


我正在尝试使用for命令与Tween进行Movieclips,如下所示:

for(var i:int = 0; i < mcArray.length; i++) {

    new Tween(mcArray[i], "x", Regular.easeOut, 0, 100, 1.0, true);

}

但它不起作用。我已尝试将代码更改为:

var tween:Tween = new Tween(mcArray[i], "x", Regular.easeOut, 0, 100, 1.0, true);

它也不起作用。

我无法使用setIntervalTimer,因为Movieclips应该同步,并且可能会导致问题。

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:0)

AS3 Tween引擎,非常糟糕:按设计,按性能等 如果您不能使用Greensock库进行动画制作,可以使用GTween,它是MIT License下的优秀补间引擎。即使没有支持和持续改进,引擎也比Adobe更好地 。

工作示例,启动后,如果将收集场景中心的每个对象:

package {

    import com.gskinner.motion.GTween;
    import com.gskinner.motion.easing.Sine;

    import flash.display.DisplayObject;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.geom.Point;

    public class StackOverflow extends Sprite {

        public function StackOverflow() {
            addEventListener(Event.ADDED_TO_STAGE, onAdded);
        }

        private function onAdded(e:Event):void {
            removeEventListener(Event.ADDED_TO_STAGE, onAdded);

            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;

            setup();
        }

        private function createDummyObjects(size:uint):Array {
            var result:Array = [], i:uint, object:Shape;
            for (i; i < size; ++i) {
                object = new Shape();
                object.graphics.beginFill(Math.random() * 0xFFFFFF);
                object.graphics.drawCircle(0, 0, 20);
                result[i] = object;
            }
            return result;
        }

        private function setup():void {
            var objects:Array = createDummyObjects(10);
            var i:uint, len:uint = objects.length, item:DisplayObject, middle:Point = new Point(stage.stageWidth >> 1, stage.stageHeight >> 1);

            for (i; i < len; ++i) {
                item = objects[i];
                item.x = Math.random() * stage.stageWidth;
                item.y = Math.random() * stage.stageHeight;

                addChild(item);

                new GTween(item, 1 + Math.random() * 4, {x: middle.x, y: middle.y}, {ease: Sine.easeInOut});
            }
        }

    }
}

答案 1 :(得分:0)

我尝试了你的确切代码,它运行得很好。您最初需要加载数组,而我没有看到您的代码。

试试这个:制作两个测试MovieClip并将'em放在舞台上,实例名称'boxA'和'boxR'然后运行此代码:

import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;

var A:Array = new Array();
A.push(boxB); A.push(boxR);

for(var i:int = 0; i < A.length; i++)
{

    new Tween(A[i], "x", Regular.easeOut, 0, 100, 1.0, true);

}

工作,没有?

答案 2 :(得分:0)

如果代码中的所有内容都正确并且代码运行正常,并且补间不起作用,那么这可能是由于Flash的垃圾收集器在它们完成之前杀死了补间程序。

我认为这个问题相对众所周知。我自己遇到过这个问题。这是一篇解释原因以及如何解决它的文章。 http://www.scottgmorgan.com/as3-garbage-collection-the-reason-your-tweens-are-ending-early/

基本上你要做的就是确保在代码中的某个地方引用补间。

以下是一些您可以尝试实际看到它的代码:

var mcs:Array = [];
var tweens:Array = [];

for (var j:int = 0; j < 50; j++) {
    for (var i:int = 0; i < 50; i++) {
        var mc:MovieClip = new MovieClip ();
        mc.graphics.beginFill (0xff0000);
        mc.graphics.drawRect (0, 0, 5, 5);
        mc.graphics.endFill ();
        mc.x = j * 6;
        mc.y = i * 6;
        mcs.push (mc);
        this.addChild (mc);

        new Tween (mc, "x", None.easeNone, mc.x, mc.x + 500, 2, true);
        //tweens.push (new Tween (mc, "x", None.easeNone, mc.x, mc.x + 500, 2, true));
    }
}

理论上,这段代码中的每一个红色方块应该向右偏移,但至少对我来说只有一半左右。但是,如果您注释掉第二行并取消注释最后一行,它现在应该可以工作,因为该数组包含对每个补间的引用。