我正在尝试使用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);
它也不起作用。
我无法使用setInterval
或Timer
,因为Movieclips
应该同步,并且可能会导致问题。
有办法做到这一点吗?
答案 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));
}
}
理论上,这段代码中的每一个红色方块应该向右偏移,但至少对我来说只有一半左右。但是,如果您注释掉第二行并取消注释最后一行,它现在应该可以工作,因为该数组包含对每个补间的引用。