- 締切済み
変数のフレーム間の移動
ムービークリップ内に作ってある変数をフレームを移動してでも呼び出して使えるようにしたいのですが _root.ムービクリップインスタンス.変数名 だとできないです。 どうすればできるのでしょうか? 教えてください
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- DPE
- ベストアンサー率85% (666/776)
あるはずの変数が参照できない理由には、いくつか原因が考えられます。 まず1つは、変数を呼び出そうとしたフレームで、ムービークリップが既にステージから消えてしまっている場合です。 例えば clip というムービークリップが、フレーム1~5までステージに存在しているとします。 clip が持っている変数は、フレーム1~5までの間ならば、メインのタイムラインやフレーム1~5に存在する他のインスタンスからでも参照可能です。 しかし、フレーム6以降は clip はステージから消えます。この時、clip が持っていた変数も一緒に削除されてなくなってしまいます。 _root はムービーそのものを指します。ムービーが再生されている間は消滅することがないので、_root に定義した変数や関数は、フレームやシーンを移動しても消えません。 clip がステージから消えた後(この例ではフレーム6以降)も clip が持っていた情報を利用したい時は、その情報を _root に用意した変数にコピーし、事前に保存しておくといった方法があります。 2番目の理由としては、変数を参照しようとしたタイミングと、ムービークリップの中で変数が定義されるタイミングが合わない場合です。 例えば、先の clip が 10 フレームでできたムービークリップで、clip のフレーム 10 で変数 a が定義されるとします。 メインのタイムラインのフレーム1で a を参照するスクリプトを書いたとすると、このスクリプトが実行される時点では clip のフレーム1が再生されており、この変数はまだ定義されていません。 この場合はどうにもなりませんので、a をもう少し早いフレームで定義するか、呼び出すタイミングを遅らせる、あるいは、他のフレーム間をループして a の値を監視するスクリプトを何度も繰り返し、undefined である間はループ・ undefined でなくなった時先に進む、といった方法で対処してください。 なお、ムービークリップの load イベントを利用して定義した変数は、処理の速度や順番の問題で、ムービークリップがステージに登場するフレームでは利用できない(未定義扱いになる)場合があります。 この場合は、変数を呼び出すフレームを1つずらすことで呼び出せるようになります。 同じシンボルから作られたインスタンスでも、キーフレームが変わると別のものになります。 例えば、フレーム1~5までは clip1 、フレーム6~10までは clip2 というインスタンスが、ステージに存在しているとします。この2つは同じムービークリップシンボルから作られたインスタンスです。 同じシンボルから作られたインスタンス同士であっても、clip1 の持っている変数と clip2 が持っている変数は別のものです。 clip1 が持っていた変数は、先述の通り、clip1 がステージからなくなると同時に消えてしまいますので、フレーム6以降では利用できません。 たとえ、フレーム6から登場するムービークリップに同じく clip1 という名前を付けたとしても、これはフレーム1~5まで存在していた clip1 とは別のものです。前の変数等も初期化あるいは上書きされ、値が変わっています。 このような場合も、先の例と同様に、必要な値を _root の変数に予め保存しておくことで、いつでも参照できるようになります。 それから、よくあるパターンが、ターゲットパスの誤りです。 何かのムービークリップの入れ子になっているムービークリップは、 _root.親のインスタンス名.自分のインスタンス名.変数名 = ・・・ となります。 大文字・小文字・名前の間違いなど、些細な間違いがないか、ご確認ください。 ムービークリップのターゲットパスが分からなければ、自動で挿入する機能もあります。 Flash MX 以降をお使いであれば、「アクション」パネルの上部に、いくつかアイコンが並んでいるかと思います。中央のアイコンが、ターゲットパスを挿入する機能です。リストから対象を選ぶだけで、ターゲットパスが挿入されます。 大体思いつく原因はこんなところですが、該当する点・思い当たる点がありませんでしょうか。
- pawaspa
- ベストアンサー率71% (5/7)
一番手っ取り早いのが、_global変数を使うのが早いと思います。(_global変数はswfファイル内すべてのステージ・ムービークリップで有効) ただ、注意しなければならないのは _global.vx と vx とは違う変数なのですべて書き直すことが必要です。