条件式でループ再生したい

このQ&Aのポイント
  • ActionScript初心者の質問文です。ボタンを押すと、指定した時間(timeの値)が0になるまでムービークリップ(roop_mc)をループ再生させたいと思っています。for文やwhile文の使い方がよく分からず困っています。初心者ですが、教えていただければ助かります。
  • この質問はActionScript初心者の方からのものです。ボタンを押すと、指定した時間(timeの値)が0になるまでムービークリップ(roop_mc)をループ再生したいという要望です。for文やwhile文の使い方が分からず、本を見ても理解できませんでした。初心者向けに教えていただけると助かります。
  • ActionScript初心者が質問しています。ボタンを押すと、指定した時間(timeの値)が0になるまでムービークリップ(roop_mc)をループ再生させたいという問題を抱えています。for文やwhile文の使い方が分かりませんし、教科書では具体例が少なくて理解できませんでした。初心者でもわかる説明をしていただけると助かります。
回答を見る
  • ベストアンサー

条件式でループ再生したい

ActionScript初心者です。 やり方が分からなくて困っている部分があるので 教えていただければ幸いです。 材料は ■ボタン ■テキストフィールドに変数名をつけたもの(time) ■ムービークリップ(roop_mc) があり、 やりたい事は ボタンを押すと、timeの値が0になるまでroop_mcをループ再生させるという事です。 (timeには、JavaScriptから読み込んだ数字(5とか10とか)が入ってます。) for文を使うのかwhile文を使うのか・・ 考えすぎて訳が分からなくなってしまいました(>_<) 本を見てもfor文やwhile文の例は、計算みたいなのが多くムービークリップをループ再生するやり方が分りません。。 初心者なので、意味不明なところがあるかもしれません がもしご存知の方がいらっしゃいましたら教えていただきたいです。よろしくお願いします。

  • Flash
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.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 を再生するなどの工夫も必要です。 長くなってすみませんでした。 不明な点がありましたら補足してください。

nora_51031
質問者

お礼

DPEさん、ありがとうございます! やってみたら一発で思ってた通りのことが出来て 大感激です(>_<) 色々細かく説明いただいたことも、ちょうど最近本で勉強していた部分だったので、「なるほど~」と思いながら理解できました。本当にありがとうございました。 今やっている作品は、これからも発展させていかなきゃいけないのでまだまだ前途多難です。。もしかしてまたいつか質問させていただく事があるかもしれませんが、その時はまたお助けいただけると嬉しいです。

関連するQ&A

  • ムービークリップを1コマ飛しで再生

    シーン1上にムービークリップ(インスタンス名mc)とボタンを配置します。ボタンを押すとタイムラインを1コマ飛ばしで再生するにはアクションスクリプト3をどのように記入すればよいでしょうか? (再生はループしボタンから離れると止まる)

    • ベストアンサー
    • Flash
  • ムービークリップ再生順序 制御について

    はじめて質問します。Flash初心者ゆえつたない説明ですいませんが、よろしくお願いします! Flash:ActionScript2.0 [現状] メインフレームにABCというムービークリップを配置しています。 それぞれ「mc1」「mc2」「mc3」というインスタンス名がついています。 各ムービークリップにはそれぞれ動きが設定しており、”moving”というフレームラベルをつけています。 [どう動作してほしいか] まずAのムービークリップが再生。Aのムービークリップ再生終了。 ↓ Bのムービークリップ再生開始。Bのムービークリップ再生終了。 ↓ Cのムービークリップ再生開始。Cのムービークリップ再生終了。 ↓ Aに戻る。 上記の動きをタイムラインを利用するのではなく、メインフレームに1つactionScriptを書くことで動作させるにはどうしたらいいでしょうか? ちなみに今は以下のように記述しており、実行すると3つのムービークリップが全て同時に動いてしまいます。 var list:Array = new Array(); for(var i=1; i < 4; i++) { var mcname = "mc" + i ; list[i] = eval(mcname); list[i].gotoAndPlay("moving"); } よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • AS3.0 ループを利用したムービークリップ生成

    お世話になります。 ソフトはFlashCS3を使用しています。Actionscript3.0で書き出そうと思っています。Actionscript3.0初心者ですがよろしくお願いします。 ライブラリーに Mc01,Mc02,Mc03,Mc04とクラスを指定したムービークリップを準備した状態でステージにムービークリップを生成しようと考えています。その際、for文を使って短く書きたいと思っています。 for (var i=0; i>4; i++){ var "Mc0"+i:"Mc0"+i = new "Mc0"+i(); "Mc0"+i.x = 10*i; "Mc0"+i.y = 10*i; this.addChild("Mc0"+1); } 上記のように書くと「1086:シンタックスエラー:identifierがMcの前に必要です。」とエラーが出てうまく作動しません。 参考までに現在は以下のようにすべて書き出しています。 //ムービクリップ01 var Mc01:Mc01 = new Mc01(); Mc01.x = 0; Mc01.y = 0; this.addChild(Mc01); //ムービクリップ02 var Mc02:Mc02 = new Mc02(); Mc02.x = 10; Mc02.y = 10; this.addChild(Mc02); …… 以下省略 特にfor文にこだわっててはいません。ループで生成できればOKです。 どなたかわかる方よろしくお願いします。

    • ベストアンサー
    • Flash
  • Flash フレームを指定してムービークリップ再生

    ActionScript超初心者です。 よろしくお願いします。 ステージ上にボタン「A」「B」「C」を配置、 ボタン脇のスペースにムービークリップを配置、各ボタンで切り替え再生させたいと思っています。 2フレーム目に簡単なアニメーションのムービークリップ「animA」を、 3フレーム目に同様の「animB」4フレーム目に「animC」を配置し、 各ボタンon (release)で各ムービークリップの再生をしたいのですが うまくいきません。 どこにどのようなスクリプトを書けば良いか教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • ループについて

     アンケート的な質問ですが、forの無限ループと、whileの無限ループが、C言語にはありますよね?  whileの場合は、while(1)と書きますし、問題ないですが、 forの場合は、for(;;)とかきますよね。  forの無限ループって、顔文字の涙にみえないですか? for文の無限ループって、何が悲しかったのでしょうか? 答えられる方、こたえてください。

  • 7秒後にフレーム5へ移動してムービークリップを再生

    はじめまして。 FLASH初心者です。 レイヤー1~5の5フレームごとにムービークリップを配置しています。 レイヤー1の1フレーム目に配置してあるムービークリップが再生されて、7秒後にレイヤー2の5フレーム目に配置してあるムービークリップを再生し、(レイヤー3~5も同様に…)レイヤー5に配置してあるムービークリップの再生が終わったら、また7秒後にレイヤー1のムービークリップが再生される…といったように繰り返すにはどのようなActionScriptにすればよいのでしょう? 色々、試行錯誤したのですがうまくいきません。 どなたか教えて頂けませんか? よろしくお願いします。

    • ベストアンサー
    • Flash
  • 条件式の中に入れるとムービークリップが動作しない。

    条件式の中に入れるとムービークリップが動作しない。 またまた、悩みにはまってしまいました。 初期状態で、ボタンのムービークリップを全て、ラベルreadyの静止画像に設定し、 クリックされたときに、そのボタンのラベルhitに移動して、 そこに設定されたムービークリップの動作をさせようとしています。 以下のようなアクションスプリクトを書きましたが、 hitに移動するものの、hitに設定したムービークリップの、 1フレーム目の静止画像しか表示されません。 試しに6行目の_root[buttonName].gotoAndStop("ready"); のreadyをhitに変えると、hitラベルのムービークリップが動作します。 原因は何なのでしょうか??? ////////////////////////////////////////////////////////// var onMapButton_num = 0; onEnterFrame = function () { var buttonName = "onMapButton" + onMapButton_num + "_mc"; for ( var i:Number = 1; i < 6; i++) { // 初期設定 buttonName = "onMapButton" + i + "_mc"; _root[buttonName].gotoAndStop("ready"); //ボタンをすべて ready に } for ( var i:Number = 1; i < 6; i++) { // アクション if ( onMapButton_num== i ) { // ボタンが押された場合 buttonName = "onMapButton" + i + "_mc"; _root[buttonName].gotoAndStop("hit");     // ヒットしたボタンを hit に } } }; // ボタン(1~5)のアクションと 番号の取得 ////////////////////////////////// onMapButton1_mc.onRelease = function() { onMapButton_num = 1; }; onMapButton2_mc.onRelease = function() { onMapButton_num = 2; }; onMapButton3_mc.onRelease = function() { onMapButton_num = 3; }; onMapButton4_mc.onRelease = function() { onMapButton_num = 4; }; onMapButton5_mc.onRelease = function() { onMapButton_num = 5; }; stop();

  • FLASHの同一タイムラインで、複数のムービークリップを順に再生したい

    ムービークリップを複数作成しました。(名前を仮にa_mc, b_mc, c_mcとします。) このムービークリップを順に再生していきたいので、同一タイムライン上の 1フレーム目にa_mc 2フレーム目にb_mc 3フレーム目にc_mc と配置し、タイムラインの最後のフレームに this.stop(); とスクリプトを書きましたが、a_mcの再生が終わったところ(=1フレーム目)で停まってしまいます。 1フレーム目の後、2フレーム目以降(b_mcとc_mc)を続けて再生するには、どのようにすれば良いのでしょうか?

    • ベストアンサー
    • Flash
  • Flashで一部レイヤーだけループ再生

    Flashでホームページのトップページを作っています。背景の部分は一度だけ再生し、 タイトルの部分だけをループ再生したいのですが、 どうすればいいでしょうか。 以前質問があった、下記ページを見ました。 質問:FALSH一部レイヤーだけループ再生 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1069547 で、タイトル部分のレイヤーだけのflaファイルと、 背景部分のレイヤーだけのflaファイルにわけ、 タイトル部分のレイヤーを「新規シンボル」で ムービークリップにしました。 背景のレイヤーだけのflaファイルに、ムービークリップをswfファイルで書き出したファイルを読み込もうとしたのですが、できません。 なんだか混乱してきてしまったのですが、どなたか初心者でもわかるよう、手順を説明していただけませんか? 宜しくお願い致します。

    • ベストアンサー
    • Flash
  • 無限ループとループ文

    プログラミングにおいて while文、for文、foreach文などループ文は種類がありますが 無限ループに繋がってしまう恐れが高い順などは存在しますか? どのループ文もミスなく慎重に 正確な書き方さえしていれば無限ループは起きないと思いますが もしそのような順が存在するのであれば、わからないので教えて頂きたいです。

専門家に質問してみよう