Использование внешних SWF-файлов в приложении Flex - дублирование MovieClip? - PullRequest
1 голос
/ 22 марта 2009

Я работаю над приложением Flex, которое использует много объектов, например, Светодиоды, лампочки, датчики созданы во Flash. Внутренне объекты состоят из нескольких небольших мувиклипов и имеют собственную логику внутри. Одним из начальных требований было то, что объекты должны быть загружены во время выполнения, поэтому они были экспортированы как SWF, а не SWC. Однако мы столкнулись с проблемой, когда пытались дублировать загруженный SWF. Оказалось, что класс MovieClip не имеет ни конструктора копирования, ни метода, который позволил бы нам клонировать существующий MovieClip. Таким образом, мы бы каждый раз загружали объект с жесткого диска, что связано с большими накладными расходами. Возможно ли, что язык, такой как ActionScript 3, не имеет такого механизма? Мы что-то упустили? Если нет, то я прав, что единственным решением является использование Flash Component Kit, создание некоторых пользовательских компонентов и включение их в качестве SWC во время компиляции?

Ответы [ 3 ]

1 голос
/ 22 марта 2009

После загрузки мувиклипа можно ли использовать getDefinitionByName (), как показано здесь?

http://livedocs.adobe.com/flex/3/langref/flash/utils/package.html#getDefinitionByName()

0 голосов
/ 13 мая 2009

Другое решение:

        private function duplicateImg(sourceLoaderInfo:LoaderInfo, target:Image):void
    {
        var ba:ByteArray = sourceLoaderInfo.bytes;          
        var dupCliploader:Loader = new Loader();

        dupCliploader.contentLoaderInfo.addEventListener(
          Event.COMPLETE, bytesLoaded);

        dupCliploader.loadBytes(ba);
    }

    private function bytesLoaded(event:Event):void
    {           
    var mc:MovieClip = event.currentTarget.content as MovieClip;

    _img.source = mc;
    _img.width = mc.width;
    _img.height = mc.height+5;                  
    }
0 голосов
/ 23 марта 2009

Вы правы в том, что не существует встроенного способа дублирования видеоклипа. Однако есть обходные пути. На мой взгляд, самый простой способ - дать классы movieclips.

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

Преимущество в том, что теперь у вас есть класс, из которого вы можете инициировать объекты.

Нет, когда вы берете один из видеоклипов, вы можете скопировать его следующим способом:

public function DuplicateDisplayObject(dO:DisplayObject):DisplayObject
{
    if(dO == null)
        return null;
    var dOClass:Class = Object(dO).contructor;
    return DisplayObject(new dOClass());
}

Предполагается, что вы действительно можете сначала получить один из видеоклипов. И имейте в виду, что это не копирует состояние мувиклипа. Еще одно важное замечание: это работает, только если вы связываете мувиклипы с классами. Классы не должны существовать (Flash создаст для вас пустые классы).

Другие решения могут быть:

  • Компиляция против классов без включая их (см. тег "external-library-path" для гибкий компилятор), и загрузить их в время выполнения (от SWF).
  • Компиляция против классов как RSL (Runtime Share Library) SWC будет загружен во время выполнения.

У Adobe больше информации о том, как это сделать, ее легко найти на их веб-сайте.

Более экзотическим решением было бы скопировать байт-код объекта. Не уверен, что это сработает с чем-то в списке отображения, не правильно.

О решении, использующем getDefinitionByName (): Если я правильно помню, вам все равно нужно предоставить поддельные классы movieclips, поскольку getQualifiedClassName возвращает только класс MovieClip. Но я могу ошибаться.

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