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");

クリップのロード中にすべてをミュートすることも検討しましたが、これにより、サウンドをいつ再生できるかに関して、プログラムの残りの部分にかなり深刻な制約が生じます。

この問題に対する標準的な解決策はありますか? それは非常に一般的な問題であるべきだと思います。

4

1 に答える 1

3

SWF が Web サーバー上にあるためにプリロードしていませんか? その場合、1 つのオプションは、URLLoaderを使用して実際にバイトを解釈せずに、サーバーからバイトをプリロードすることです。その後、MovieClip を表示する必要がある場合は、Loader.loadBytesを使用してプリロードされたバイト (URLLoader.data) を Loader に挿入し、実際に MovieClip をインスタンス化します (そして、再生、サウンドなどすべてを開始します)。インスタンス化時にわずかな遅延が発生する場合がありますが、プリローダーがない場合よりも大幅に短縮されます。

loader.content のタイプに関する質問ごとに:

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);

    }
  }
}

(注: これは単にデモ用のコードです。このような関数クロージャーを使用してイベント リスナーを追加しないでください。メモリ リークが発生します。また、URLLoader をスキップし、単純に埋め込んでバイトを取得していますが、それらはどちらも同じバイトです仕方)。

出力は次のとおりです。

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

ただし、Bitmap と MovieClip は loader.content の唯一のオプションではありません。コードからコンパイルされた SWF のロードは Sprite から派生でき、完全修飾クラス名を表示する場合がありますが、www0z0k が指摘しているように、それらはすべて DisplayObject から派生しています。ただし、Flash Professional からの SWF 出力は常に MovieClip から派生していると思います。

Loader バイトは常に MovieClips であることに注意してください

あなたが正しいことがわかりました-通常の古い画像をロードするローダーである contentLoaderInfo.bytes プロパティには、画像を子として持つ単純な MovieClip ラッパーである生成された SWF のバイトが含まれています。誰が推測したでしょうか?

  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
于 2012-04-23T18:10:34.763 に答える