« それは「確信犯」じゃなくて「故意犯」だろうが | トップページ | Flash: ムービークリップの生成を追いかける(2): 出たり消えたり変わったり »

2008/12/08

Flash: ムービークリップの生成を追いかける(1): 処理順序の確認

ステージにムービークリップを配置しているだけのうちは、見たまんまですし、全部をActionScriptで管理するのなら、管理責任は開発者にあるのでいいんですが、その中間、ステージに配置したムービークリップをActionScriptで操作しようとすると、オブジェクトの連続性、というかどこまでが同一のオブジェクトなのか、コンパイル時にFlashは何をしてくれるのか、ということに悩みました。

というわけで、試してみるのですよ。

なお、環境はFlash CS3 ProfessionalでActionScript 3.0です。

まずは、準備としてムービークリップのイベントを追いかけられるように以下のようなファイルを用意します。FirefoxなどのGeckoブラウザでは右側が切れてしまうので、ドラッグしてテキストエディタ等にコピペして見てください。


package
{
import flash.display.*;
import flash.events.*;

public class EventTraceMC extends MovieClip
{
public static  var idCount: uint = 0;
public var id: uint;
public function EventTraceMC()
{
++ idCount;
id = idCount;
trace("create [id", id, "]");
addEventListener(Event.ENTER_FRAME, reportEvent, false, 0, true);
addEventListener(Event.ADDED, reportEvent, false, 0, true);
addEventListener(Event.ADDED_TO_STAGE, reportEvent, false, 0, true);
addEventListener(Event.REMOVED, reportEvent, false, 0, true);
addEventListener(Event.REMOVED_FROM_STAGE, reportEvent, false, 0, true);
}

public function reportEvent(evt:Event):void
{
trace(MovieClip(root).currentFrame, "[name =", EventTraceMC(evt.currentTarget).name, "id =", EventTraceMC(evt.currentTarget).id, "]", evt.type);
}
}
}

これを基本クラスにしたムービークリップを使って、オブジェクトの生成やイベントを追いかけていきます。

flaファイルにも以下のようなドキュメントクラスを設定します。


package
{
import flash.display.*;
import flash.events.*;

public class EventTest extends MovieClip
{
public function EventTest()
{
trace("Create", this);
addEventListener(Event.ENTER_FRAME, reportEvent, false, 0, true);
}

public function reportEvent(evt:Event): void
{
trace(MovieClip(root).currentFrame, evt.currentTarget, evt.type);
}
}
}

なお、イベントリスナーの登録は、今後状況に応じて増やしたり減らしたりします。

ずっと存在するオブジェクト

  1. ステージにレイヤーを3つ作成し、それぞれフレーム1~4をキーフレームにします。
  2. レイヤー1には全フレームに同じムービークリップを同じ名前で配置します。
  3. レイヤー2は空けておきます。
  4. レイヤー3にはそれぞれ以下のスクリプトを書き込みます。
    • フレーム1: trace("フレーム 1, children = ", numChildren);
    • フレーム2: trace("フレーム 2, children = ", numChildren);
    • フレーム3: trace("フレーム 3, children = ", numChildren);
    • フレーム4: trace("フレーム 4, children = ", numChildren); gotoAndPlay(1);

以下はこれを実行した出力の一部です。

create [id 1 ]
1 [name = a id = 1 ] added
1 [name = a id = 1 ] addedToStage
Create [object EventTest]
フレーム 1, children =  1
2 [name = a id = 1 ] enterFrame
2 [object EventTest] enterFrame
フレーム 2, children =  1
3 [name = a id = 1 ] enterFrame
3 [object EventTest] enterFrame
フレーム 3, children =  1
4 [name = a id = 1 ] enterFrame
4 [object EventTest] enterFrame
フレーム 4, children =  1
フレーム 1, children =  1
1 [name = a id = 1 ] enterFrame
1 [object EventTest] enterFrame
2 [name = a id = 1 ] enterFrame
2 [object EventTest] enterFrame
フレーム 2, children =  1
3 [name = a id = 1 ] enterFrame
3 [object EventTest] enterFrame

これから以下のようなことが分かります。

  • 起動時の処理順序は、配置するムービークリップの生成 → 表示リストへの配置 → ドキュメントクラスの初期化 → フレーム1のフレームアクション
  • フレーム2以降でフレームが進むときの処理順は、ムービークリップのenterFrame → ドキュメントクラスのenterFrame →フレームアクション
  • gotoAndPlayでジャンプした先の処理順は、フレームアクション → ムービークリップのenterFrame → ドキュメントクラスのenterFrame
  • キーフレームに到達しても、フレーム1へ戻っても、オブジェクトはずっと同一のものが存在し続けている。

さて今後、レイヤーを移動したり、間を抜いてみたり、いろいろと試してみますよ。

次回に続く

|

« それは「確信犯」じゃなくて「故意犯」だろうが | トップページ | Flash: ムービークリップの生成を追いかける(2): 出たり消えたり変わったり »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: Flash: ムービークリップの生成を追いかける(1): 処理順序の確認:

« それは「確信犯」じゃなくて「故意犯」だろうが | トップページ | Flash: ムービークリップの生成を追いかける(2): 出たり消えたり変わったり »