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() 没有。怎么了?

4

2 回答 2

0

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();
         }
      }
   }
于 2011-06-02T14:55:39.417 回答
0

我测试了你的代码,它可以在我的机器上运行。我加载的 SWF 在主时间轴中有动画。swishy.swf 是否有可能不在主时间线上的动画?也许动画是在另一个符号中,而该符号的一个实例在舞台上。无论如何,当您在上面的代码中调用 stop() 时,它只是告诉主时间线停止,但舞台上的其他影片剪辑将继续播放。

我认为这就是 Simsoft 所指出的。

我使用 SWF 测试了您的代码,该 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
        }
    }
}

希望您没有更多的动画嵌套在更深层。如果是这种情况,您将不得不修改它以继续查看每个孩子的孩子并尝试停止他们的时间线。

无论如何,希望这会有所帮助。祝你好运!

于 2011-06-02T16:33:58.590 回答