イナヅマTVログ

ActionScript3, フレームレートに関係する3つのイベント(Event)

| 2件のコメント

毎フレームごとに発生するEventに関するお話。
元ネタはMy Coding Life – The MovieClip life cycle, Event.FRAME_CONSTRUCTED, and Event.EXIT_FRAME.です。

以下のコードをフレームスクリプトに書いてテストしてみました。
Flash CS4 + Flash Player 10.0 r45

function onEvent (e:Event):void {
	trace(e);
}
addEventListener(Event.ENTER_FRAME, onEvent);
addEventListener(Event.EXIT_FRAME, onEvent);
addEventListener(Event.FRAME_CONSTRUCTED, onEvent);

出力

[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2]
[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2]
[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2]

livedocによると…
http://help.adobe.com/ja_JP/Flash/CS5/AS3LR/flash/display/DisplayObject.html#event:enterFrame
どうでもいいけどEventの説明だと何の役にもたちません。DisplayObjectでようやく意味ありげな日本語に遭遇できます。
もっとましな日本語にならないのかなぁ。
作文のテストだったら10点以下だよね。

enterFrame
[ブロードキャストイベント] 再生ヘッドが新しいフレームに入るときに送出されます。再生ヘッドが移動しない場合、またはフレームが 1 つしか存在しない場合、このイベントはフレームレートに合わせて継続的に送出されます。 このイベントはブロードキャストイベントであるため、このイベントに登録されているリスナーを持つすべての表示イベントによって送出されます。

exitFrame
[ブロードキャストイベント] 再生ヘッドが現在のフレームを終了するときに送出されます。すべてのフレームスクリプトが実行されています。再生ヘッドが移動しない場合、またはフレームが 1 つしか存在しない場合、このイベントはフレームレートに合わせて継続的に送出されます。このイベントはブロードキャストイベントであるため、このイベントに登録されているリスナーを持つすべての表示イベントによって送出されます。

frameConstructed
[ブロードキャストイベント] フレーム表示オブジェクトのコンストラクターが実行した後で、かつフレームスクリプトが実行される前に送出されます。再生ヘッドが移動しない場合、またはフレームが 1 つしか存在しない場合、このイベントはフレームレートに合わせて継続的に送出されます。 このイベントはブロードキャストイベントであるため、このイベントに登録されているリスナーを持つすべての表示イベントによって送出されます。

これだとイベントの発生順序は以下のようになる気がするんだけど・・・
1.Event.FRAME_CONSTRUCTED
2.Event.ENTER_FRAME
3.Event.EXIT_FRAME

実行結果は違ってた。
1.Event.EXIT_FRAME
2.Event.ENTER_FRAME
3.Event.FRAME_CONSTRUCTED

で、この3つのイベントを同時に使う場面ってどんな時だろ?

1つしか使わない時はEvent.EXIT_FRAME, Event.ENTER_FRAME, Event.FRAME_CONSTRUCTEDのうちどれを使うのが正解なんでしょ?

感覚的にはEvent.EXIT_FRAMEを使いたいな、元Director使いとしては。

update

2010-07-08
コメントを参考に検証した結果。

[Event type="enterFrame" bubbles=false cancelable=false eventPhase=2]
[Event type="frameConstructed" bubbles=false cancelable=false eventPhase=2]
// frame script 
[Event type="exitFrame" bubbles=false cancelable=false eventPhase=2]

1. Event.ENTER_FRAME
2. Event.FRAME_CONSTRUCTED
3. frame script
4. Event.EXIT_FRAME

1 -> 2 -> 3 -> 4 -> 1 -> 2 -> 4 -> 1 ......

Event.FRAME_CONSTRUCTED のあと、フレームスクリプトを実行して Event.EXIT_FRAME。あとはイベントがループする。

ありがたい。

2件のコメント

  1. 失礼します。

    実行結果で EXIT_FRAME が最初に来るのは
    addEventListenerした時点で
    ENTER_FRAME と FRAME_CONSTRUCTED イベントが
    既に発行済みで、最後に来る EXIT_FRAME が最初に拾われたせいかと。
    ———————————————
    [フレーム 1]
    (Event.ENTER_FRAME) ←リスナーが無いので拾われない
    (Event.FRAME_CONSTRUCTED) ←リスナーが無いので拾われない

    addEventListener(Event.ENTER_FRAME, onEvent);
    addEventListener(Event.EXIT_FRAME, onEvent);
    addEventListener(Event.FRAME_CONSTRUCTED, onEvent);

    1.Event.EXIT_FRAME ←リスナーがあるので拾われる
    ———————————————
    [フレーム 2]
    2.Event.ENTER_FRAME
    3.Event.FRAME_CONSTRUCTED
    4.Event.EXIT_FRAME
    ———————————————
    [フレーム 3]
         :
         :

  2. う〜む、なるほど。
    そうすると、フレームに入る前に設定するんですね。
    ありがとうございます。

コメントを残す

必須欄は * がついています