На скольких уровнях вы можете вложить SWF - будет ли работать 3 - как ребенок внутри родителя внутри бабушки и дедушки? - PullRequest
0 голосов
/ 21 декабря 2011

Код внизу этого поста вкладывает «проигрыватель» AS2 в приложение Flex (AS3). Посмотрите на часть с надписью «[AS2 player swf]». Этот проигрыватель AS2 SWF практически не имеет кода - только одна функция, которая загружает ресурс с удаленного сервера. Очень просто:

this.onLoad = function(){
    content.loadMovie("http://URL_TO_REMOTE_SWF");
};

И у него нет других активов. Всего один мувиклип - «контент».

Итак, у нас есть приложение Flex, которое загружает SW2 AS2, который загружает удаленный SWF. Нет кости. Удаленный SWF не загружается и не отображается. Об ошибках не сообщается.

Важно: приложение AS2 работает само по себе. Если я перейду к нему в моей файловой системе и дважды нажму, remote swf действительно загрузится и отобразит . Итак, я установил, что развернутый SW2-плеер AS2 работает и действительно загружает удаленные SWF-файлы. Кое-что о вложении этого игрока в приложение Flex создает проблему. Вам не разрешено делать это - 3 уровня вложенности swf (ребенок - родитель - дедушка)?

ОБНОВЛЕНИЕ: целевая загрузка удаленного SWF-файла и отображение в точном виде непосредственно во Flex (пропуская AS2-SWF). Таким образом, проблема не связана с несоответствием AVM1 / AVM2 между целевым содержимым и приложением Flex. Может быть проблема AVM1 / AVM2 с тем, как приложение Flex отображает swf AS2, но только когда оно содержит content.loadMovie ("http://URL_TO_REMOTE_SWF"). Загружает и отображает без этой строки.

ОБНОВЛЕНИЕ: Это приложение IOS, упакованное Flex, и поэтому на него накладываются ограничения ActionScript для динамически загружаемого кода. Но это не работает в обычном приложении Flex (не в комплекте с IOS), которое не подпадает под эти ограничения. СЛЕДУЮЩИЙ КОД ДОЛЖЕН РАБОТАТЬ КАК ДАЛЬШЕ, КАК Я МОГУ СКАЗАТЬ В РЕГУЛЯРНОМ ПРИЛОЖЕНИИ FLEX BROWSER.

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx"
               initialize="init()"> 
    <fx:Script>
        <![CDATA[           
            import mx.core.UIComponent;

            private var request:URLRequest = new URLRequest("[AS2 player swf]");
            private var loader:Loader = new Loader();

            private var myComponent:UIComponent = new UIComponent;  

            private function init():void{
                myComponent.percentHeight = 100;
                myComponent.percentWidth = 100;
                loader.load(request);
                myComponent.addChild(loader);
                player.addElement(myComponent);
            }           
        ]]>
    </fx:Script>

    <s:Group id="player"
             height="100%" width="100%"/>   

</s:Application>

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Поскольку все спрайты и мувиклипы являются как экранными объектами, так и контейнерами экранных объектов, теоретически вы можете сохранять их вложенными вечно. Конечно, существуют физические ограничения, но я не вижу причин, по которым должно быть какое-то ограничение, кроме памяти и вычислительной мощности (в какой-то момент обновление экрана станет вялым, а со временем ждать будет болезненно).

Я искал в Интернете, чтобы узнать, смогу ли я найти какую-либо информацию о встроенном пределе, применяемом AVM, какие-либо документы или коды ошибок, которые бы указывали на его наличие, но я ничего не смог найти вообще. Конечно, это не значит, что нет - просто означает, что многие еще не достигли предела;)
Так что, если кто-то еще знает больше ...

EDIT

Поскольку информация о загруженном MovieClip является новой, вот мое обновление: SWF-файлы AVM1 (AS1 & 2) не всегда выполняются одинаково при загрузке в фильм AVM2 (AS3). Это никак не связано с количеством вложенных экранных объектов. Сначала я думал, что это потому, что свойство _lockroot было удалено в AS3, но я немного искал и обнаружил, что оно по умолчанию считается истинным, и поэтому не должно быть проблемой.

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

  • Используете ли вы относительные пути для загрузки других данных в AS2 swf?
  • Получаете ли вы какие-либо сообщения об ошибках (в частности, ошибки нарушения изолированной программной среды безопасности)?
  • Использует ли SWF-файл AS2 внешние переменные, которые должны быть установлены (FlashVars)
  • Требуется ли вашему SWF-файлу AS2 доступ к ExternalInterface?

ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ

Поскольку эта новая информация только что появилась:

Не существует абсолютно никакого способа выполнять динамически загруженный байт-код AVM на iPad во время выполнения, по той же причине, что нет Java VM и нет Flash Player для iOS: Apple не разрешает выполнение динамически загружаемого байтового кода вообще. Период.

Следовательно, вы можете загружать и воспроизводить SWF-анимацию, но не ActionScript. Это будет просто проигнорировано. Кроме того, ни одно из запущенных вами приложений на самом деле не является байт-кодом AVM - они скомпилированы в байт-код LLVM вместо .

Вам нужно будет найти способ проверить конец анимации, который не включает команды stop (). Возможно, это можно сделать, проверив номера кадров в вашем контейнере AS3?

1 голос
/ 21 декабря 2011

Чтобы ответить на ваш вопрос напрямую, да, вы можете загрузить AS2 swfs таким образом. И твой код мне кажется правильным.

Я подозреваю, что он нормально загружает SW2 AS2, но по какой-то причине он не инициализируется правильно. Возможно, это видео плеер, который не имеет видимых активов, кроме загруженного видео. AS2 имеет тенденцию терпеть неудачу без ошибок, что затрудняет отладку. Я бы предложил опубликовать SWF-файл AS2 с некоторой графикой, но без кода, который мог бы дать сбой. Нет кода вообще. Может быть, просто анимация временной шкалы движущегося круга или чего-то еще, затем загрузите это. Таким образом, вы можете устранить ваш код Flex как источник проблемы.

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

...