- ベストアンサー
条件式でループ再生したい
- ActionScript初心者の質問文です。ボタンを押すと、指定した時間(timeの値)が0になるまでムービークリップ(roop_mc)をループ再生させたいと思っています。for文やwhile文の使い方がよく分からず困っています。初心者ですが、教えていただければ助かります。
- この質問はActionScript初心者の方からのものです。ボタンを押すと、指定した時間(timeの値)が0になるまでムービークリップ(roop_mc)をループ再生したいという要望です。for文やwhile文の使い方が分からず、本を見ても理解できませんでした。初心者向けに教えていただけると助かります。
- ActionScript初心者が質問しています。ボタンを押すと、指定した時間(timeの値)が0になるまでムービークリップ(roop_mc)をループ再生させたいという問題を抱えています。for文やwhile文の使い方が分かりませんし、教科書では具体例が少なくて理解できませんでした。初心者でもわかる説明をしていただけると助かります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
for や while は、1つのフレーム内で繰り返し処理をしたい場合に使います。 今回は複数のフレームをまたいだループになりますので、for や while は使えません。 要するに、time の値が0でなければ roop_mc のフレーム1に戻り、0の時は最後のフレームで止まればいいわけです。 roop_mc の最後のフレームで time の値を if 文で判断し、その値によって動作を変える、というのはいかがでしょう。 なお、変数名の time という名前は、Flash では識別子になっているようですので、ここでは times という名前で説明します。 ActionScript では、変数や関数・ムービークリップを操作する時は、それらがどの階層にあるかを指定しなければなりません。いわば、変数やムービークリップの持ち主が誰であるかを、はっきりと指定するようなものです。省略すると、自分自身が持っているものを参照する、という意味になります。 JavaScript で読み込んだ数字が入っているとすると、おそらく、変数 times を持っているのはムービー自身だと思います。 Flash では、ムービーそのものも _root という名前のムービークリップとして扱います。 roop_mc からムービー自身の持つ times を参照するには、 _root.times = ・・・ という具合に、times の持ち主(ターゲットパスといいます)を指定して利用します。 roop_mc がステージに配置されている場合、roop_mc はムービー自身( _root )の子にあたります。子から親の階層を指す _parent という相対表現を使って、 _parent.times = ・・・ でも、同じように times を利用できます。 times の値によって分岐するスクリプトは、大体、次のようになります。 このスクリプトは、roop_mc の最後のフレームにキーフレームを作り、そこに設定してください。ActionScript 専用のレイヤーを用意しておくといいでしょう。 (↓このスクリプトをコピーする場合は、各行頭に入っている全角のスペースを、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります) //回数を減らす _root.times--; //指定回数だけループした場合は停止 if( _root.times <= 0 ) { this.stop(); } //それ以外の場合はループ(フレーム1に戻る) else { this.gotoAndPlay( 1 ); } this はやはり階層を表す表現で、自分自身を指します。roop_mc で使った場合、this とは roop_mc を表します。 stop と gotoAndPlay は、_root や他のムービークリップでも利用できるメソッド(関数のようなもの)です。this は省略もできますが、ここでは roop_mc が持っている stop や gotoAndPlay を使うという意味で、あえて明示しています。 先述のスクリプトは、roop_mc のフレーム(タイムライン)に記述しました。フレームで実行するスクリプトは、”フレームアクション”といいます。 ステージにあるボタンやムービークリップのインスタンスにも、スクリプトを設定することができます。これらは”オブジェクトアクション”と呼ばれ、ボタンやムービークリップで指定の現象(イベント)が起きた時に、設定したスクリプトが実行されます。 イベントはいろいろありますが、よく使うものは、 load : ステージにムービークリップが登場した時 enterFrame : ステージに存在している間、常に発生している press : クリックされた瞬間 release : クリックして、マウスのボタンが離された時 などです。 roop_mc が、ステージに登場するなり再生されたのでは困ります。最初は止めておきましょう。 ”最初の1回だけ”実行したい処理は、ムービークリップがステージに登場した、その時1回だけ発生する ” load ”イベントを利用します。 次のようなスクリプトを、ステージにある roop_mc に設定してください。ムービーが始まった直後、roop_mc はフレーム1で止まった状態になります。 //最初は止めておく onClipEvent(load) { this.stop(); } onClipEvent は、ムービークリップにオブジェクトアクションを書く時の決まりごとです。( ) の中には、何のイベントが起きた時にスクリプトを実行するかを指定する文字列(イベントハンドラ)を書きます。 このままでは、roop_mc はいつまで経っても再生されません。 roop_mc が再生されるのはボタンがクリックされた時です。ボタンにもオブジェクトアクションを設定し、ボタンが押された時に roop_mc を再生するようにしましょう。 ボタンが押された時の処理には、” press ”か” release ”イベントを使います。 ボタンにオブジェクトアクションを設定する時は、onClipEvent ではなく on というアクションの中に書きます。 on(release) { //ムービークリップを再生 _root.roop_mc.gotoAndPlay( 1 ); } 基本的にはこんなところです。 しかし、例えば roop_mc が再生中にボタンがクリックされると、再びフレーム1に戻ってしまうといった、不測の事態も考えられます。 簡単な対策としては、roop_mc が再生中であるという情報を変数に残し、再生中はボタンが押されても無視することです。 変数はどこに用意してもいいのですが、仮に _root に用意するとします。 メインのタイムラインのフレーム1に、次のようなアクションを設定します。 //ムービークリップの再生フラグ:true の時、再生中 play_flg = false; _root 階層に、play_flg という変数が用意されます。最初は false という値を入れておき、roop_mc が再生中の時は、この変数に true を入れることにします。 ボタンでは if 文でこの変数の値を見て、false だった場合のみ、roop_mc を再生させます。 ちなみに、状況などを保存しておいて何かの判断の材料にする変数のことは、フラグとも呼ばれます。 ボタンのスクリプトに、play_flg を判断する処理を加えます。 先ほどボタンに設定したスクリプトを、次のように変更してください。 on(release) { //ムービークリップが再生中でなければ再生する if( _root.play_flg == false ) { roop_mc.gotoAndPlay( 1 ); //再生中にクリックされても無視されるようにする _root.play_flg = true; } } ボタンがクリックされた時は、roop_mc を再生させると同時に、” roop_mc が再生中である”という情報を、play_flg に残すようにします。 1度ボタンをクリックすると、play_flg の中身は true になります。次にクリックした時は if 文の条件が不成立になりますから、スクリプトが実行されなくなります。 ですが、今度は、roop_mc の再生が終わっているのに、ボタンをクリックしても2度と再生されないようになってしまいます。 再度再生できるようにするには、play_flg の中身を false に戻しておかなければなりません。 false に戻すタイミングは、roop_mc のタイムラインを止める時です。roop_mc に書いたスクリプトの、this.stop(); の後に //再度再生できるようにする _root.play_flg = false; というスクリプトを追加してください。 何度も再生できるようにする場合は、times の値にご注意ください。一旦ループ再生した後は、times の中身は0になっています。 例えばテキストフィールドに回数を入力してもらって再生する場合は、times の値を予めチェックしてから roop_mc を再生するなどの工夫も必要です。 長くなってすみませんでした。 不明な点がありましたら補足してください。
お礼
DPEさん、ありがとうございます! やってみたら一発で思ってた通りのことが出来て 大感激です(>_<) 色々細かく説明いただいたことも、ちょうど最近本で勉強していた部分だったので、「なるほど~」と思いながら理解できました。本当にありがとうございました。 今やっている作品は、これからも発展させていかなきゃいけないのでまだまだ前途多難です。。もしかしてまたいつか質問させていただく事があるかもしれませんが、その時はまたお助けいただけると嬉しいです。