Управление загруженной swish-анимацией в AS 3.0
Я разрабатываю оболочку AS 3.0, чтобы добавить некоторые дополнительные материалы, которые должны загружать старые и простые кадры для создания анимации SwishMax 3, а затем останавливать их, воспроизводить и т. Д.
Вот мой код:
package {
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display.Loader;
import flash.display.MovieClip;
import flash.net.URLRequest;
import flash.events.*;
[SWF(backgroundColor="#ffffff", frameRate="17", width="300", height="250")]
public class SwishMaxWrapper extends Sprite {
function SwishMaxWrapper() {
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
addChild(loader);
var request:URLRequest = new URLRequest("swishy.swf");
loader.load(request);
}
private function completeHandler(event:Event):void {
var movie:MovieClip = event.target.content;
movie.stop();
}
}
}
Загрузка анимации работает как положено, но movie.stop() - нет. Что случилось?
2 ответа
Я проверил ваш код, и он работает на моей машине. SWF, который я загрузил, имел свою анимацию на главной временной шкале. Возможно ли, что swishy.swf имеет анимацию, которая не находится на основной временной шкале? Возможно, анимация в другом символе, а экземпляр этого символа находится на сцене. В любом случае, когда вы вызываете stop() в приведенном выше коде, он просто указывает основной временной шкале на остановку, но другие видеоклипы на сцене будут продолжать работать.
Я думаю, это то, на что указывал Симсофт.
Я проверил ваш код, используя SWF, на сцене которого был символ с анимацией, и у меня возникла проблема, которую вы описываете. Я исправил это, изменив completeHandler()
следующее:
public function completeHandler(event:Event):void {
var movie:MovieClip = event.target.content;
movie.stop(); //doesn't work - main timeline is only one frame long
for(var i:int = 0; i<movie.numChildren; i++) {
var child:MovieClip = movie.getChildAt(i) as MovieClip;
if(child) { //need this test - if the cast to MovieClip fails, child will be null
child.stop(); //works
}
}
}
Надеюсь, у вас не будет больше анимации, вложенной в более глубокие слои. Если это так, вам придется изменить это, чтобы продолжать вглядываться в детей каждого ребенка и пытаться остановить их сроки.
Во всяком случае, надеюсь, что это помогает. Удачи!
stop() не повторяется, я думаю, что проблема здесь.
function ruleThemAll(target : DisplayObjectContainer, doStop : Boolean = true) : void
{
for(var i : uint = 0; i < target.childNum; ++i)
{
var child : DisplayObject = target.getChildAt(i);
// If it's a container, go into to stop children
if(child is DisplayObjectContainer)
ruleThemAll(child as DisplayObjectContainer, doStop);
if(child is MovieClip)
{
if(doStop)
MovieClip(child).stop();
else
MovieClip(child).play();
}
}
}