• 05 «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • » 07
ASOK?
ActionScriptでFlashつくるよ
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
page top
new AddChildしてないモノも、自動でatCastAddedが呼ばれる
atCastAdded中に表示リストに乗っけたモノは、ちゃんとremoveしないとダメよ。
■経緯

案件でCastのatCastAdded時にエラーが発生。

Error: ExecuteError #000: 実行中ではない対象 CommandExecutor に対して操作を行うことはできません。

原因はatCastAdded時に、new AddChildしたキャストオブジェクトをRemoveChildしてなかったこと。
せっかくなので、この機会に深掘りしてみる。


■実験

CastSprite上に複数のCastSpriteを、違うやり方で配置してみる。

bg: FLA上でタイムライン配置
closeButton: atCastAdded前に、new AddChild
tojiruButton: atCastAdded前に、addChild
title: atCastAddedの中で、new AddChild
body: atCastAddedの中で、addChild


●親CastSpriteのaddChild 1回目

――――――――――――――――――――――――――

[info] シーン /index/kazoku でイベント sceneInit を実行
KazokuView.atCastAdded(
KazokuView.atCastAdded: command begin
KazokuTitle.atCastAdded(
KazokuView.atCastAdded: command end
WindowBg.atCastAdded(
CloseButton.atCastAdded(
TojiruButton.atCastAdded(
[info] シーン移動を完了
――――――――――――――――――――――――――
bg: 親のatCastAddedが全部すんだ後に、atCastAddedイベント発生
closeButton: 親のatCastAddedが全部すんだ後に、atCastAddedイベント発生
tojiruButton: 親のatCastAddedが全部すんだ後に、atCastAddedイベント発生
title: new AddChildされるとすぐにatCastAddedイベント発生(当然)
body: atCastAddedイベント発生せず


●親CastSpriteのaddChild 1回目

――――――――――――――――――――――――――

[info] シーン /index/kazoku でイベント sceneInit を実行
KazokuView.atCastAdded(
KazokuView.atCastAdded: command begin
KazokuTitle.atCastAdded(
KazokuView.atCastAdded: command end
WindowBg.atCastAdded(
CloseButton.atCastAdded(
TojiruButton.atCastAdded(
KazokuTitle.atCastAdded(
Error: ExecuteError #000: 実行中ではない対象 CommandExecutor に対して操作を行うことはできません。
…(略)…
KazokuBody.atCastAdded(
Error: ExecuteError #000: 実行中ではない対象 CommandExecutor に対して操作を行うことはできません。
…(略)…
[info] シーン移動を完了
――――――――――――――――――――――――――
途中までは1回目と同じ…
だがTojiruButtonのイベント発生後、
・なぜかtitleのイベント発生。(ここでエラー)
・さらにbodyのイベント発生(ここでもエラー)


■結論

new AddChildしてないモノも、自動でatCastAddedが呼ばれる
atCastAdded中に表示リストに乗っけたモノは、ちゃんとremoveしないとダメよ(addChild()でもAddChildでも同じ)。
atCastAdded前から表示されてるモノは平気


■考察:なぜそうなるか

アルゴリズム予想
1. atCastAdded開始前に、子のDisplayObjectをチェックし、Castのリストを保存
2. atCastAddedメソッドを処理
3. atCastAddedのコマンドを処理
4. コマンド完了後、1のリストのCastに対してatCastAddedイベントを発生させる

関連記事
page top

コメント

管理者にだけ表示を許可する
 
承認待ちコメント
| | 2011-12-06-Tue 19:51 [EDIT]
このコメントは管理者の承認待ちです

トラックバック
TB*URL
Copyright © 2005 ASOK?. all rights reserved.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。