2012-04-23 8 views
2

私はAS3でプログラムを作成しており、将来必要となるムービークリップをプリロードしたいと考えています。残念ながら、私は問題に直面しています。ムービークリップは、ロードされるとすぐに(ステージに追加する前に)サウンドを再生します。サウンドでムービークリップを静かにプリロードするにはどうすればよいですか?

ムービークリップがロードされるとすぐに停止するほとんどは問題を解決しますが、クリップの開始が聞こえることがあります。どうやらクリップは、完了したイベントハンドラが開始する前に終了するのを待っていません...?

// example of stopping a clip after it is loaded 
// sound may still be heard for a moment 
var loader: Loader = new Loader(); 
loader.addEventListener(Event.COMPLETE, function(e : *) : void { 
    (loader.contentLoaderInfo.content as MovieClip).stop(); 
}); 
loader.load("a_loud_movie_clip.swf"); 

私はまた、クリップのロード中に、すべてをミュート考えられてきたが、これは音が再生できるときに対するプログラムの残りの部分にかなり深刻な制約を課します。

この問題の標準的な解決策はありますか?私はそれが非常に共通の問題であるように感じる。

答えて

3

SWFがWebサーバー上にあるため、プリロードしていますか?その場合、1つのオプションは、URLLoaderを使用して実際に解釈することなく、サーバーからバイトをプリロードすることです。その後、MovieClipを表示する必要がある場合は、Loader.loadBytesを使用して、プリロードされたバイト(URLLoader.data)をローダーに挿入し、実際にMovieClipをインスタンス化します(再生、サウンド、およびすべてを開始します)。インスタンス化時にわずかな遅延があるかもしれませんが、プリローダーなしの場合よりもずっと少なくなります。このような関数クロージャでイベントリスナーを追加しないでください、それが原因となりますメモリ - これは単に例証的なコードです:

package 
{ 
    import flash.display.Sprite; 
    import flash.display.Loader; 
    import flash.display.Bitmap; 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.utils.ByteArray; 
    import flash.utils.getQualifiedClassName; 

    public class tst extends Sprite 
    { 
    [Embed(source="any_image.png", mimeType="application/octet-stream")] 
     private var img_bytes:Class; 

    [Embed(source="any_swf.swf", mimeType="application/octet-stream")] 
     private var swf_bytes:Class; 


    public function tst():void 
    { 
     var b1:ByteArray = new img_bytes(); 
     var l1:Loader = new Loader(); 
     l1.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
     trace(getQualifiedClassName(l1.content)); 
     trace(l1.content is Bitmap); 
     }); 
     l1.loadBytes(b1); 

     var b2:ByteArray = new swf_bytes(); 
     var l2:Loader = new Loader(); 
     l2.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
     trace(getQualifiedClassName(l2.content)); 
     trace(l2.content is MovieClip); 
     }); 
     l2.loadBytes(b2); 

    } 
    } 
} 

(注:のLoader.contentの種類についてのご質問パー

私はURLLoaderをスキップして、単にバイトを埋め込むために埋め込みますが、いずれの場合も同じバイトです)。

、出力は次のとおりです。

flash.display::Bitmap 
true 
test_fla::MainTimeline 
true 

はしかし、ビットマップとムービークリップはのLoader.contentのための唯一の選択肢ではありません - コードからコンパイルされたSWFをロードするスプライトから導出することができ、完全なクラスを示してもよいです名前はwww0z0kが指摘しているとおり、すべてDisplayObjectから派生しています。 Flash ProfessionalからのSWF出力は、常にMovieClipから派生していると思います。ローダーのバイトは常にそれはあなたは正しい判明

ムービークリップであることをご了承パー

- 定期的に古いイメージをロードするローダーは、contentLoaderInfo.bytesプロパティがある生成されたSWFのバイトが含まれていますイメージを子として持つ単純なMovieClipラッパーです。誰が推測しただろうか?

var l3:Loader = new Loader(); 
    l3.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
    trace("- l3:"); 
    trace(getQualifiedClassName(l3.content)); 
    trace(l3.content is Bitmap); 

    // This ByteArray is a SWF! 
    var b3:ByteArray = l3.contentLoaderInfo.bytes; 

    var l4:Loader = new Loader(); 
    l4.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void { 
     trace("- l4:"); 
     trace(getQualifiedClassName(l4.content)); 
     trace(l4.content is Bitmap); 
     trace(Object(l4.content).getChildAt(0) is Bitmap); 
    }); 
    l4.loadBytes(b3); 
    addChild(l4); 

    }); 
    l3.load(new URLRequest("any_image.png")); 

出力は次のとおりです。

- l3: 
flash.display::Bitmap 
true 
- l4: 
flash.display::MovieClip 
false 
true 
+0

これはまさに私が探していたものの一種です。 –

+0

関連する問題:オブジェクトを実際にロードしない場合、イメージであると判断される最良の方法は何ですか?私は過去に、画像データのバイト配列をロードするとムービークリップが生成されることに気付きました。 –

+0

私はあなたの質問を正確に理解しているかどうかはわかりませんが、Loader.loadBytesを使用した後は、Event.COMPLETEを取得します。コンテンツはBitmap(バイトがJPEGやPNGの場合)またはMovieClip(バイトがSWFの場合)のいずれかである必要があります。 –