CSK.Blog--个人原创Weblog

« 新版Flash网站效果图[2]连载:《windows亲手灭毒宝典》完结 »

Flash中共享库、atttachMovie和#initclip

好久好久没写教程了~一方面觉得最近自己也没学什么很有用的东东,不过今天这个还是要说说说的。

你是否值得看此文?

如果你遇到了下面的问题,那么此文对你可能有参考价值:

1.想了解Flash里面库元件中“连接”(Link)属性里面的为运行时共享导出、共享库URL、为运行时共享导入以及文件导入菜单中打开外部库这些功能的作用和用法

2.想实现如何让许多swf文件公用同一个swf文件中的库元件(运行的时候)

3.想实现用attachMovie加载其他swf文件库中的元件

4.想知道AS代码#initclip块的具体内涵

5.在编写用attachMovie加载其他swf文件库中的元件时遇到了问题

写本文的原因之一就是我在写自己Flash网站是也遇到了相同的困难,要让ReformUI能在外部加载的swf文件一面也使用,涉及的主要方法虽然外面也有介绍,但很多细节是没有公布的

由于时间关系,我不想讲一下细枝末节的东西,关于运行时共享的基本概念,大家如果还有不明白的就看adobe的官方教程:http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_14767

上面就是实现让不同swf公用一个库的方法,虽然在编辑模式下,那些公用的库文件就好像是属于各个swf文件各自的库,但实际上每个swf的库只是记录了共享库swf文件的url。在加载每个swf文件时,共享库swf文件会一同加载。

比如:

我在shared.fla中创建了元件mcA,然后再link里面选择了为运行时共享导出,且设置了共享库url为fla/shared.swf。然后把shared.fla发布至fla/shared.swf。作为一个共享库

然后再flaA.fla中采用“为运行时共享导入”引用了这个mcA元件,并发布到fla/flaA.swf

现在flashplayer加载flaA.swf会怎么样呢?

首先发掘flaA.swf中库元件mcA并不存在于本文件,而根据其url来源知道是来自于fla/shared.swf。这样flashplayer在flaA.swf需要用到mcA之前(往往为播放第一祯,即一开始加载时)先把fla/shared.swf加载到flaA.swf同一环境中,注意只是加载了库

这样就完成了库的共享能力,自然,fla/shared.swf中mcA的改变,会导致所有使用该库的swf中mcA的改变

下面就是共享库的利用和一些细节问题:

1.如何实现attachMovie加载其他swf文件

要知道这样一个事实,考虑下面的例子

main.swf中有元件mc_main,他存在于main.swf的库中,且连接(link)属性为在第一帧导出,导出符号为s_main

现在main.swf采用loadMovie加载了外部文件obj.swf到位置_root.loadobj。

对于obj.swf,其元件库中并不存在mc_main。

这样,对于无论是在obj.swf还是main.swf的as脚本,运行_root.attachMovie(s_main);总是成功,而_root.loadobj.attachMovie(s_main);总是失败。

原因就是attachMovie将传递给加载任务的MovieClip去执行,而与该脚本的所有者无关,因为obj.swf中不存在mc_main和其导出符号s_main,即使自身加载进了main.swf,在该MovieClip得执行区域中对s_main是不可见的。(这与AS对象不同!)

同理,如果只有obj.swf存在一个导出对象mcA,导出名s_obj,那么只有_root.loadobj.attachMovie(s_obj);才能成功运行。

要实现attachMovie加载其他库的对象,其实是不可能的,但有补救措施,那就是用上面的的共享库,这样对于所有swf文件,那些要加载的元件都存在于自身的运行区域了。

不过要注意一个问题:

考虑下面例子:

共享库shared.swf中共享出了元件mc,link属性里面是将“为ActionScript导出”属性钩上了。

main.swf用共享导入了mc,但是mc并没有出现在舞台上,而是在运行时用attachMovie加载到舞台。这样的做法如果不用共享库自然是可以的,但限于flash的实现方法,如果用共享库,这个attachMovie同样会执行失败,因为在加载main.swf时,没有任何祯引用共享库中的元件(AS代码还没有执行),flash player因而就不去加载shared.swf了。

解决办法就是把mc人为加入到舞台,今后的attachMovie才能生效!

但这样做显然是太麻烦了,所以可以在共享库shared.swf创建一个空的对象,如spacer_mc,采用共享导出。然后main.swf引入此元件。并放到舞台上,这样不影响正常播放(spacer_mc是空的,

2.我用attachMovie加载的mc自身又引用了共享库的其他元件,难道要将所有被mc引用的元件设为“为运行时共享导出”吗?

绝对不需要,考虑下面例子

共享库shared.swf中,有如下元件

mc_a,一个很普通的元件,没有导出符号,没有为运行共享导出

mc_b,采用了为ActionScript导出,导出符号为s_mc_b,但没有为运行共享导出

mc,采用了为ActionScript导出,导出符号为s_mc,采用了为运行时共享导出,引用了符号mc_a,同时自身又通过attachMovie去加载共享库的mc_b

在目标文件main.swf中

只引入了共享元件mc,mc_a和mc_b并没有引入,在运行时采用attachMoive加载mc(s_mc)。很幸运的,这样使可以正常工作的!

3.#initclip的细节问题

#initclip和#endinitclip的基本使用可以看Adobe教程,我说说一些细节

1.所有出现在#initclip和#endinitclip之间的代码都会在该swf被加载时执行。无论其所属的movieclip是否在舞台上。

比如main.swf库中有mc_a这个movieclip,但没有在舞台上出现过,甚至在运行中也没有用attachMovie去加载它,但在main.swf加载到flash player的时候,在第一祯运行前,mc_a中#initclip和#endinitclip之间的代码也会执行

2.如果前面提到的shared.swf共享库中有#initclip和#endinitclip,那么每当一个新的引用shared.swf共享库元件的Swf文件被载入播放器,#initclip和#endinitclip间的代码都回被重新执行了一遍

听不懂可以看例子:

shared.swf中有个mc_a,mc_b他们有#initclip和#endinitclip代码块。mc_b没有共享导出

main.swf在运行时用loadMovie加载了objA.swf和objB.swf,2这都共享引用了shared.swf中的mc_a

先加载objA.swf时,shared.swf也被加载,此时mc_a,mc_b的#initclip和#endinitclip代码块均被执行

再加载objB.swf是,shared.swf又被重新加载了一遍(只是库的加载),因而mc_a,mc_b的#initclip和#endinitclip代码块均又被执行了。

解决办法可以这样

#initclip

if (this.isLoaded == undefined)

{

this.isLoaded = true;

//你要写的代码

}

#initclip

--------------

好了。教程写道这里,希望对各位有用

  • quote 3.James
  • “1.所有出现在#initclip和#endinitclip之间的代码都会在该swf被加载时执行。无论其所属的movieclip是否在舞台上。”

    这句有误。在以下两种情况下#initclip和#endinitclip之间的代码才被执行:
    1、在库链接时选择了“在第一帧导出”。这样会在一加载swf时即执行。
    2、当没有选择“在第一帧导出”时,只有元件在舞台出现时才会被执行。


  • 6/22/2009 1:24:35 PM 回复该留言

发表评论:

注意:为了有效防止SPAM,任何含有http://字样的消息会被阻止发布同时,本站仅供技术交流,请不要讨论任何政治敏感话题或者低级趣味问题。

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)