动态嵌入源

时间:2010-02-07 04:04:16

标签: flex flash actionscript-3 actionscript

是否可以动态嵌入源。而不是这样做

[Embed(source = '../../../../assets/levels/test.xml')]

我可能会做这样的事情

var src = '../../../../assets/levels/test.xml'
[Embed(source = src )]

2 个答案:

答案 0 :(得分:2)

元数据注释中的任何内容都不可能是动态的:/。也就是说,您无法将变量放入元数据注释中。如果可能的话,会有很多很酷的可能性。所以你的第一个选择是直接嵌入xml的唯一方法。

但是,您可以编写一个自定义元数据解析器,找出如何加载(不嵌入)您的xml文件。类似的东西:

[LoadFile]
public var source:String = "../../../../assets/levels/test.xml";

我会像下面的代码那样实现(现在就写这个,还没有测试过)。然后你会通过像MyMetadataUtil.process(this)之类的东西“处理”你的课程。有很多方法可以做到这一点。

public function extractMetadata(target:Object):void
{
    var description:XML = flash.utils.describeType(target);
    var tag:String = "LoadFile"
    var metadata:XMLList = description.accessor.metadata.(@name == tag);
    metadata += description.variable.metadata.(@name == tag);
    var i:int = 0;
    var n:int = metadata.length();
    // usually called a 'directive'
    // holds values from metadata annotation
    var token:Object = {};
    for (i; i < n; i++)
    {
        metadataXML = metadata[i];
        token.property = metadataXML.parent().@name;
        // token.source = myClass.source;
        token.source = target[token.property];
        var request:URLRequest = new URLRequest(token.source);
        var loader:URLLoader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, loader_completeHandler);
        loader.addEventListener(IOErrorEvent.IO_ERROR, loader_ioErrorHandler);
        loader.load(request);
    }
}

protected function loader_completeHandler(event:Event):void
{
    event.currentTarget.removeEventListener(event.type, loader_completeHandler);
    trace("SUCCESSFULLY LOADED FILE!");
}

protected function loader_ioErrorHandler(event:Event):void
{
    event.currentTarget.removeEventListener(event.type, loader_ioErrorHandler);
}

那些东西会进入一些util / manager / processor类。然后在代码中的任何位置,您都可以使用:

[LoadFile]
public var source:String = "myFile.xml";

这可能是动态的。查看the Swiz Framework以获取有关如何实现自定义元数据处理器的一些示例源代码。甚至更好,Openflux's MetaUtil。一旦你设置了一次,你可以在代码中做一些硬核。使编码变得有趣而快速。

希望有所帮助, 兰斯

答案 1 :(得分:0)

您的用例基本上就是为什么我创建了向Flex SWF添加额外帧的能力,这些SWF被视为延迟加载的模块。而不是嵌入您的级别,而是在主应用程序之后将其流式传输。

-frame上的文档很稀疏。抱歉!这是一些外部的东西,它链接回我写的东西和Alex Harui写的。祝你好运!

http://www.richinternet.de/blog/index.cfm?entry=FF295F89-DAD8-CCDC-960413842BC0D478