Создание класса динамически в ActionScript
Позвольте мне представить проблему в первую очередь. Мне нужно загрузить все изображения, которые я использовал в своем проекте, без встраивания. Изображения присутствуют либо в скинах, либо в виде значков для элементов на деревьях. Я столкнулся с классом IconUtility здесь, я смог изменить его и использовать его для деревьев, но проблема в том, что мы не можем использовать iconutility для одного и того же компонента, чтобы установить 2 разных скина (например, для кнопки - upskin downskin). Я не смог придумать обходной путь с иконописью. Можно ли симулировать встраивание и динамически создавать класс и возвращать класс во время выполнения?
2 ответа
Самая простая вещь для выполнения этих вещей - создать один / несколько SWF-файлов, содержащих ваши ресурсы, загрузить их, а затем извлечь классы оттуда (то есть из загруженного домена приложения SWFS) ...
Есть несколько решений для этого:
- хардкор версия для загрузки этих изображений в
ByteArray
с помощью URLLoader, а затем создание новогоByteArray
, это будет SWF-файл, содержащий встроенные ресурсы и необходимые инструкции для связи их с классами... возможно, вы захотите взглянуть на swfassist в spark... - немного более простой и производительный (поскольку вы делаете это только один раз), это сделать это на сервере... здесь вы можете
- просто используйте гибкий компилятор
- использовать swfmill
- использовать некоторые библиотеки для манипулирования SWF, например, Ming
- сделай сам, вручную...:)
надеюсь, это поможет
редактировать: второе решение касается создания ресурсов на сервере, использования подходящего инструмента... или кодирования инструмента самостоятельно, но это была скорее шутка...:) ... я понял, ссылка на компилятор flex было неправильно... идея состояла в том, чтобы просто подключить его к вашему веб-серверу, а затем скомпилировать какой-нибудь ActionScript, который будет выполнять встраивание... так что вы бы сгенерировали один файл ActionScript, например:
package {
import flash.display.Sprite;
import flash.utils.describeType;
public class Assets extends Sprite {
[Embed(source='asset_1_Location')]
public static var asset_1:Class;
[Embed(source='asset_2_Location')]
public static var asset_2:Class;
...
[Embed(source='asset_n_Location')]
public static var asset_n:Class;
public function Assets() { }
public static function getAll():Object {
var ret:Object = { };
for each (var x:XML in describeType(Assets).variable.(@type=="Class")) {
var name:String = x.@name;
ret[name] = Assets[name];
}
return ret;
}
}
}
затем скомпилируйте его с помощью компилятора flex... при загрузке извлеките данные с помощью LoaderInfo::applicationDomain.getDefinition("Assets").getAll(), который даст вам карту ключ-значение со всеми необходимыми классами...
с другими инструментами, это будет работать по-другому, но я надеюсь, что это проясняет, как это должно работать...
на сервере вам нужен сервис, который будет создавать эти SWF-файлы активов и кэшировать их... так что вы отправляете некоторый запрос POST, например, с массивом JSON файлов / изображений, которые вам нужны, и он выдаст Вы вернули SWF... сервер должен делать соответствующее кэширование, конечно...
надеюсь, теперь это помогает...:)
Greetz
back2dos
Это было то, что я искал... К сожалению, автор утверждает, что он не смог использовать его для скинов кнопок