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