• ベストアンサー

Flash ステージに初期配置したMCがnull

FlashPro CS5で as3の勉強をしています。 メインのタイムラインにマスク用のレイヤーを作成し、その2フレーム目にムービークリップを配置してインスタンス名を付けました。 ところが、ドキュメントクラスオブジェクトからこのマスク用のインスタンスを参照したところ、nullが返って来てしまいました。 これはどういった仕組みになっているのでしょうか? 2フレーム目で初めてインスタンスが生成されるのでしょうか? 再び1フレーム目に戻ってきた時にはどうなっているのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

>2フレーム目で初めてインスタンスが生成されるのでしょうか? そうですよ。 > 再び1フレーム目に戻ってきた時にはどうなっているのでしょうか? レイヤーに依存しないように深度(表示順)をスクリプトで変えているなどのことをしない限り,普通は消えてる(存在していない)でしょう。 以上。 ============ 以上で終わりたいところですが 単純に考えて, 例えばそのインスタンスのy座標を50にしたいとしましょうか。 または 例えばそのインスタンスのy座標を取得したいとしましょうか。 「y座標を50にしたい」として 何フレーム目のそのインスタンスのy座標を50にするのでしょうか? インスタンスはどこに配置されるかもわかりませんし動き回る可能性もあるのです。 仮にそのインスタンスが1フレーム目で生成されていたとしても その時点で指示などできないでしょう? 「y座標を取得したい」として 何フレーム目のそのインスタンスのy座標を取得するのでしょうか? インスタンスはどこに配置されるかもわかりませんし動き回る可能性もあるのです。 仮にそのインスタンスが1フレーム目で生成されていたとしても その時点で2フレーム以降に出没するインスタンスの座標など取得などできないでしょう?

narue2
質問者

補足

ご回答ありがとうございます。 >そうですよ。 表示リストに対して追加、除外されるだけでなく、インスタンスはフレーム単位で生成と消滅を繰り返しているということですね。 仮に、全6フレームで構成されるタイムラインの中に、1,3,4,6フレームに同じインスタンス名でインスタンスが存在した場合、そのインスタンスは2,5フレーム(あるいはその直前)で消滅し、1,3,6フレーム目で生成されるのか、それとも全てのフレームで消滅と生成が行われるのでしょうか? >レイヤーに依存しないように深度(表示順)をスクリプトで変えているなどのことをしない限り,普通は消えてる(存在していない)でしょう。 レイヤーに依存しないように深度を変えるというのはどうすればいいのでしょうか?表示リストからremoveChildren()で参照を外すことによって削除されないようにするという事ですか? 度重なる質問で申し訳ないのですが、flash特有のタイムラインやレイヤーについては特に理解を深めたいと思っておりますので、どうぞよろしくお願い致します。

その他の回答 (1)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1です。 > 1,3,4,6フレームに同じインスタンス名でインスタンスが存在した場合、 > そのインスタンスは2,5フレーム(あるいはその直前)で消滅し、 > 1,3,6フレーム目で生成されるのか、 その通り(その前者の通り)です。 > レイヤーに依存しないように深度を変えるというのは > どうすればいいのでしょうか? 以下に書くことは1つの方法例です。 新規ドキュメントを作成します。 フレーム1 とか 2 とかだと観察がしにくいので メインタイムラインのフレーム数を全部で 20フレーム にします。 その フレーム10 辺りでも選択してキーフレームに変換し そのキーフレームのステージ上に適当なムービークリップを作成し 例えば「my_mc」というインスタンス名を付けます。 ※参考【図】↓ この状態のまま「制御」→「ムービープレビュー」をすると 当然のことですが「my_mc」は出たり消えたりを繰り返します。 「my_mc」はレイヤーに乗っている(依存している)からです。 次にActionScriptを書く用に新規レイヤーを追加し 「my_mc」を配置したフレーム(フレーム10)をキーフレームに変換し そのキーフレームに次のようなスクリプトを書きます。 --------------------------------------------- //ムービークリップ「new_mc」を作成 var new_mc:MovieClip = new MovieClip(); //この階層(root)に「new_mc」を配置 this.addChild(new_mc); //この階層の「my_mc」と「new_mc」の表示順を入れ替える this.swapChildren(my_mc,new_mc); --------------------------------------------- そして「制御」→「ムービープレビュー」をすると 今度は「my_mc」は出たままになると思います。 新しく作成した「new_mc」はレイヤーに依存していません。 その「new_mc」と「my_mc」との表示順を入れ替えるので 「my_mc」はレイヤーからはずされてしまうということになります。 こうなると,フレーム1 に戻ったときにも「my_mc」は存在し続けるということになります。

narue2
質問者

お礼

ご回答ありがとうございます。 試しにフレーム1にインスタンスを動的に生成しリストに追加するコードを書き、そこで生成されたインスタンスと10フレーム目に配置されたmy_mcを10フレーム目で入れ替えてみました。 そしてフレーム1でnumChildrenをトレースしたところ、一周する毎に1, 3, 5, …と増え続けていきました。my_mcはインデックスがずらされたことによって削除されなくなり、しかし生成は常にされ続けるようでした。 予想では身代わりにスワップされたインスタンスが削除されると思っていたのですが、そちらも残ったのがちょっと意外でした。 BlurFiltan様、曖昧な質問に非常に興味深い例を提示してくださり、本当に勉強になりました。 お忙しい所丁寧にお答え下さいました事を、心から感謝しております (o_ _)o))