AS3复制可视对象五板斧

news/2024/6/29 11:49:03 标签: function, class, 文档, 编译器, 图形
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

 一,复制舞台上的影片剪

 

class="MsoNormal" align="left" style="background:white; margin:0cm 0cm 0pt; line-height:21.6pt; text-align:left"> 方法1——反射方法:

class="MsoNormal" align="left" style="background:white; margin:0cm 0cm 0pt; line-height:21.6pt; text-align:left">

class="language-plain">var ClassRef:Class = getDefinitionByName(getQualifiedClassName(t_mc)) as Class;
var clone_mc:DisplayObject = new ClassRef();
addChild(clone_mc);

class="MsoNormal" align="left" style="background:white; margin:0cm 0cm 0pt; line-height:21.6pt; text-align:left">

class="MsoNormal" align="left" style="background:white; margin:0cm 0cm 0pt; line-height:21.6pt; text-align:left"> 方法2——构造器方法:

class="MsoNormal" align="left" style="background:white; margin:0cm 0cm 0pt; line-height:21.6pt; text-align:left">

class="language-plain">var ClassRef:Class = t_mc.constructor;
var clone_mc:MovieClip = new ClassRef();
addChild(clone_mc);

class="MsoNormal" style="margin:0cm 0cm 0pt">

class="MsoNormal" style="margin:0cm 0cm 0pt"> 

class="MsoNormal" style="margin:0cm 0cm 0pt">方法3——编译器自动生成类方法:

class="MsoNormal" style="margin:0cm 0cm 0pt"> 

class="MsoNormal" style="margin:0cm 0cm 0pt">    此方法是方法1的变种,它比方法1更加简单、粗暴、有效。下面我将为大家特别讲解一下这个方法:

class="MsoNormal" style="margin:0cm 0cm 0pt">    首先,在库中创建一个影片剪辑,随意绘制一个图形,然后在第一帧上加上一个单行注释符“//”;

class="MsoNormal" style="margin:0cm 0cm 0pt">    接下来,将刚才创建的影片剪辑拖到舞台上,创建一个示例,命名为“t_mc”;

class="MsoNormal" style="margin:0cm 0cm 0pt">    现在,重点来了,我们在主时间线上写下如下所示语句,然后按下Ctrl+Enter,仔细观察一下输出面板中输出的信息。

class="MsoNormal" style="margin:0cm 0cm 0pt">   

class="MsoNormal" style="margin:0cm 0cm 0pt">   

class="language-plain">trace(getQualifiedClassName(t_mc)); 


class="MsoNormal" style="margin:0cm 0cm 0pt">   

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

class="MsoNormal" style="margin:0cm 0cm 0pt"> 

class="MsoNormal" style="margin:0cm 0cm 0pt">   

class="language-plain">var clone_mc:DisplayObject = new Timeline_1();

addChild(clone_mc);

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

class="MsoNormal" style="margin:0cm 0cm 0pt">    忽忽!傻了吧,不能用new MovieClip来复制“d_mc”了吧!

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

class="MsoNormal" style="margin:0cm 0cm 0pt"> 

class="MsoNormal" style="margin:0cm 0cm 0pt">使用以上方法复制影片剪辑时需要注意:

  1. class="MsoListParagraph" style="margin:0cm 0cm 0pt 18pt; text-indent:-18pt">   必须在库中创建影片剪辑,并将库中的影片剪辑拖到舞台上创建了一个实例;
  2. class="MsoListParagraph" style="margin:0cm 0cm 0pt 18pt; text-indent:-18pt">   影片剪辑的帧上必须包含代码(注释也行,最简单的就是加一个单行注释符号“//”);

class="MsoListParagraph" style="margin:0cm 0cm 0pt 18pt; text-indent:0cm"> 

class="MsoListParagraph" style="margin:0cm 0cm 0pt 18pt; text-indent:0cm"> 

class="MsoListParagraph" style="margin:0cm 0cm 0pt; text-indent:0cm">二,复制Loader加载的swf

class="MsoListParagraph" style="margin:0cm 0cm 0pt; text-indent:0cm"> 

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

class="MsoListParagraph" style="margin:0cm 0cm 0pt; text-indent:0cm"> 

class="MsoListParagraph" style="margin:0cm 0cm 0pt; text-indent:0cm">方法1——ByteArray深度复制

class="MsoListParagraph" style="margin:0cm 0cm 0pt; text-indent:0cm"> 

class="language-plain">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);

class="tags" href="/tags/FUNCTION.html" title=function>function loadInitHandler(evt:Event):void
{
         var cloneLoder:Loader = new Loader();
         addChild(cloneLoder);
         cloneLoder.loadBytes(byteLoader.data);
}

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

class="tags" href="/tags/FUNCTION.html" title=function>function loadCompleteHandler(evt:Event):void
{
         loader.loadBytes(byteLoader.data);
}


class="MsoListParagraph" style="margin:0cm 0cm 0pt; text-indent:0cm"> 

class="MsoListParagraph" style="margin:0cm 0cm 0pt; text-indent:0cm">         简单原理:用URLLoader将外部的swf以二进制数据格式加载到ByteArray中,然后用Loader类的loadBytes去加载URLLoader中的ByteArray

class="MsoListParagraph" style="margin:0cm 0cm 0pt; text-indent:0cm"> 

class="MsoListParagraph" style="margin:0cm 0cm 0pt; text-indent:0cm"> 

class="MsoListParagraph" style="margin:0cm 0cm 0pt; text-indent:0cm">方法2——ApplicationDomain 运行时动态类复制

class="MsoListParagraph" style="margin:0cm 0cm 0pt; text-indent:0cm"> 

class="language-plain">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);

class="tags" href="/tags/FUNCTION.html" title=function>function loadInitHandler(evt:Event):void
{
         var ClassRef:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("TestClass") as Class;
         var clone_mc: MovieClip = new ClassRef();
         addChild(clone_mc);
}

class="MsoNormal" style="margin:0cm 0cm 0pt"> 

class="MsoNormal" style="margin:0cm 0cm 0pt">注意:

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

 


http://www.niftyadmin.cn/n/1710104.html

相关文章

AS3-E4X、QName

AS3-E4X(ECMAScript for XML) 1. AS3的XML相关类只有两个了:一个XML、一个XMLList,AS2时代的XMLNode已经被完全抛弃; 2. 记住以下术语: 简单内容XML(simplecontent),指没…

JSFL入门指导

JSFL入门 JSFL指Flash JavaScript,是JavaScript脚本文件,是用来扩展FlashIDE的重要工具。学会它、熟练使用它之后你会惊讶的发现,哇,原来可以这么高效率的做Flash啊!下面我们来看一看怎么使用JSFL: 不知道各…

AS3开发工具和资源站点

必备工具 Adobe Flash CS3/CS4Adobe Flash FlashPlayer Debugger8/9/10 常用工具Adobe Flex Builder2/3Adobe Flash Builder(Flex4)FlaseDevelop2/3 资源站点 1. Adobel Flash开发者中心http://www.adobe.com/devnet/flashhttp://www.adobe.com/devnet/flex/tourdeflexhttp://f…

如何编写AS程序——初学者第一课

AS脚本文件是文本文件,你可以使用任意的文本编辑工具编辑它并将它保存在任意位置。要用AS来控制Flash元素,那么就得将AS代码按照一定的规则跟Flash关联起来,一般而言,将AS代码跟Flash关联起来的方法有四种。第一,将AS代…

AS排序算法——给准备面试的朋友献点爱心

package {/*** 注意,此类仅仅是为了研究排序算法的效率而作.实际应用时请不要使用.因为AS3的数组本身提供了一个强大的sort函数,它* 的效率要远远高于本类中的几个函数。** 在冒泡排序、选择排序、插入排序这三个排序算法中冒泡排序的效率是最低的,其次是选择排序&a…

AS3 颜色操作函数库

package lib.base.maths{/*** 颜色转换函数库* <p>* 作者&#xff1a;Brant.Hu<br>* 日期&#xff1a;2009<br>*/publicclass CColorMath extends Object{/*** RGB颜色互补色减法混合* param color1* param color2* return* <p>* <listi…

交换显示层次

在AS中交换显示层次无外乎使用以下几个方法&#xff1a; 1. swapChildren(child1:DisplayObject, child2:DisplayObject); 2. swapChildrenAt(index1:int, index2:int);3. setChildIndex(child:DisplayObject, index:int); 4. addChild(child:DisplayObject); //将显示对象添加…

AS3-E4X(ECMAScript for XML)总结

一、AS3的XML相关类只有两个了&#xff1a;一个XML、一个XMLList&#xff0c;AS2时代的XMLNode已经被完全抛弃 二、记住以下术语&#xff1a; 简单内容XML&#xff08;simplecontent&#xff09;&#xff0c;指没有子节点的XML。以下示例是一个简单内容XML&#xff1a; var xm…