Управление загруженной 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();
         }
      }
   }
Другие вопросы по тегам