Как правильно добавить функциональность "Воспроизведение" в предварительно загруженный Flash-фильм?

Я сделал проект Flash во FlashDevelop, чтобы создать объявление.

Preloader настраивается с использованием аргумента Additional Compiler:

-frame=NameOfLabel,NameOfMainClass

Мой основной класс просто называется "Главный", на верхнем уровне / уровне пакета по умолчанию.

Итак, кадр № 1, являющийся частью предварительного загрузчика SWF, имеет:

  • Очень мало растровых изображений, векторной графики и текста (до 50 КБ);
  • Видеопроигрыватель YouTube в центре (не учитывается при ограничении размера файла);

Во фрейме №2 есть все остальное (класс Main в основном встраивает все свои зависимости). Это включает:

  • Активы из предварительно скомпилированных SWF (битмапы, символы, шрифты, данные XML);
  • Все классы импортированы (это рекурсивно для всех классов, импортирующих другие классы);

Теперь моя большая проблема заключается в том, что мой клиент запросил функцию "воспроизведения" намного позже, чем я завершил 99,9% проекта.

У меня есть проект, более или менее разбитый на разные состояния (Intro, Ready, SlideMenu и т. Д.), Но я не уверен, как легко восстановить Flash-фильм в самом начале (где он был предварительно загружен и показан видео на YouTube).

Простым решением было бы просто вызвать метод JavaScript ExternalInterface, который обновил бы контейнер Flash, НО я не думаю, что могу контролировать то, что происходит на стороне HTML / JavaScript.

Есть ли простой способ вызвать функцию воспроизведения из AS3?

2 ответа

Решение

Следующее, кажется, делает трюк!

private function onReplayClick(e:MouseEvent):void {
    var theStage:Stage = this.stage; //Temporarly store the stage.

    //Kill any animations happening:
    TweenMax.killAll(); //3rd party, may not be applicable for you :P

    //Remove ALL containers / child DisplayObjects
    SpriteUtils.recursiveRemove(theStage); //custom-made
    // (this object is no longer attached to the stage at this point)

    //Nullify any Singleton / Static variables:
    Main.INST = null;

    // Load the 'bytes' of the current SWF in a new Loader, then...
    // add it to the stage
    var swf:Loader = new Loader();
    swf.loadBytes( theStage.loaderInfo.bytes );
    theStage.addChild( swf );
}

Выполнение глубокой рекурсивной очистки объектов DisplayObject и любых статических переменных (например, экземпляров Singleton) оставляет пустую стадию.

После этого вы можете создать новый Loader, который будет загружать SWF-файл с помощью текущего свойства байтов LoaderInfo.

Добавьте Loader на сцену, и вы снова в работе!

Разве просто возвращение к 1-му кадру не поможет?

Другие вопросы по тегам