« Flash: ムービークリップの生成を追いかける(1): 処理順序の確認 | トップページ | FlashDevelop »

2008/12/09

Flash: ムービークリップの生成を追いかける(2): 出たり消えたり変わったり

前回は追いかけるための道具立てと基本事項の確認のようなものでした。

今回はそれを元に、何を変えたら別物になるのかいろいろやってみます。

変形させてみる

フレーム2のムービークリップを、自由変形ツールで移動させたり、回転させたり、変形させたりします。

実行した出力は元と同じになりました。

変形させても同じものと認識されるようです。

色を変えてみる

フレーム2だけムービークリップにカラーやブレンドを設定してみます。

これも出力は元と同じになりました。

フィルタを適用してみる

フレーム2だけムービークリップにフィルタを適用してみます。

これも出力は元と同じになりました。

最後を取ってみる

フレーム4でgotoAndPlay(1)しているということは、フレーム4は表示されないんだから、ここにはムービークリップは無くても変わりないように思えます。ということで取ってしまいます。

すると出力はこのようになりました。

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
3 [name = a id = 1 ] removed
3 [name = a id = 1 ] removedFromStage
4 [name = a id = 1 ] enterFrame
4 [object EventTest] enterFrame
フレーム 4, children =  0
create [id 2 ]
1 [name = a id = 2 ] added
1 [name = a id = 2 ] addedToStage
フレーム 1, children =  1
1 [name = a id = 1 ] enterFrame
1 [object EventTest] enterFrame
1 [name = a id = 2 ] enterFrame
2 [name = a id = 1 ] enterFrame
2 [object EventTest] enterFrame
2 [name = a id = 2 ] enterFrame
フレーム 2, children =  1
3 [name = a id = 1 ] enterFrame
3 [object EventTest] enterFrame
3 [name = a id = 2 ] enterFrame

フレーム4からはムービークリップを取ってしまったので、フレーム3の最後にステージから取り除かれ、フレーム1に戻ったところで、新しいムービークリップが作られています。またそれ以降も最初のムービークリップのenterFrameイベントは発生しています。

ここから以下のことが分かります。

  • 存在が途切れたムービークリップは、ステージから取り除かれ、再利用はされない。
  • ガベージコレクションされるまでは、取り除かれたオブジェクトもイベントを受け取り続ける。

ということは、いらなくなったオブジェクトのイベントリスナーは取り除いておかないと、無駄な処理が発生するということですね。

この結果を見ると、同じ種類のムービークリップが現れたり消えたりを繰り返すような場合は、飛び飛びのフレームにそれぞれ配置するより、その期間ベッタリと配置しておいて、visibleプロパティで表示・非表示を切り替えた方が効率的なのではという気がしてきました。

取る前に戻ってみる

フレーム4に足を踏み入れてから戻ったのでは、ムービークリップは一度無くなって新たに作り直されます。じゃあ、存在が途切れる前に前へ戻ったらどうでしょう?ということで、フレーム3に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
フレーム 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

最初に戻っても、オブジェクトは作り直されません。

つまり、全フレームにずっと存在するかではなくて、存在が途切れなければ、作り直されずに同じオブジェクトが存在し続けるということのようです。

レイヤーを移動してみる

flaファイルを最初の状態(全フレームにムービークリップが存在し、フレーム4で最初に戻る)に戻し、フレーム2のムービークリップをカットし、空のレイヤー2にペーストします。

すると出力はこのようになりました。

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

別のレイヤーのものは別物という扱いのようです。

今回はこの辺で。

|

« Flash: ムービークリップの生成を追いかける(1): 処理順序の確認 | トップページ | FlashDevelop »

コメント

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

トラックバック


この記事へのトラックバック一覧です: Flash: ムービークリップの生成を追いかける(2): 出たり消えたり変わったり:

« Flash: ムービークリップの生成を追いかける(1): 処理順序の確認 | トップページ | FlashDevelop »