Загрузка и использование SWF-файлов - PullRequest
3 голосов
/ 25 марта 2012

Я новичок в AS3 и пытаюсь понять, как внешне загруженные SWF работают в AS3. Начиная с Flash 4/5, в веб-проекте Flash часто было один основной файл SWF, а затем в него загружались другие файлы SWF, часто для различных «разделов» веб-сайта или веб-проекта. В основном файле у нас были бы маски, анимирующие мувиклип контейнера (в который были загружены внешние разделы / SWF-файлы), а также анимация и переходы, воспроизводимые после завершения загрузки раздела и отображения загруженного содержимого.

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

В AS2 мы могли бы использовать someMovieClip.loadMovie («ExternalContent.swf»), и файл ExternalContent загружался бы внутри someMovieClip. Вы можете получить доступ к функциям на основной временной шкале "External.swf", используя someMovieClip.function () ;. А внутри «ExternalContent.swf» мы могли бы использовать _root.function () для доступа к функциям в основном файле, в который загружался ExternalContent. Делать это в AS3 кажется странным и невротичным, и я чувствую, что упускаю что-то довольно простое.

//Loading in ExternalContent.swf into the sprite
//ExternalContent has a movieclip called "boxes" on it's main timeline
//boxes has a boxesPrompt() function in it's timeline.

var sprite:Sprite = new Sprite();
addChild(sprite);

var loader:Loader = new Loader();
loader.load(new URLRequest("ExternalContent.swf"));

loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaded);

function onLoaded(event:Event):void
{
    sprite.addChild(event.target.content);

        sprite.boxes.boxesPrompt();
        //Flash gives the following compiler error at the above
        //Scene 1, Layer 'Layer 1', Frame 1, Line 21 1119: Access of possibly undefined property boxes through a reference with static type flash.display:Sprite.

        //But when I comment out sprite.boxes.boxesPrompt() and use this, it works:
        event.target.content.boxes.boxesPrompt()
}

Функция boxesPrompt () внутри "ExternalContent.swf" просто отслеживает своего родителя, прародителя и прародителя - trace (this.parent.parent.parent) ;. И когда я вызываю эту функцию внутри обработчика события onLoaded с помощью «event.target.content.boxes.boxesPrompt ()», это показывает, что объект Boxes (который находился на главной временной шкале External.SWF) имеет родительский мувиклип , спрайт прародителя и объект прародителя mainTimeline.

Я думал, что переопределение загруженного контента в спрайте позволит мне получить доступ к загруженному контенту так же легко, как это делал loadMovie () - доступ к загруженному контенту, как если бы он присутствовал непосредственно внутри клипа, в который он был загружен. Но это не работает вообще.

Итак, перефразируя, мой вопрос:

  • Как мне связаться с основным SWF-файлом "загрузчика" с загруженным содержимым. Я не хочу общаться с помощью event.target.content. {Etc}, потому что тогда я буду только возможность обратиться к загруженному контенту в обработчике события Loader event.complete.

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

  • Как связаться с загруженным содержимым внутри основного / загрузочного файла. Ранее мы использовали функцию _root.functionName (), чтобы воспроизводить анимацию, переходя из текущего загруженного извне «раздела» в другой раздел. Как я это делаю?

1 Ответ

2 голосов
/ 25 марта 2012

AS2 и AS3 значительно отличаются. Но вам придется проглотить тот факт, что AS3 была разработана как улучшение по сравнению с AS2. Поэтому любой переход, который вы делаете, тоже к лучшему.

Например, например: _root в AS2 разрешал глобальный доступ к объектам и переменным и их изменение в любом месте, что является плохой практикой и приводит к не поддерживаемому коду в проекте.

Сказав это, позвольте мне ответить на ваши вопросы:

  • Если вы можете получить доступ к загруженному контенту с помощью event.target.content ... вы должны сохранить его внутри, скажем, класса переменная & может получить к нему доступ позже в другом месте класса.

    Вы должны понимать, что вы сможете получить доступ только к контенту после загрузки, так что придется ждать его завершения в любом случае & Обработчик event.complete, вероятно, ваш лучший выбор.

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

  • Доступ к родителю может быть сделан разными способами. Вы можете использовать .parent или фактически вызывать функцию из родительского swf, передавая ее ссылку дочернему элементу.


var sprite;
addChild(sprite);

var loader:Loader = new Loader();
loader.load(new URLRequest("ExternalContent.swf"));

loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaded);

function onLoaded(event:Event):void
{
        sprite = event.target.content;

        //This should work
        sprite.boxes.boxesPrompt();
}

См. этот пример для получения дополнительной информации.

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