Как правильно добавить функциональность "Воспроизведение" в предварительно загруженный 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 на сцену, и вы снова в работе!