[转]AS3复制可视对象

一,复制舞台上的影片剪

方法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复制可视对象

时间: 2024-12-13 14:45:51

[转]AS3复制可视对象的相关文章

通过序列化复制整个对象

用到的所有的类都要实现Serializable接口 public class Address implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private String state; private String province; private String city; public Address(String s,String p,String c){ this.sta

设计模式之原型模式——复制建立对象实例

有一段时间没看书了,之前去参加了一个省上的比赛,马马虎虎吧--得了一个二等奖.不过感觉现在的比赛都有点水啊~哎,废话不多说,切入正题. 当我们在建立一些对象实例时,通常会使用new 关键字来进行实例化. 但有时候不靠指定类名的方式就能产生对象实例,此时不使用类来建立对象实例,而是复制对象实例另建一个新的对象实例. 通常这种需求发生在以下几种情况: 种类过多不方便整理成类时 不容易利用类产生对象实例时 希望把框架和所产生的对象示例分开时 下面我们用一个例子来看看. 需要创建五个JAVA文件: Pr

不可视对象的自动实例化BUG

PB有个隐藏BUG会占用内存,影响效率. 先来做个例子吧 (1)创建一个不可视对象n_base,勾选Autolnstantiate属性 初始化事件constructor里面写messagebox('constructor','PB-BUG--constructor') 销毁事件destructor里面写messagebox('destructor','PB-BUG--destructor') (2)创建一个窗口w_1 (3)w_1封装一个方法of_test_bug1里面写 if 1=1 then

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

复制整个Model需要实现NSCopy协议,可以想象是非常麻烦的一件事情,今天我跟大家分享一个不需要你做任何操作的复制Model对象的方法,不过,首先你得先去下载开源代码FastCoder辅助才行. 源码如下: NSObject+ObjectCopy.h 与 NSObject+ObjectCopy.m // // NSObject+ObjectCopy.h // FastCoder // // Created by YouXianMing on 15/1/3. // Copyright (c)

C++学习体会--引用方式复制类对象

C++学习体会--引用方式复制类对象 引用的重要性实际体现在函数的形参和函数的返回值.一般引用也只是出现在这两个地方. 引用方式的好处,如果是体现在形参,在使用函数的时候,实参必定会初始化形参,如果不加引用,系统会创建实参的副本将值传递给形参,这样会造成资源额外的占用.为了节省资源的占用,通过一种引用的方式,达到这个效果,因为引用知识将实参的地址给了形参,处理形参,如同处理实参. 下面将给出程序使用的例子:引用的重要性体现在形参上 #include <iostream> using names

AS3动态获取对象类名及类的方法,getDefinitionByName,getQualifiedClassName,getQualifiedSuperclassName

首先先告诉大家,我要讲的是flash.utils包中的 getDefinitionByName,getQualifiedClassName,getQualifiedSuperclassName 可能帮助文档写的过于专业,程序底子差的不一定能看明白,我用我理解的,通俗的讲一遍给大家听.. 1.getDefinitionByName 如果你已知这个类的类名类路径,但是你又没办法得到这个类的原型,那么可以通过该函数,将已知的类名类路径转换为类的原型,然后还可以将得到的类原型进行实例化,比如: var

as3 性能之对象池技术

优化 Adobe® Flash® Platform 的性能:http://help.adobe.com/zh_CN/as3/mobile/index.html 为什么使用对象池? 因为FLASH是托管的GC清理资源,具体什么时候清理只有GC知道,那么我们的游戏的性能就......... 例如:游戏里点击按钮会加载一张图片,再次点击图片,会销毁图片. 那么如果用户不停的点击,会执行不断的加载 显示 销毁.内存就会很难控制. 摘自Adobe的一段 http://help.adobe.com/zh_C

OpenSCAD通过循环快速复制几何对象

OpenSCAD支持变量和循环,从而可以快速复制出大量的几何对象并且按照递归的方式进行布局. 循环的变量可以是枚举.区间和矢量对象,循环体支持几何对象构建.坐标平移与旋转.交并差等操作. 循环的递归变量:     Vector(矢量): for (variable=<vector>) {     <do_something> - <variable> is assigned to each successive value in the vector }     Ran

Effective C++:规定12:不要忘了复制的对象时,它的每一个组成部分

(一个) 继承制度的声明: class Date {...}; class Customer { public: ... private: string name; Date lastTransaction; }; class PriorityCustomer : public Customer { public: PriorityCustomer(const PriorityCustomer& rhs); PriorityCustomer& operator=(const Priorit