• ベストアンサー

for文の変数の扱いについて

お世話になります。ムービー1及びムービー2が領域に来たらムービーBを 表示するというアクションスクリプトを作成しています。 領域をryouiki 移動するムービーがmovie1とmovie2 表示されるムービーをmovieB としています。下記のように作成したのですが。 onClipEvent (enterFrame) { for (i=1;i<=2;i++){ moviex="movie" + i; _root.onoff = this.hitTest(_root.[moviex]); _root.movieB._visible = _root.onoff; } } 演算子の後にはフィールド名が必要です。とのエラーメッセージ が表示されます。 _root.onoff = this.hitTest(_root.moviex1) という風に修正すると、無事動くので、変数の扱いがおかしいの だと思うのですが。 よろしくお願いいたします。

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

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.3

何も考えず文法の件だけで回答してしまい、失礼いたしました。 for( i = 1 ; i <= 2 ; i++ ) のループでは、movie1 と ryouiki が重なっていると、_root.onoff は true になり、movieB は表示されます。 ところが、次のループで movie2 との衝突判定をとった時に movie2 が ryouiki に重なっていなければ、 _root.onoff に判定結果が上書きされて false になり、movieB は非表示になります。 もちろん、後から判定される movie2 の結果は最後まで残りますから、movie2 が重なっている時は期待通りの動作になります。 movie2 だけが反応するように見えるのは、このような理由だと思います。 movie1 か 2 のどちらかが重なっていれば movieB を表示するには、要するに、_root.onoff が true になった時点で ryouiki との衝突判定を取るループを打ち切ればいいわけです。 スクリプトを、次のように変更してください。  //衝突判定フラグを初期化  _root.onoff = false;  //全てのムービークリップで衝突判定をとる  //1つでも重なっていれば判定を終了  for( i = 1; i <= 2 && ( ! _root.onoff ) ; i++ )  {   _root.onoff = this.hitTest( _root[ "movie" + i ] );   _root.movieB._visible = _root.onoff;  } for 文は、2番目に書かれた条件が成立している間、ループが継続します。 よく見かける  for( i = 1 ; i <= 2 ; i++ ) この書き方は2回繰り返す意味ですが、正式には「 i が2以下である間、ループを継続」という意味で、実は while 文に近い性質を持っています。 3回目のループで i が3になると、「 i が2以下」の条件が不成立になりますから、ループは終了します。 for 文の継続条件には、単純に「 i が○○である間」といった条件以外にも、様々な条件を指定できます。 今回のループ継続条件は、  ・ i が2以下  ・ _root.onoff が false この2点が成立することです。 スクリプトにしますと、  i <= 2 && ( ! _root.onoff ) となります。 2つ以上の条件がともに成立するかどうかを判断するには、&& を使います。数学で習う「AかつB」の、”かつ”に相当する記号です。 ! は式や変数の評価の結果を反転させます。詳細は割愛しますが、ここではとりあえず、変数の値が0または false の時に条件を成立させる、おまじないのようなものと思ってください。 例えば、movie1 が ryouiki に重なっていた時は、_root.onoff は true になります。” _root.onoff が false ”の条件が不成立になるのでループが打ち切られ、movie2 との衝突判定は実行されません。 movie1 が ryouiki に重なっていなかった場合はループが継続し、movie2 との衝突判定が行われます。 この時、movie2 も重なっていなければ、今度は” i が2以下”の条件が不成立になり、_root.onoff は false のままループが終了します。 長くなりましたが、こんなところでいかがでしょうか。 不明な点がありましたら、また補足してください。

kurateru
質問者

お礼

ありがとうございました。完璧に出来ました。また、何かありましたらよろしくお願いいたします。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • DPE
  • ベストアンサー率85% (666/776)
回答No.2

文字列で変数やインスタンス名を指定するには、eval 関数か配列演算子 [ ] を利用します。 ただし、Flash MX 以降の文法では、eval 関数で変数を指定し、これに値を代入しようとする(つまり、eval が左辺に来る場合)とエラーになります。eval 関数をご使用の際はご注意ください。 配列演算子で変数やインスタンス名を指定する時は、階層を区切るドット( . )を使わずに、配列変数と同様に書きます。 例えば、絶対パスで _root.clip.movie1 というインスタンスであれば、  _root[ "clip" ][ "movie1" ] = ・・・; スクリプトを _root 階層で実行している場合は、自分自身を指す this を使って  this[ "clip" ][ "movie1" ] = ・・・; もしくは自分自身( _root )までの階層を省略して  clip[ "movie1" ] = ・・・; この中のどの表現でも、_root.clip.movie1 を指すことができます。 しかし、  _root[ "clip.movie1" ] = ・・・; このように [ ] の中に複数の階層を表す文字列を書くと、エラーにはなりませんが正常に動作しません。必ず、1階層分の文字列を1組の [ ] でくくるようにします。 ご質問の処理は、配列演算子を使うのでしたら、  onClipEvent(enterFrame)  {   for( i = 1 ; i <= 2 ; i++ )   {    _root.onoff = this.hitTest( _root[ "movie" + i ] );    _root.movieB._visible = _root.onoff;   }  } (↑このスクリプトをコピーして使う場合は、各行頭の全角のスペースを、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります) こんな感じでいかがでしょう。

参考URL:
http://www.macromedia.com/jp/support/flash/ts/documents/fl0263.html
kurateru
質問者

補足

ありがとうございます。しかしmovie1が領域にきても、movieBを表示しないのです。 for( i = 1 ; i <= 1 ; i++ )とするとmovie1は反応しますが、movie2には反応しません。(当たり前なのですが(^^;)) for( i = 1 ; i <= 2 ; i++ )とするとmovie2は反応しますが、movie1には反応しません。 for( i = 1 ; i <= 3 ; i++ )とするとmovie1・movie2t共に反応しません。 領域とmovieBはレイヤー1、movie1とmovie2はそれぞれレイヤー2、レイヤー3に配置してあります。使用しているFlashはMXです。 どうかよろしくお願いします

すると、全ての回答が全文表示されます。
  • akira_
  • ベストアンサー率50% (2/4)
回答No.1

間違っていたらすいません、 _root.onoff = this.hitTest(_root.[moviex]); の 「 "[" と "]"」はいらなくないですか? また、変数からムービークリックなどの名前を作成するときは、 moviex=eval('"movie" + i); という風に「eval」でくくらないとダメでしたよね? どうでしょうか?

kurateru
質問者

補足

moviex=eval("movie" + i); _root.onoff = this.hitTest(_root.moviex) とするとエラーは起きませんが、movie1及びmovie2が 領域にきても、反応しませんでした。

すると、全ての回答が全文表示されます。

関連するQ&A