一,复制舞台上的影片剪

方法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复制可视对象的更多相关文章

  1. 不可视对象的自己主动实例化BUG

    PB有个隐藏BUG会占用内存.影响效率. 先来做个样例吧 (1)创建一个不可视对象n_base,勾选Autolnstantiate属性 初始化事件constructor里面写messagebox('c ...

  2. 浅谈C++中对象的复制与对象之间的相互赋值

    C++对象的复制 有时需要用到多个完全相同的对象,例如,同一型号的每一个产品从外表到内部属性都是一样的,如果要对每一个产品分别进行处理,就需要建立多个同样的对象,并要进行相同的初始化,用以前的办法定义 ...

  3. 超简易复制Model对象(为后续备忘录设计模式博文做铺垫)

    超简易复制Model对象(为后续备忘录设计模式博文做铺垫) 复制整个Model需要实现NSCopy协议,可以想象是非常麻烦的一件事情,今天我跟大家分享一个不需要你做任何操作的复制Model对象的方法, ...

  4. java 复制Map对象(深拷贝与浅拷贝)

      java 复制Map对象(深拷贝与浅拷贝) CreationTime--2018年6月4日10点00分 Author:Marydon 1.深拷贝与浅拷贝 浅拷贝:只复制对象的引用,两个引用仍然指向 ...

  5. 复制Map对象:Map.putAll方法

    复制Map对象:Map.putAll方法 Map.putAll方法可以追加另一个Map对象到当前Map集合 package xmu.sxl; import java.util.HashMap; imp ...

  6. 【转载】C#通过Copy方法快速复制DataTable对象

    C#中的Datatable数据变量的操作过程中,可以通过DataTable的Copy方法快速复制当前的DataTable变量到新对象中,复制数据包含当前DataTable的结构信息如列名,同时也包含当 ...

  7. AS3游戏中可视对象上限及位图相关的内存消耗实测

    前些天连续做了一些测试,以加深对AS3的掌握和在项目中对 游戏 性能.效率优化方面的一些处理,有很多测试实际意义不大,都不过是证明一些猜想是正确的,除此没有什么. 但前天进行的一系列测试中,有一些对游 ...

  8. PHP写时复制, 变量复制和对象复制不同!!!

    2016年3月18日 15:09:28 星期五 一直以为PHP对象也是写时复制....... 其实: PHP的变量是写时复制, 对象是引用的 写时复制: $a = $b; 如果$b的内容不改变, $a ...

  9. AS3深拷贝数据对象(2)深拷贝VO对象

    Topic:对于用户自定义的VO对象进行深拷贝,一种VO对象的某属性可能是另一种VO对象的实例. 方法1:通过传说中的“AS3隐藏特性——ByteArray.writeObject和readObjec ...

随机推荐

  1. linux网络虚拟化

    图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN http://smilejay.com/2012/08/qemu-kvm-networking-m ...

  2. 3D数学 ---- 矩阵和线性变换[转载]

    http://blog.sina.com.cn/s/blog_536e0eaa0100jn7c.html 一般来说,方阵能描述任意线性变换.线性变换保留了直线和平行线,但原点没有移动.线性变换保留直线 ...

  3. JavaScript常用小技巧

    1.获取访问地址URL的参数 <script type="text/javascript"> var param = ""; var nowUrl ...

  4. 通过Java Api与HBase交互(转)

    HBase提供了Java Api的访问接口,掌握这个就跟Java应用使用RDBMS时需要JDBC一样重要,本文将继续前两篇文章中blog表的示例,介绍常用的Api. import java.io.IO ...

  5. xml与json 介绍

    一.JSON数据格式 1)概念:json是一种网络数据传输格式,有值/对象:{“A”:1,”B”:”2”…}词典:对象的序列:[,,,,,]数组两种数据类型 2)URLWithString 将字符串网 ...

  6. [HTML] CSS 语法

    CSS 实例 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明: 选择器通常是您需要改变样式的 HTML 元素. 每条声明由一个属性和一个值组成. 属性(property)是您希望设置的样 ...

  7. [ActionScript 3.0] AS3.0 将图像的Alpha通道转换为黑白图像(分离ARGB方式)

    import flash.display.BitmapData; import flash.display.Bitmap; /** * 将图像的Alpha通道转换为黑白图像(分离ARGB方式) */ ...

  8. 'libxml/tree.h' file not found

    看看Header Search Paths 为  '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Dev ...

  9. POJ1364 King-差分

    Description Once, in one kingdom, there was a queen and that queen was expecting a baby. The queen p ...

  10. PCI Express(四) - The transaction layer

    原文出处:http://www.fpga4fun.com/PCI-Express4.html 感觉没什么好翻译的,都比较简单,主要讲了TLP的帧结构 In the transaction layer, ...