AS3嵌入swf元件库,如何访问指定的资源

来源:互联网 发布:公众号助手电脑版 mac 编辑:程序博客网 时间:2024/05/17 06:29

It’s been a long-time without a post. Part of the reason for that has been starting work at a new job (which involves a commute), and part has been that as part of my new job, I was actually encouraged to spend time playing World of Warcraft. To me, that’s like taking a crowbar to Pandora’s Box and having a peek inside. I learned quite a lot, but have also played just a few too many Warsong Gulches.

Back to work, and I was doing a little prototyping this evening, when I came across a familiar problem: InAS3 we can use

1
2
3
4
[Embed(source="asset.swf", symbol="symbol")]
private var symbolClass:Class;
var symbol:MovieClip = new symbolClass();

to embed a symbol from an art SWF in what is probably a code-builtSWF. That’s great, but what if you want to embed an entire SWF?

1
2
3
4
[Embed(source="asset.swf")]
private var assetClass:Class;
var asset:MovieClip = new assetClass();

looks like it should do the trick, but you can’t access any of the information within the asset. That’s a real pain, the reason for which is pretty convoluted. I remembered working around this problem in the past, and happily managed to unearth a long-forgotten treasure in my codebase, which I thought I’d share (having rapidly refactored it to use as3-signals, naturally).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.alecmce.util
{
    importorg.osflash.signals.Signal;
    importmx.core.MovieClipAsset;
    importflash.display.Loader;
    importflash.display.LoaderInfo;
    importflash.display.MovieClip;
    importflash.events.Event;
    publicclass UnpackEmbed
    {
        privatevar _ready:Signal;
        privatevar _asset:MovieClipAsset;
        privatevar _content:MovieClip;
        publicfunction UnpackEmbed(assetClass:Class)
        {
            _asset = new assetClass();
            _ready = new Signal(UnpackEmbed);
            var loader:Loader = Loader(_asset.getChildAt(0));
            var info:LoaderInfo = loader.contentLoaderInfo;
            info.addEventListener(Event.COMPLETE, onLoadComplete);
        }
        privatefunction onLoadComplete(event:Event):void
        {
            var info:LoaderInfo = LoaderInfo(event.target);
            info.removeEventListener(Event.COMPLETE, onLoadComplete);
            _content = MovieClip(info.loader.content);
            _ready.dispatch(this);
        }
        publicfunction get content():MovieClip
        {
            return _content;
        }
        publicfunction get ready():Signal
        {
            return _ready;
        }
        publicfunction get asset():MovieClipAsset
        {
            return _asset;
        }
    }
}

When you embed a SWF in this way then instantiate it, Flash somehow conspires to create aMovieClipAsset with a Loader inside, which will be ‘loading’ the already-embedded content. The content is not available immediately (it may be sometimes, I have encountered cases where it was not), so you have to wait for anEvent.COMPLETE to be fired before you can access it. This class exposes a signal that informs you when the content is ready. It could probably be more rigorous, such as including anisComplete flag, but it serves my purposes, when used in the following manner:

1
2
3
4
5
6
7
8
9
10
[Embed(source="asset.swf")]
private var assetClass:Class;
asset = newUnpackEmbed(assetClass);
asset.ready.addOnce(onAssetReady);
private function onAssetReady(asset:UnpackEmbed):void
{
    // now we can access the asset.content!
}
 
转自:http://alecmce.com/as3/embed-asset-gotcha
参考:https://github.com/login?return_to=%2Frobertpenner%2Fas3-signals
原创粉丝点击