码迷,mamicode.com
首页 > 其他好文 > 详细

[转]AS3复制可视对象

时间:2014-08-19 20:23:35      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:http   使用   io   strong   文件   数据   for   ar   

一,复制舞台上的影片剪

 

方法1——反射方法:

 

var ClassRef:Class = getDefinitionByName(getQualifiedClassName(t_mc)) as Class;

var clone_mc:DisplayObject = new ClassRef();

addChild(clone_mc);

 

方法2——构造器方法:

 

var ClassRef:Class = t_mc.constructor;

var clone_mc:MovieClip = new ClassRef();

addChild(clone_mc);

 

 

方法3——编译器自动生成类方法:

 

    此方法是方法1的变种,它比方法1更加简单、粗暴、有效。下面我将为大家特别讲解一下这个方法:

    首先,在库中创建一个影片剪辑,随意绘制一个图形,然后在第一帧上加上一个单行注释符“//”;

    接下来,将刚才创建的影片剪辑拖到舞台上,创建一个示例,命名为“t_mc”;

    现在,重点来了,我们在主时间线上写下如下所示语句,然后按下Ctrl+Enter,仔细观察一下输出面板中输出的信息。

   

    trace(getQualifiedClassName(t_mc));

   

    你 发现,输出结果是“_fla::Timeline_1 ”。出于对函数getQualifiedClassName的作用的清晰理解,你立刻就想到,这个 Timeline_1应该就是编译器自动为我们的库中的影片剪辑创建的类。我们貌似可以用这个类new出多个一样的影片剪辑来哦!是不是这样呢?我们来验 证一下:

 

    var clone_mc:DisplayObject = new Timeline_1();

    addChild(clone_mc);

 

    Ctrl+Enter, 你惊喜的发现,我们成功了!实验到这里,可能很多朋友已经兴奋地准备去写学习总结了。兄弟们,不要急,我们的实验还没完——现在,我们用同样的方法,再次 在库中创建一个影片剪辑。然后也将它拖到舞台上创建一个实例,取名为“d_mc”。接下来,我们将 trace(getQualifiedClassName(t_mc)); 语句中的“t_mc”改成“d_mc”。测试一下影片,这次输出的结果竟然是 “flash.display::MovieClip”。

    忽忽!傻了吧,不能用new MovieClip来复制“d_mc”了吧!

    咋解决这个问题呢?我给大家一点点提示:试试将库中那两个影片剪辑各取一个响亮的名字(名称),然后再看一下输出的类名是什么。

 

使用以上方法复制影片剪辑时需要注意:

  1.  必须在库中创建影片剪辑,并将库中的影片剪辑拖到舞台上创建了一个实例;
  2.  影片剪辑的帧上必须包含代码(注释也行,最简单的就是加一个单行注释符号“//”);

 

 

二,复制Loader加载的swf

 

         复制外部加载的swf是一个相对高级的操作,步骤比较多,过程相对复杂,要阐述清楚原理细节需要很大篇幅的文字,因此,这里我就偷懒不详细写说明了,纯用代码来说明问题,希望对看得懂的朋友起到抛砖引玉的作用。

 

方法1——ByteArray深度复制

 

var byteLoader:URLLoader = new URLLoader();

byteLoader.dataFormat = URLLoaderDataFormat.BINARY;

byteLoader.addEventListener(Event.COMPLETE, loadCompleteHandler);

 

var loader:Loader = new Loader();

loader.y = 200;

addChild(loader);

loader.contentLoaderInfo.addEventListener(Event.INIT, loadInitHandler);

 

function loadInitHandler(evt:Event):void

{

         var cloneLoder:Loader = new Loader();

         addChild(cloneLoder);

         cloneLoder.loadBytes(byteLoader.data);

}

 

byteLoader.load(new URLRequest("t.swf"));

 

function loadCompleteHandler(evt:Event):void

{

         loader.loadBytes(byteLoader.data);

}

 

         简单原理:用URLLoader将外部的swf以二进制数据格式加载到ByteArray中,然后用Loader类的loadBytes去加载URLLoader中的ByteArray。

 

 

方法2——ApplicationDomain 运行时动态类复制

 

var loader:Loader = new Loader();

loader.y = 200;

addChild(loader);

loader.contentLoaderInfo.addEventListener(Event.INIT, loadInitHandler);

var context:LoaderContext = new LoaderContext();

context.applicationDomain=ApplicationDomain.currentDomain;

loader.load(new URLRequest("t.swf"), context);

 

function loadInitHandler(evt:Event):void

{

         var ClassRef:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("TestClass") as Class;

         var clone_mc: MovieClip = new ClassRef();

         addChild(clone_mc);

}

 

注意:

  1.  以上两种复制方法,由于都需要加载swf文件,因此需要文件级别的本地安全性;
  2.   使 用第二种方法(ApplicationDomain)时,生成“t.swf”时必须为舞台添加文档类属性。添加的文档类可以是具体的外部as类,也可以仅 仅是一个名字。上例中我添加的文档名为”TestClass”, getDefinition("TestClass")中填的参数内容应该跟要复制的 swf的文档类名相同。
  3.  ApplicationDomain还有更多高级用法,有兴趣的高级AS程序员可以去研究一下。

下面放出作者地址与一段简洁的复制外部flash的代码

var byteLoader:URLLoader = new URLLoader();
byteLoader.dataFormat = URLLoaderDataFormat.BINARY;
byteLoader.addEventListener(Event.COMPLETE, loadCompleteHandler);
byteLoader.load(new URLRequest("a2.swf"));

function loadCompleteHandler(evt:Event):void
{        
         for(var i:int = 0;i < 10; i ++){
            var loader:Loader = new Loader();
            loader.x = i * 50;
            loader.loadBytes(evt.currentTarget.data);
            addChild(loader);
         }
         
}

 

转载自:http://hi.baidu.com/iscriptdada/item/30199d5e1d1df22194eb05ed#0

[转]AS3复制可视对象,布布扣,bubuko.com

[转]AS3复制可视对象

标签:http   使用   io   strong   文件   数据   for   ar   

原文地址:http://www.cnblogs.com/shuishenwuyu/p/3922818.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!