アプリ版:「スタンプのみでお礼する」機能のリリースについて

ムービークリップ内に作ってある変数をフレームを移動してでも呼び出して使えるようにしたいのですが
_root.ムービクリップインスタンス.変数名
だとできないです。
どうすればできるのでしょうか?
教えてください

A 回答 (2件)

あるはずの変数が参照できない理由には、いくつか原因が考えられます。




まず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 以降をお使いであれば、「アクション」パネルの上部に、いくつかアイコンが並んでいるかと思います。中央のアイコンが、ターゲットパスを挿入する機能です。リストから対象を選ぶだけで、ターゲットパスが挿入されます。


大体思いつく原因はこんなところですが、該当する点・思い当たる点がありませんでしょうか。
    • good
    • 0

一番手っ取り早いのが、_global変数を使うのが早いと思います。

(_global変数はswfファイル内すべてのステージ・ムービークリップで有効)
ただ、注意しなければならないのは
_global.vx

vx
とは違う変数なのですべて書き直すことが必要です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!