ムービークリップを特定の組み合わせでランダム再生する方法

このQ&Aのポイント
  • Adobe Flash Pro CS6を使用して、複数のループムービークリップを特定の順番でランダムに再生する方法を考えています。
  • 使用するムービークリップはmcA、mcB、mcC、mcD、mcEの5つで、再生時間はmcDのみが20フレームで、他はすべて10フレームです。
  • 現在はレイヤー上にムービークリップを配置し、フレームラベルと配列を使用してランダムに再生していますが、管理がしにくいため改善方法を模索しています。
回答を見る
  • ベストアンサー

ムービークリップを特定の組み合わせでランダム再生

Adobe Flash Pro CS6 でAction Script 3を使っています。 今現在複数あるループムービーを特定の組み合わせでランダム再生する方法を考えています。 使用するムービークリップの数は全部で5つです。 mcA,mcB,mcC,mcD,mcEと5つあります。クリップの再生時間はmcDのみが20フレームでほかはすべて10フレームです。これらのムービークリップをある程度のランダム性を持たせて特定の順番で再生したいのです。特定の順番は以下のとおりです。 mcA - mcB mcA - mcB - mcB mcC - mcD - mcE mcC - mcD - mcD - mcE mcC - mcD - mcD - mcD - mcE この四通りの再生方法でムービークリップをランダムで再生し続けたいのです。 それぞれのクリップはループになっているのでmcBからmcA or mcC、mcEからmcA or mcCに繋がってもシームレスに再生し続けられる感じになっています。 どういった方法を用いるのが最善でしょうか? 今現在一つのレイヤーに (mcA - mcB)( mcA - mcB - mcB )(mcC - mcD - mcE)(mcC - mcD - mcD - mcE)(mcC - mcD - mcD - mcD - mcE) と言った感じにすべてのムービークリップを再生する順番に配置して、それぞれの区切りでフレームラベルを用意して、配列にフレームラベルをすべて入れて、その配列とMath.randomを組み合わせてフレームラベルをランダムで選び、再生位置を飛ばして再生し続けていますが、これだとレイヤーの管理がしにくいのでいまいちしっくりきません。

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

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

メインのタイムラインは1フレームのみで mcA ~ mcE は全てその フレーム1 に置いてあるものとします。 その場合 その フレーム1 に書くスクリプト例です↓。 //======================================= // MC の参照を登録する配列を作成 var mc_arr:Array = [mcA,mcB,mcC,mcD,mcE]; // MC の再生順を登録する配列を作成 var ord_arr:Array = new Array(); // MC の再生順を各要素に登録(2次元配列) ord_arr[0] = [mcA,mcB]; ord_arr[1] = [mcA,mcB,mcB]; ord_arr[2] = [mcC,mcD,mcE]; ord_arr[3] = [mcC,mcD,mcD,mcE]; ord_arr[4] = [mcC,mcD,mcD,mcD,mcE]; //---↑以上が初期登録↑--- //登録した MC を全て非表示にして再生停止 for (var i:int = 0; i<mc_arr.length; i++) { mc_arr[i].stop(); mc_arr[i].visible = false; } //ランダムな再生順の数を入れる変数の宣言 var rnd:int; //再生順のカウンタを作成 var cnt:int = 0; //関数 randomMCPlay の定義 function randomMCPlay():void { //再生中のMCを非表示&再生停止 ord_arr[rnd][cnt].visible = false; ord_arr[rnd][cnt].gotoAndStop(1); //ランダムな再生順の数を取得 rnd = Math.floor(Math.random() * ord_arr.length); //再生順のカウンタを初期化 cnt = 0; //ランダムな再生順の数の対応MCを表示&再生開始 ord_arr[rnd][cnt].visible = true; ord_arr[rnd][cnt].gotoAndPlay(1); //毎フレーム 関数 watchMC を実行 this.addEventListener(Event.ENTER_FRAME,watchMC); } //関数 nextMCPlay の定義 function nextMCPlay():void { //再生中のMCを非表示&再生停止 ord_arr[rnd][cnt].visible = false; ord_arr[rnd][cnt].gotoAndStop(1); //再生順をカウントアップ cnt++; //対応MCを表示&再生開始 ord_arr[rnd][cnt].visible = true; ord_arr[rnd][cnt].gotoAndPlay(1); //毎フレーム 関数 watchMC を実行 this.addEventListener(Event.ENTER_FRAME,watchMC); } //関数 watchMC の定義 function watchMC(e:Event):void { //もし再生中のMCが最終フレームに達すれば if (ord_arr[rnd][cnt].currentFrame == ord_arr[rnd][cnt].totalFrames) { ord_arr[rnd][cnt].stop(); //毎フレーム 関数 watchMC を実行するのをやめる this.removeEventListener(Event.ENTER_FRAME,watchMC); //毎フレーム 関数 selectFunction を実行 this.addEventListener(Event.ENTER_FRAME,selectFunction); } } //関数 selectFunction の定義 function selectFunction(e:Event):void { //もし再生順が最後であれば if (cnt == ord_arr[rnd].length - 1) { //関数 randomMCPlay を実行 randomMCPlay(); } else { //それ以外は 関数 nextMCPlay を実行 nextMCPlay(); } //毎フレーム 関数 selectFunction を実行するのをやめる this.removeEventListener(Event.ENTER_FRAME,selectFunction); } //関数 randomMCPlay の初回実行 randomMCPlay(); //======================================= 上記スクリプト中の 「---↑以上が初期登録↑---」より上の部分を変えれば その他は触らなくても自動的にそれに従った動作になります。 内容を大まかに言えば 「関数 randomMCPlay」または 「関数 nextMCPlay」を実行させることによって 次のMCの再生を開始させています。 「関数 randomMCPlay」の方がランダムで順を選ぶ動作で 「関数 nextMCPlay」の方がその順内で次のMCを選ぶ動作です。 そして 再生中のMCのタイムラインを 「関数 watchMC」で見張らせておいて 再生中のMCが最終フレームになったとき 「関数 selectFunction」を実行させて 「関数 randomMCPlay」または 「関数 nextMCPlay」のどちらかを実行させる というようなしくみにしています。 本当は 再生中のMCのタイムラインを 「関数 watchMC」で見張らせておいて 再生中のMCが最終フレームになったとき 「関数 selectFunction」を介さずに即 「関数 randomMCPlay」または 「関数 nextMCPlay」のどちらかを実行させる というような動作にしたいところですが そのようにすると mcA~mcE の 最終フレーム(MC内の フレーム10 や 20)が表示されないまま 次の MC の再生が開始されてしまいます。 そうならないように 「関数 randomMCPlay」または 「関数 nextMCPlay」のどちらかを実行させる というタイミングを 1フレーム 時間待たせるために 「関数 selectFunction」を用意して Event.ENTER_FRAME で実行させて,即削除しています。 ※ Event.ENTER_FRAME で実行される   イベントリスナーの初回実行タイミングは   addEventListener が実行された   次のフレーム時間に入った最初の瞬間です。

Fawkes
質問者

お礼

ありがとうございます。問題なく動きました。丁寧な解説ありがとうございます。自分のフラッシュ制作にはとても使えるスクリプトなのでこれからも大事に使わせて頂きます。それと今スクリプトを読んでどういう内容なのか理解しようとしています。自力で理解できないところがあったら補足で質問させてもらうかもしれません。

関連するQ&A

  • 同じMCが連続で再生されないようにランダム再生

    Flash CS6 でAS3を使っています。 質問ですが、同じムービークリップが連続で再生されないようにランダム再生を続けるにはどうすればよいでしょうか? 例えば  mcA、mcB、mcCと3つのムービークリップがあるとして 最初にmcAが再生されたら次はmcBかmcCが再生されるようにし、そこでmcBが再生されたら次はmcAかmcCが再生されるようにし、そこでmcCが再生されれば次はmcAかmcBが再生されるようにする、といった具合にランダムでムービークリップの連続再生をしたいのです。 それと同じムービークリップが連続で再生される確率を下げてランダム再生を続ける方法はありませんでしょうか? 例えば最初の質問と同じように mcA、mcB、mcCと3つのムービークリップがあるとして 最初にmcAが再生されたら次はmcAが連続で再生される確率を下げ、mcAかmcBかmcCが再生されるようにし(確率でいうと、次はmcAは10%、mcBとmcCは45%の確率で再生されるようにする、といった感じです。)、そこでmcBが再生されたら次はmcBが連続で再生される確率を下げ、mcAかmcBかmcCが再生されるようにするといった具合に連続再生をしたいのです。 質問は以上の2つです。宜しくお願いします。

    • ベストアンサー
    • Flash
  • 7秒後にフレーム5へ移動してムービークリップを再生

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

    • ベストアンサー
    • Flash
  • Fpsを増減させても一定のスピードで再生する方法

    Adobe Flash Pro CS6 でAS3を使っています。 質問はタイトルの通りなんですが例えばルートにフラッシュの再生速度を速くしたり遅くしたりするFps変更スイッチと mcA,mcBと2つのムービークリップがあるとして mcAはFPS変更の影響をうけるようにし、逆にmcBはFps変更の影響をうけないように2つのムービークリップを同時に再生をしたいのです。そのときmcA,mcB両方とも1フレームも欠けることなく再生したいです。 自分で試してみた方法は、mcBの中の全フレームに stop();を記述しルートに function mc_Play():void { mcB.play(); } setInterval(mc_Play,200); と記述して再生スピードを強制的に固定する方法を試したのですが、Fps変更ボタンを押してFps変更を行うときに、setIntervalで制御しきれていないのかもしれませんが、微妙にmcBの再生速度が遅くなったり速くなったりと変化してしまいます。何か他に良い方法はありませんでしょうか?例ではムービークリップの数を少なくしていますが実際のプロジェクトファイルでは、ムービークリップの数は20以上ありそれぞれが10フレーム以上の長さのアニメーションファイルを持っています。その20以上あるムービークリップの数個だけFPS増減の影響をうけないように再生速度を固定したいのです。

  • AS2.0 ボタン化したムービークリップを途中で変更

    AS2.0で困っています。 ●現在、ムービークリップ「color1」内のフレームに【_up】【_over】【_down】とラベルを作って、ボタンにしています。 ムービークリップ「color1」自体には、[on(release){}]と記述しています。 (ボタンとして機能しています。) そこまではよかったのですが、 ムービークリップ「color1」の【_down】ラベルのあとに【playing】というフレームラベルを作って、【playing】ラベルのアニメーションを再生したいと思ったら、できませんでした。 ○【_down】のスクリプトレイヤーに、gotoAndPlay("playing"); と記述しましたが、全く動きません。 初歩的な質問で大変申し訳ないのですが、 どのような構造にすれば、【_down】から【playing】レイヤーを再生できますか? よろしくお願いいたします。

  • ムービークリップ再生後次のフレームへ移動しません

    アクションスクリプトを使って、テキストが下から上へ流れるようにムービークリップを再生し、テキストが流れ終わったところで次のフレームへ移動させたいのですが、フレームが移動せず困っています。 スクリプトは色々なところで調べて、やっとの事で下記のように書きました。 使用しているのはFlash MX 2004 です。 |○  □|○|  ←1.スクリプトレイヤー |●    □|  ←2.ムービークリップレイヤー |○|●→|●|  ←3.ムービークリップ後に再生したいレイヤー 1.のスクリプト(2つのキーフレームいずれとも) stop(); 2.のムービークリップのスクリプト onClipEvent (load) { spd =5; onClipEvent (enterFrame) { this._y = this._y-spd; if (this._y<=-10) { spd = 0; gotoAndPlay(2); } } 知り合いにお見舞いのメッセージをと思って作ったのですが、送ることが出来なくてとてもあせっています。 どうぞよろしくお願いします。

    • ベストアンサー
    • Flash
  • ムービークリップの深度変更

    タイムラインの同じフレーム上に 1~10(10個)のムービークリップを配置し、 1のムービークリップの再生が終わったら、 2のムービークリップが一番上に来て再生が始まり、 2の再生が終わったら、3が一番上に来て再生が始まる、 (10が終わったら1へ戻るループ)という流れのムービーを作成したいと考えています。 ムービークリップ再生終了後、自動的に深度を変える 方法がわからずご質問させて頂きますが、 可能でしょうか? 以下のサイトのような動きをさせたいと思っております。 http://www.tipness.co.jp/ よろしくお願い致します。

    • ベストアンサー
    • Flash
  • Flash 重複しないムービー再生とその後の処理について

    標題の件、似たようなケースは多く、質問もいろいろ寄せられているの ですが、どうしても自分のケースに応用できなくて質問させていただき ました。 バージョンは「Flash MX 2004」で、やりたいことは以下の内容です。 ------------------------------------------- (1)9つのムービークリップを重複しないようにランダムに再生。  (なので正確にはシャッフルになるのでしょうか。。) (2)全てのムービーを再生後、次のフレームへ移動します。 ------------------------------------------- 以上です。 現在、1フレーム目に“Math.random();”を使ってランダムな数を取得 し、2~10フレームまで任意のフレームへ移動するよう設定していま す。2~10フレームまでは各ムービーを1フレームずつ配置している 状態で、それぞれstop();を設定しています。 各ムービークリップの最後のフレームには“_root.gotoAndStop(1);”を 設定して再びランダムな数を取得するようにしていますが、これだと重複 してしまうし、なおかつループし続けます。 「重複せずに全ムービーを再生後、11フレームへ移行する」という処理 がどうしてもわからず、ここから先が行き詰まってしまいました。 Math.random();のメソッド自体が適切でないのかも知れませんが、それら もふまえて、ご伝授いただけますでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ランダム配置のムービークリップが固定配置のムービーに被ってしまいます。

    背景にランダムで星を無数に配置して瞬かせ、その上にキャラクターのムービークリップを配置しているのですが、星のレイヤーよりキャラのレイヤーを上にもってきても、星がキャラクターに被って表示されてしまいます。星の方のムービークリップに、 n=Math.round(Math.random()*1000); this.swapDepths(n); 以上の様にスクリプトで深度の設定をランダムに設定しているのですが、キャラクターの方にはどのように設定したら星が被らない様に深度の設定ができるのかわかりません。どうかよろしくお願い致します。

  • ムービークリップをボタン操作でランダムに再生

    Adobe Flash Pro CS6 でAction Script 3を使っております。 現在、異なるムービークリップを一つのボタンの操作でランダムに再生する方法を検討しております。 使用するムービークリップの数は全部で8つでございます。 これらはAfter effect で製作後adobe Media EncoderにてFLVに変換しております。 これらを同じものを連続で再生しないように、 そして一つのボタンをクリックするたびにムービークリップの再生が始まりますが、押さない限りはムービークリップの最初の画像で止まっているようにしたいのです。 例えば、ムービークリップの先頭に丸があって、それが徐々に四角になるムービーがあるとしますと、そこにあるボタンをクリックしない限りは写っているのは丸のままですが、 クリックをしたら四角に変化し、 そして次のムービークリップへ移動し、 そこでもまた最初と同じようにボタンをクリックしない限り始まらないというものにしたい次第でございます。 この場合、どういった方法を用いるのが最適でしょうか? お答え頂ければ幸いにございます。

  • ムービークリップがループしません

    レイヤー1 ○                       ○(アクション stop) レイヤー2 ●→→→→→→→→→→→→→→→→●(一度再生) レイヤー3 ●→→→→→●                (一度再生) レイヤー4 ○            ●→→→●       (MC) のような感じなのですが、一度再生が終了するとムービークリップも一緒に止まってしまいます。 ムービークリップ初挑戦なので何が間違えているのかさっぱりわかりません。この時点で何かおかしいところはありますでしょうか。 情報が少なくて、わかりづらいかと思いますが教えて頂けますか。

専門家に質問してみよう