0

現在、次のことを行う必要がある AS2 コードに取り組んでいます。

  • 別の AS2 SWF をロードします。
  • 読み込まれた SWF の上に別の MovieClip を表示します。
  • 読み込まれた SWF の MovieClip 内の変数にアクセスします。

今のところ私のコードは次のとおりです。

    loadMovieNum("player.swf",5);
    delay = function () {
    var first:MovieClip = _root.attachMovie("OnTop","nf",10);
    trace(_root.nf);
    trace(_layer5);
    clearInterval(delayi);
    }

delayi = setInterval(delay, 3000); //3 seconds to let the video load. 

ロードされた swf の上に描画を表示しようとしています (「OnTop」は、そのタイプが MovieClip であるシンボルに付けた名前です) が、ビデオが他のすべての上に表示され、トレース出力は次のようになります。

_level0.nf
undefined

私は何を間違っていますか?新しい MovieClip が読み込まれたものの上に表示されないのはなぜですか? 次に、SWF をロードした後、メインの MovieClip 内の変数にアクセスするにはどうすればよいでしょうか?

4

1 に答える 1

0

私は個人的にMovieClipLoaderでこれを行います。タイマーを使用してロード期間を想定すると、接続が非常に遅いユーザーが失敗する競合状態が発生するため、非常に危険です。

これは、MovieClipLoaderとDelegateを使用して、AS3のaddEventListenerと同様に、イベント関数のスコープをコードの残りの部分に対してローカルに保つ簡単な例です。まず、ロードするSWFを「child.swf」と呼びます。これにはアニメーションが含まれ、フレーム1で「hello」という文字列変数を定義します。

var hello:String = "Hi";

親SWFには、ローダーコードと、ロードされたSWFの上のステージにアタッチされる「mc1」の識別子を持つライブラリアイテムがあります。

//grab Delegate to mimic AS3 event handler scope
import mx.utils.Delegate;
//create container for the loaded SWF
var loadedMC:MovieClip = createEmptyMovieClip("loadedMC",5);
//create the loader (don't cast it though, or you can't directly access the events)
var loader = new MovieClipLoader();
//set up a listener for the load init (called when the first frame of the loaded MC is executed)
loader.onLoadInit = Delegate.create(this, onMovieInit);
//start loading
loader.loadClip("child.swf",loadedMC);
//init handler
function onMovieInit()
{
    //create the next layer from the library
    var firstMC:MovieClip = attachMovie("mc1","newName",10);
    //trace var from loaded mc
    trace(loadedMC.hello); // hi
}

MovieClipLoaderはonLoadInit、ターゲットSWFがロードされ、最初のフレームが処理されたときに関数を呼び出します。つまり、最初のフレームのすべてのコードが親SWFで使用できるようになります。onLoadInit公式ドキュメントとしてリスナーオブジェクトを使用するのではなく、への呼び出しを委任すると_root、関数のスコープが変更されていないため、ハンドラー関数内で使用する必要がなくなります。

于 2011-08-22T10:58:14.927 に答える