1

フレームにいくつかのコードがあります。それは基本的に

this.addEventListener(Event.ENTER_FRAME, handleUpdate);
function handleUpdate(e:Event):void
{...}

そのフレームでのみコードを実行したい。しかし、そのフレームの外に出ても、handleUpdate 関数が呼び出され続けます。

タイムラインはこのフレームで停止しています。タイムラインがフレームから移動するまで、handleUpdate を継続的に実行したいと考えています。

4

3 に答える 3

2

問題のフレームにこのためのコードを設定する場合は、次のようにすることができます。

        var tmpCurFrame:int = currentFrame; //store the current frame
        this.addEventListener(Event.ENTER_FRAME, handleUpdate)

        function handleUpdate(e:Event):void {
            if (tmpCurFrame != currentFrame) { //if the frame has changed, stop the frame handler
                this.removeEventListener(Event.ENTER_FRAME, handleUpdate);
                return;
            }
            //do your code
        }

        handleUpdate(null);

余談ですが、フレームスクリプトを使用する代わりに、この種のものを管理するドキュメントクラスやその他のクラスファイルを用意する方がはるかにクリーンです。しかし、あなたが探しているのがあなたの既存のコードへの迅速で汚い微調整だけであるなら、これはトリックをするはずです。

于 2012-09-17T16:22:27.920 に答える
1

addFrameScriptについて聞いたことがありませんか? それはあなたのニーズに最適です。

var desiredFrame = 25;  // Timeline frame (starts from 1)
this.addFrameScript(desiredFrame-1, onFrame25);  // 1st param is zero-based

function onFrame25():void
{
    trace("I'm on frame", desiredFrame);
}
于 2012-09-17T18:03:26.080 に答える
0

アプローチで考慮すべきことがいくつかあります。

  • 関心のあるフレームにENTER_FRAMEリスナーを追加すると、そのフレームに入った後に発生するため、ムービークリップが再生されている場合は、次のフレーム(その時点でそのフレームから移動した可能性があります)までENTER_FRAMEイベントを取得しません。

  • フレーム上のコードは、再生ヘッドがそのフレームに入るたびに実行されることに注意してください。メモリリークの目的で適切な場合は、リスナーを削除するように注意する必要があります。

したがって、1つのアプローチは、このコードを問題のフレームに配置することです。リスナーも適切に削除されることに注意してください。

var thisFrame:int = currentFrame;
function handleUpdate(e:Event) {
  if (currentFrame==thisFrame) {
    // your code here...
  } else {
    // remove listener if we moved off the frame
    removeEventListener(Event.ENTER_FRAME, handleUpdate);
  }
}
// call it now because the listener won't fire until next frame
handleUpdate(null);

// add listener in prep for next ENTER_FRAME, though note that
// if we move off this frame, then the listener is removed above
addEventListener(Event.ENTER_FRAME, handleUpdate);

別のアプローチは、フレーム1に次のコードを追加することです。これにより、リスナーは常に実行され、クリーンアップされることはなく、フレーム12にある場合にのみコードが実行されます。

addEventListener(Event.ENTER_FRAME, handleUpdate);
function handleUpdate(e:Event):void
{
  if (currentFrame==12) {
    // your code here...
  }
}
于 2012-09-20T17:46:47.900 に答える