встраивание источников динамически - PullRequest
0 голосов
/ 07 февраля 2010

возможно ли встраивать источники динамически. вместо этого

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

Возможно, я мог бы сделать что-то вроде этого

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

Ответы [ 2 ]

2 голосов
/ 07 февраля 2010

Ничто в аннотациях метаданных не может быть динамическим: /. То есть вы не можете помещать переменные в аннотации метаданных. Если бы это было возможно, было бы так много классных возможностей. Таким образом, ваш первый вариант - единственный способ встраивать 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);
}

Этот материал будет входить в класс утилит / менеджеров / процессоров. Тогда в любом месте вашего кода вы можете использовать это:

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

И это может быть динамичным. Проверьте Swiz Framework для примера исходного кода о том, как реализовать пользовательские обработчики метаданных. Или еще лучше, MetaUtil Openflux . Как только вы настроите это один раз, вы можете делать некоторые жесткие вещи в своем коде. Делает кодирование веселым и быстрым.

Надеюсь, это поможет, Lance

0 голосов
/ 11 февраля 2010

Ваш вариант использования - в основном, поэтому я создал возможность добавлять дополнительные кадры в Flex SWF, которые рассматриваются как модули с поздней загрузкой. Вместо встраивания вашего уровня, добавьте его после основного приложения.

Документация на -frame редкая. Сожалею! Вот некоторые внешние вещи, которые ссылаются на то, что я написал, и Алекс Харуи написал. Удачи!

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

...