2012-02-10 4 views
1

私は、SWFアニメーションをロードし、同時に複数の場所でそれを表示したいのですが、ここに見られるように、私はそれを行う方法を見つけ出すことができる唯一の方法は、それを私はそれを表示するたびにロードすることですよ:Actionscriptでは、ローダーのコピーまたはキャッシュバージョンを作成する方法はありますか?

private function playSounds():void { 
    for (var i:Number = 0; i < 14; i++) 
    { 
     for (var a:Number = 0; a < 16; a++) 
     {    
      if (boxes[i][a].x == linePos && boxes[i][a].selected == true && played[i][a] == false) 
      {     
       played[i][a] = true; 
       MovieClip(); 
       var swf:URLRequest = new URLRequest("../assets/glow2.swf") 
       var glow:Loader = new Loader() 
       glow.load(swf) 
       glow.x = boxes[i][a].x - 25*0.7; 
       glow.y = boxes[i][a].y - 27*0.7; 
       glow.scaleX = 0.7; 
       glow.scaleY = 0.7; 
       this.addChild(glow); 
       glows.push(glow) 
       glowTime.push(0) 
       var sc:SoundChannel = new SoundChannel(); 
       sc = (sounds[i] as Sound).play(); 
      } 
     } 
    } 
} 

一度に5回以上表示されている場合、これは非常に遅いため、一度ロードして複数の場所で使用する必要があるかどうか疑問に思っています。

答えて

1

Loadercontentプロパティがあります。 したがって、一度ロードして、何度もコンテンツを使用してください。

編集:あなたはあなたがロードされたコンテンツを使用する前に、読み込みが完了したときに知っているリスナーを追加することもできます。

addEventListener(Event.COMPLETE, completeHandler); 

はEDIT2:

var mc1:MovieClip = new MovieClip(); 
var mc2:MovieClip = new MovieClip(); 

var my_Loader:Loader = new Loader(); 
mc1.addChild(my_Loader); 
mc2.addChild(my_Loader); 

(ただし試していません) 。

+0

私もコンテンツを使用しようとしましたが、それでもローダーへの参照として機能します。新しい位置を設定すると、古い場所のswfは消えてしまいます。 – superadamwo

+0

**子供を複数回**追加する必要があるかもしれません。これに対する答えを編集しました。 – vulkanino

+0

私はあなたが2つの異なるものに子供として同じオブジェクトを追加すると、元の親から削除され、新しいものに配置されると思います。両方の子供になることはできません。 – superadamwo

0

一つの迅速な回避策は、第二ローダーを作成し、loadBytes()メソッドを介してそれにロードされたバイトを渡すことです:

var l:Loader = new Loader(); 
l.contentLoaderInfo.addEventListener(Event.COMPLETE,ready); 
l.load(new URLRequest("../assets/glow2.swf")); 

function ready(event:Event):void{ 
    var mc:MovieClip = event.currentTarget.content as MovieClip; 

    var clone:Loader = new Loader(); 
    clone.loadBytes(event.currentTarget.bytes); 

    addChild(mc); 
    addChild(clone); 

    clone.x = 100; 
} 

これは、ほとんどの場合で動作します。いくつかのケースでは、あなたがのような単純なもので逃げることができる必要があります:

var clone:MovieClip = MovieClip(new mc.constructor()); 

と3番目のオプションもあります:あなたが一つ以上を格納します意味あなたmoviclipを、「ブリッティング」(どのように多くの依存BitmapDataオブジェクトのキャッシュに必要なMoveClipフレーム)を描画するソースムービークリップ(同時に複数の場所)からdraw()に移動します。

loadBytesアプローチでは、Loaderのコピーを作成して、ロードされたバイトを再利用するが、新しいコンテンツを初期化するので、そのためにメモリが使用されます。 これが必要でない場合は、BitmapDataを使用してMovieClipをキャッシュするのが最善の方法です。

+0

ええ、これはうまく動作しますが、パフォーマンスが実際に向上しているかどうかはわかりません。それでも、すべてのバイトをロードする必要があります、それはちょうど別の場所からそれらを取得します。 – superadamwo

+0

あなたのタイトルは、ロードされたコンテンツを再利用したがっていることを示唆しましたが、ムービークリップをピクセルとしてメモリにキャッシュするように思えます –

関連する問題