Получить класс из моей флэш-библиотеки динамически - PullRequest
3 голосов
/ 26 марта 2009

В моей флеш-библиотеке есть несколько растровых изображений, которые я экспортировал для Actionscript. Теперь в зависимости от получаемых Flashvars я хочу загрузить соответствующий растровый файл библиотеки.

Как динамически загрузить класс растровых изображений?

Ответы [ 5 ]

4 голосов
/ 26 марта 2009

По сути, чтобы прикрепить растровое изображение из библиотеки, вы должны сделать это:

import flash.display.BitmapData;
import flash.display.Bitmap;

var bmp:BitmapData = new ClassNameOfTheBitmap(0, 0);
var img = new Bitmap(bmp);

addChild(img);

Но так как вы не знаете имя класса, вам нужно будет создать класс динамически, как это:

import flash.display.BitmapData;
import flash.display.Bitmap;

var classNameFromFlashvars:String = "xxx";
var cls:Class = getDefinitionByName(classNameFromFlashvars) as Class;

var bmp:BitmapData = new cls(0, 0) as BitmapData;
var img = new Bitmap(bmp);

addChild(img);

В этом случае имя класса в свойствах связывания изображения будет xxx.

3 голосов
/ 26 марта 2009

Вам просто нужно использовать Loader и ApplicationDomain . Другие ответы и документация имеют хорошие примеров из них. После загрузки внешнего SWF вам просто нужно использовать что-то вроде этого, чтобы получить свой растровый класс:

loader.contentLoaderInfo.applicationDomain.getDefinition(className)  as  Class;

Редактировать: добавлены ссылки:)

2 голосов
/ 26 ноября 2011

Это имеет смысл. Причина в том, что компилятор не включает ни один из этих классов во «время компиляции», поскольку они никогда не используются, и он недостаточно умен, чтобы видеть, что имена классов могут динамически генерироваться во время выполнения. Таким образом, опубликованный SWF не имеет ни одного из этих классов. Однако после того, как вы даже «упомянули их» в коде, компилятор включит их.

Полагаю, это не идеальная архитектура для динамических имен классов. Возможно, им следует добавить какую-то силу для настройки компиляции?

0 голосов
/ 26 марта 2009

хорошо, поэтому я нашел очень уродливый способ не получить 'error ReferenceError: Ошибка # 1065: переменная team_xxx не определена'

Я сделал функцию в flex со всеми различными классами из .swc:

    private function logos():void
    {
        team_25502;
        team_25504;
        team_25508;
        team_25509;
        team_25511;
        team_25514;
        team_25517;
        team_25521;
        team_25530;
        team_25591;
        team_66036;
        team_66230;
        team_85230;
        team_89483;
        team_89484;
    }

Если у кого-то есть идея получше, и я уверен, что у кого-то есть идея, пожалуйста, оставьте комментарий.

0 голосов
/ 26 марта 2009

Я создал класс отл. MyClass

    public class MyClass extends MovieClip
    {
       private var testImg:Bitmap = new Bitmap();

       public function MyClass()
       {}

       public function set testImg(value:String):void
       {
          var cls:Class = getDefinitionByName('team_' + value) as Class;

          var bmp:BitmapData = new cls(0, 0);

          testImg = new Bitmap(bmp);

          addChild(testImg);
       }
    }

Например, элементы в моей библиотеке названы team_4534.

Действительно ли MyClass обнаруживает все ресурсы библиотеки? Разве я не должен импортировать их каким-либо образом или сказать, что они существуют?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...