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

私はあなたのコードをテストしました、そしてそれは私のマシンで動作します。ロードしたSWFのアニメーションはメインタイムラインにありました。swishy.swfにメインタイムラインにないアニメーションがある可能性はありますか?おそらく、アニメーションは代わりに別のシンボルにあり、そのシンボルのインスタンスがステージ上にあります。とにかく、上記のコードでstop()を呼び出すと、メインのタイムラインに停止するように指示されているだけですが、ステージ上の他のムービークリップは続行されます。

それがSimsoftが指摘していたことだと思います。

アニメーションが含まれているステージ上のシンボルが含まれている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 に答える
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 に答える