1

我正在嵌入一个 swf 文件,该文件在其时间线上有一些子项。像这样:

[Embed(source="assets/skyscraper200x600.swf")]
private var Skyscraper  :Class;

swf 中的所有子对象都有一个实例名称,我在 Flash CS5 中创建 swf 时仔细检查了该名称。我正在尝试按如下名称访问这些孩子:

_bg = MovieClip(new Skyscraper());
_pig = MovieClip(_bg.getChildByName("chara_pig"));
_arrow = MovieClip(_bg.getChildByName("arrow_banner"));

但是,_pig 和 _arrow 最终都为空。

更奇怪的是,当我在调试器中查看 Skyscraper 对象时,它显示了一个相当奇怪的类名和一个 Loader 作为其唯一的孩子(而它又没有孩子)。这是怎么回事?

.

如果我不嵌入 swf,我可以像上面那样访问它们,而是使用 Loader 加载它。但在这种情况下我不能这样做。我需要嵌入瑞士法郎。

那么,如何访问嵌入式 swf 的子项?

我说的不是访问嵌入式 swf 库中的类,而是时间轴上的实例。

4

3 回答 3

4

这是一个解决方案。您还可以查看帮助我找到此解决方案的步骤(describeType 是您的朋友):

public class Demo extends Sprite {

    [Embed(source="test.swf")]
    private var Test:Class

    public function Demo() {
        //first guess is that embed SWF is a MovieClip
        var embedSWF:MovieClip = new Test() as MovieClip;
        addChild(embedSWF);

        //well, emebed SWF is more than just a MovieClip...       
        trace(describeType(embedSWF));//mx.core::MovieClipLoaderAsset
        trace(embedSWF.numChildren);//1
        trace(describeType(embedSWF.getChildAt(0)));//flash.display::Loader

        var loader:Loader = embedSWF.getChildAt(0) as Loader;

        //the content is not already loaded...
        trace(loader.content);//null


        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(){
            var swf:MovieClip = loader.content as MovieClip;
            var child:MovieClip = swf.getChildByName("$blob") as MovieClip;
            //do nasty stuff with your MovieClip !
        });
    }
}
于 2012-06-05T09:28:40.900 回答
1

在本教程的末尾http://jadendreamer.wordpress.com/2010/12/20/flash-as3-embedding-symbols-from-external-swf-game-tutorial 有一个如何完成的示例

于 2012-06-04T17:43:02.393 回答
0

一种解决方案是将 swf 嵌入为八位字节流并重构其字节。 但是,我似乎记得在某处读过,如果您只是将 mimeType 设置为“application/x-shockwave-flash”,您会得到一个正常工作的 MovieClip。

于 2012-06-04T17:13:47.450 回答