如何将一个影片剪辑(包含许多帧)的内容复制到flash actionscript 3中的另一个影片剪辑?

时间:2009-09-11 21:03:37

标签: flash actionscript-3

我需要一种方法,使用as3动态地将一个影片剪辑的内容(包含许多帧)复制到另一个中。

这就是我尝试这样做的方式:

var table:Table = new Table(); //A custom class that extends MovieClip.
var swf:MovieClip = this.content.swf; //The movie clip I want to copy from.
for (var z:int = 0; z < swf.totalFrames; z++) //for every given frame of swf.
{
   swf.gotoAndStop(z);
   table.gotoAndStop(z);

   for (var i:int = 0; i < swf.numChildren; i++) //for every child of swf.
   {
      table.addChild(swf.getChildAt(i)); //copy child from swf to table.
   }
}

这不适用。它只复制第一帧。如何将swf的每一帧复制到桌面上,以便表格可以像swf一样播放和停止动画?

2 个答案:

答案 0 :(得分:2)

由于看起来您正在加载SWF,因此您还有另外一个选项......

使用URLoader而不是加载程序将SWF加载到ByteArray中。然后,您可以在每次需要SWF的新副本时创建Loader对象 - 您只需使用Loader的loadBytes方法将SWF拉出ByteArray。

答案 1 :(得分:1)

有几个原因导致这种情况不起作用,但必不可少的是,框架在运行时不会像您尝试访问它们那样存在。帧是一个作者时间的概念 - 当你在帧1上放置某些内容而在帧2上放置不同的内容时,在运行时Flash不会跟踪每帧的不同子集。汇编到SWF中的仅仅是指令,当从第1帧到第2帧时,应该自动添加或删除某些孩子,反之亦然。

如果您只想要一个给定MC的第二个副本,它通过与第一个相同的动画播放,您需要做的是复制对象本身。在AS2中,您可以使用duplicateMovieClip()API,但遗憾的是AS3没有等效的命令。相反,您必须使用以下形式的代码创建要复制的剪辑的新实例:

var swf:MovieClip = this.content.swf;
var swfClass:Class = swf.constructor;
var newSwf:MovieClip = new swf.constructor;

请注意,除非您尝试复制的对象(this.content.swf)在发布时附加到类(即选中“导出for ActionScript”复选框),否则这将无效。如果不是,那么据我所知,没有办法在AS3中复制它。如果是这种情况,我认为您可以做的最好的是一种解决方法 - 例如,您可以创建一个位图,而不是创建剪辑的副本,并且每个帧只是将原始剪辑的外观渲染为BitmapData,并将该数据绘制到“重复”位图中。