Flash重複しないムービー再生とその後の処理について

このQ&Aのポイント
  • Flash MX 2004で重複しないようにランダムにムービーを再生し、その後の処理について相談です。
  • 現在の実装ではランダムな数を取得して各フレームに配置し、再生しますが、重複してしまう問題やループする問題があります。
  • 重複しないように全ムービーを再生後、次のフレームに進む処理の実装方法について教えてください。
回答を見る
  • ベストアンサー

Flash 重複しないムービー再生とその後の処理について

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

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

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

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

現状を活かすのでしたら、次のように考えてはいかがでしょう。 重複しないランダムな並びを得るには、配列変数を使うと簡単です。 配列変数に目的の数値や何かの値を入れてシャッフルすれば、重複のないランダムな並びになります。 今回の件で言いますと、配列変数にフレームの番号( 2 ~ 10 )かムービークリップの番号( 1 ~ 9 )を入れてランダムに並べ替えると、重複することなくランダムに再生できる順序が決まります。 あとは、この順序に従ってフレームを再生していきます。 配列変数に書かれている通りに再生するには、配列変数の位置(インデックス)を管理する変数を1つ作り、ムービークリップの再生が終了するたびにこの変数の値を + 1 しながら配列変数から値を取得して、gotoAndStop でフレームを移動します。 この変数の値が配列変数の要素数の最後に達したら、ランダム再生の終了、と判断することができます。 配列変数でランダムな並びを作成する処理(フレームの再生順番を決める処理)は最初の1度だけでいいのですが、次に再生するフレームに移動したり、ランダム再生が全て終了したかどうかの判定などはムービークリップの再生が終了するたびに行わなければなりません。 メインのタイムラインのフレーム1でこれらの処理を全て済ませる場合は、変数が未定義だった時に返ってくる” undefined ”という値を利用して、最初の1度だけ行う処理と繰り返し行う処理に分けることができます。 もっとも、スクリプトを2フレームに分け、フレーム1に最初の1度だけ実行したいスクリプト、フレーム2にランダム再生が終了するまで繰り返すスクリプトを記述し、ムービークリップからはフレーム2に戻るようにする方法もあります。 今回はとりあえず、これまでにできあがっている部分を活かすということで、フレーム1で全てを済ませる作例をご紹介します。 ---------------------------------------------------------- スクリプトの一例です。 メインのタイムラインのフレーム 2 ~ 10 にムービークリップがあり、これらのムービークリップの最後のフレームに _root.gotoAndStop( 1 ); が書かれているとします。 フレーム 2 ~ 10 を重複なくランダムに再生し、最後にフレーム 11 に移動するスクリプトは、大体、次のようになります。 このスクリプトは、メインのタイムラインのフレーム 1 に設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります) /********************************************************/  /************** ランダム再生の最初に1度だけ行う処理 **************/  if( tbl_ref == undefined )  {   //フレーム番号のテーブル   frame_tbl = new Array();   //テーブルの参照位置を保持   tbl_ref = 0;   //ランダム再生するフレームの総数とシャッフルの回数   frames = 9;   shuffle = 30;   //テーブルにフレームの番号を格納   //スクリプトのフレーム(=このフレーム)の分だけずらして格納しておく   for( i = 1 ; i <= frames ; i++ )   {    frame_tbl[ i - 1 ] = i + 1;   }   //テーブル内の値を指定の回数だけシャッフル   for( i = 0 ; i < shuffle ; i++ )   {    //要素を2つ、ランダムに選ぶ    index1 = Math.floor( Math.random() * frame_tbl.length );    index2 = Math.floor( Math.random() * frame_tbl.length );    //2つの値を入れ替える    temp = frame_tbl[ index1 ];    frame_tbl[ index1 ] = frame_tbl[ index2 ];    frame_tbl[ index2 ] = temp;   }   //最初のムービークリップがあるフレームを再生   gotoAndStop( frame_tbl[ 0 ] );  }  /************** 2回目以降の処理 **************/  else  {   //テーブルの参照位置を更新   tbl_ref++;   //終了判定:次に再生するムービークリップはあるか?   //ある場合はそのフレームに移動   if( tbl_ref < frame_tbl.length )   {    gotoAndStop( frame_tbl[ tbl_ref ] );   }   //ない場合は先のアニメに進んで終了   else   {    delete tbl_ref;    gotoAndPlay( 11 );   }  } /********************************************************/ 再生順番を決める処理や配列変数のインデックス番号を管理する変数の初期化などは、undefined を利用して、ランダム再生の前に1度だけ行います。 どの変数を判断に使ってもいいのですが、上記のスクリプトではとりあえず、配列変数のインデックス番号を管理する変数” tbl_ref ”が未定義だった場合にこれらの初期化を行っています。 1件のムービークリップの再生が終了してフレーム 1 に戻ってきた場合は、変数 tbl_ref が既に定義されているため if 文の条件は不成立で、else 以下の処理(次のフレームの再生と終了判定)が行われるようになります。 なお、全てのムービークリップの再生が終了した時には、delete アクションで変数 tbl_ref を削除しています。 これにより、例えばフレーム 11 から続くアニメの最後からリプレイボタンなどで最初に戻れるような作品でも、変数 tbl_ref が undefined になるので、再度ランダムな再生順序を作成するなどの初期化処理が実行されます。 ある決まった順序や法則をもとにデータを並べて表を見るように使うデータ構造を、”テーブル”といいます。 今回はフレームの番号( 2 ~ 10 )をテーブルにし、予めランダムな順序に並べ替えたものを見ながら順番に再生していくことで、フレーム 2 ~ 10 までを重複することなくランダムに再生します。 配列変数内の値をランダムに並べ替えるにはいろいろな方法がありますが、上記のスクリプトでは簡単なところで、配列変数の要素をランダムに2つ選び出して入れ替える、という処理を数回繰り返す方法を使っています。 入れ替える回数は、変数” shuffle ”の値を書き換えていただくと変更できます。 回数を多くするほどいいというわけでもありませんが、過不足があるようでしたら適宜変更してください。 ---------------------------------------------------------- ちなみに、いくつかのムービークリップをランダムに再生した後で先に進むには、1つのフレームにムービークリップを全て配置しておく方法もあります。 基本的には、今再生するものだけを表示して残りは非表示にし、再生が終了するたびに表示するものを取り換えていきます。 1つのムービークリップの再生が終了したかどうかは、再生されているフレームを管理している _currentframe プロパティと、ムービークリップの総フレーム数を保持する _totalframes プロパティを比較することで検出できます。 配列変数を使ってランダムに再生する順序を作成する点は同じですが、この方法の場合は、テーブルにムービークリップの参照を入れておくと便利です。 機会がありましたら、こちらの作例も研究してみてください。

washo-hk
質問者

お礼

ご回答いただき、本当にありがとうございました。 質問には1フレーム目からとさせていただきましたが、実際にはその前にもフレームが存在していましたので、ご回答のScriptを当てはめて“shuffle”や、ここぞと思える箇所の値を調整しながら何度かトライしていました。しかし再生が4つで止まったり8つで止まったり(おしい!)などして、なかなかパーフェクトが出ません。 苦肉の策でランダム再生より前のムービーと今回のランダム再生部分をシーン分けして、“シーン2”のみで1フレーム目から作成してみました。(まるごとコピーさせていただきました。。。) すると、すんなりパーフェクト再生です。次のフレームまでばっちりでした。 おかげさまで、今回はここから先へすすむ事ができます。しかしちょっと悔しいので(笑)落ち着いたらテーブルの概念もふまえてもう一度取り組んでみます。 ありがとうございました。助かりました。

関連するQ&A

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

    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
  • flash の ムービークリップの制御

     フレーム1にムービークリップmovieAがフレーム2にmovieBがあります。それぞれのムービーには連続して再生されないように、フレームの最後にstopを設定してあります。  フレーム1のムービーを再生した後に、ボタンなどを使わずに自動的にフレーム2のムービーを再生させたいのですが、一体どうすればよろしいのでしょうか?GotoAndPlayを1フレーム目に設定すると、movieAを再生せずに2フレーム目に行ってしまいます。それぞのムービークリップに設定しているstopがいけないのでしょうか?何かいい解決策はありますか?フラッシュ用の掲示板でお答えいただいたのですが、それでは解決せずこちらでお伺いすることに致しました・・・。(初歩的すぎてこれ以上聞きにくいし・・・泣)よろしくお願い致します。

  • Flash cs4 ランダム再生

    Flash初心者です。 やりたいことはホームページ上でアニメーションを再生させる際に、複数パターンのアニメーションをページをリロードするたびにランダムに切り替えるということです。 Flashにてアニメーションのタイムラインを複数パターンつくり、ランダム再生をActionScriptで制御するものを作成したいと思います。 アニメーションのタイムラインを作成しムービーシンボルとしたものを複数作成し、それをシーン1のタイムラインにて各フレームに配置して、1フレーム目にActionScriptにてgotoAndStop(ランダムフレームの記述?);とすればいいのかなと思っているのですが、正しいでしょうか? 現状ではアニメーションのムービーシンボルは必要なパターンだけ作成しました。 シーン1のタイムラインに配置まではしたのですが、ActionScriptの記述が素人なものでさっぱりわかりません。 どなたか教えていただけませんか? 自分なりにやってみたのですが、ランダム関数(?)以前にgotoAndStop()すら思うようにいきませんでした。 Flashはcs4を使用しております。ActionScript3.0のプロジェクトにして添付画像のように1フレーム目に gotoAndStop(10); としてみたのですが、パブリッシュしたswf ファイルは真っ白のまま何も動いてくれません。 gotoAndstop(10); としてみたらstopせずにタイムラインを再生しているようで、各アニメーションの最初のフレームだけが切り替わるものになってしまいました。 ともにコンパイルエラー 1180:未定義である可能性が高いメソッドgotoAndstopの呼び出しです といわれます。 ActionScriptが2.0と3.0とどちらがいいのかもわかってない状態ですが、ご教授願います。

    • ベストアンサー
    • Flash
  • Flash MX フレーム ランダムに取得する

    現在、あるコンテンツ製作していて、 画面上に5個画像(ムービークリップ)を表示しています。 そのムービークリップのなかには、グラフィックが10個入っていて、 targetFrame = Math.ceil(Math.random()*10); this.gotoAndPlay(targetFrame); というスクリプトで10個のフレーム中からランダムに表示させています。 (画面上の5個の画像は、その1個ずつが10個(フレーム)の中からランダムに選ばれるので、 5個の中には、同じ画像(同じフレーム)が含まれる場合があります。) 画面上に、あと2個画像(ムービークリップ)を追加し、その2個も、 10個のグラフィック(フレーム)中からランダムに表示させたいのですが、 かならず2個とも同じグラフィック(同じフレーム)を選ばせるにはどうすればよいでしょうか? Flash歴は長いのですが、知識はあまりない馬鹿な私に教えてやってください。

    • ベストアンサー
    • Flash
  • flashでムービークリップ後のフレーム移動

    FLASH初心者です。 ムービークリップでムービーを作ったのですが、シーン1に配置するとなぜかうまく動いてくれません。 何が悪いのか検討がつかない。 1フレームに入れたのですが、ちゃんとアクションで stop入れているし・・・。 2フレーム以降、色々ムービーを作っています。 新規作成で新しいflashにそのムービークリップを配置したらなぜかちゃんと再生してくれるのです。 原因が全く分からなくて困っています。 あと、そのムービークリックが一度終了した次点自動的に次のフレーム(2)へ移動してムービーを再生して欲しいのですが、どうすればいいのでしょうか? よろしくお願いします。

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

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

    • ベストアンサー
    • Flash
  • 指定時間にムービークリップを再生した後戻れない他

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 各種バージョンの説明 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ FLASHのバージョン:CS3 Action Scriptのバージョン:2.0 質問者のバージョン:AS初心者 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 作りたいものの説明 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 毎時、0分0秒と、30分0秒に、 指定のムービークリップを数秒間再生して、 元の時計に戻る。といった、 鳩時計のようなものが作りたいです。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ できたっぽいこと ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ○アナログ時計は正常にできたようです。 ○指定の時間に、指定のムービークリップを再生することは  できたようです。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ できてないこと ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ○指定の時間に、指定のムービークリップを再生した後、  元のアナログ時計に戻れない。 ※パソコンの時間を変更して確認していますが、  一度変更した後、ブラウザを更新しないと  元のアナログ時計に戻ってくれない。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 現在のスクリプト構成 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 【アナログ時計部分】 レイヤー1|○| | レイヤー2|●|●| レイヤー2の1フレーム目には、 ふつうのアナログ時計のムービークリップが入っています。 そのふつうの時計のムービークリップの中の1フレーム目には、 以下のスクリプトを書きました。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ this.onEnterFrame = function() { now_date = new Date(); h = now_date.getHours(); m = now_date.getMinutes(); s = now_date.getSeconds(); this.h_mc._rotation=h*30+m*0.5; this.m_mc._rotation=m*6+s*0.1; this.s_mc._rotation=s*6; }; ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 【指定時間に指定MCを再生部分】 レイヤー1|○| | レイヤー2|●|●| レイヤー1の1フレーム目には、 以下のスクリプトを書きました。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ this.onEnterFrame = function(){ myDate = new Date(); myHour = myDate.getHours(); if (myHour>=6 && myHour<14) { this.gotoAndStop(2); } else if (myHour>=14 && myHour<21) { this.gotoAndStop(2); } else { this.gotoAndStop(1); } }; stop(); ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ レイヤー2の2フレーム目には、 指定時間(上記のスクリプトで示すと、6時~21時以外)に 再生したい、ムービークリップを配置しています。 ※現在は、テストなので時間は適当ですが、最終的には、  12時ちょうど、12時30分、1時ちょうど、1時30分・・・  などと、30分おきに指定のムービーを再生したいです。 ※また、現在はテストなので、指定の時間に再生したい  ムービークリップは1種類しかないのですが、  最終的には数種類に増やしたいです。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ききたいこと ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ○指定の時間に、指定のムービークリップを再生した後、  ブラウザの更新ボタンを押さなくても、  元のアナログ時計に戻すにはどうしたらよいでしょうか? ○指定のムービークリップは、ループしているムービーなのですが、  数秒間再生したら、元のアナログ時計に戻したいのですが、  現在、私の知っているスクリプトの記述方法だと、 if (myHour>=6 && myHour<14) { this.gotoAndStop(2); のように、時間しか指定できないので、 数秒間後に元のアナログ時計に戻すことができません。 (1時間後には戻すことはできます) 秒の指定の仕方を教えてください。 長くなってしまいましたが、どなたか教えていただけると幸いです。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • flash:ムービークリップの制御

    誠に不勉強の段お許しください。 Flashで知人のサイトを製作しているのですが、どうしてもうまくいかず投稿させて頂きました。使用してる環境;ソフトはMacOS10.4.11:Flash8.0です。 (1)動かしたい内容は、-rootにムービークリップのスプレー缶があって、それにロールオーバーすると少し上がり指が現れ、そこで止まる。(ムービークリップ10フレーム目で停止) (2)ロールアウトすると逆戻りで元の位置に戻る。 (3)(1)の止まった状態でプレスすると10フレーム目から進み(スプレーされるアクションが入り)指定アドレスに飛ぶ。(ムービークリップ15フレーム目でgetURL) この様な、動きをさせたいのですが 様々解らないなりに調べて、何とか15フレーム目までいって止まり、その逆戻りまでは出来たんですが、10フレーム目で一旦止める事が出来ません...。 onClipEvent (load) { nMove = 0; } onClipEvent (enterFrame) { if (nMove != 0) { nNextFrame = this._currentframe+nMove; if (1<=nNextFrame && nNextFrame<=this._totalframes) { this.gotoAndStop(nNextFrame); } else { nMove = 0; } } } on (rollOver) { nMove = 1;} on (rollOut) { nMove = -1; } 大変恐縮ですが、 なにとぞご教授いただけましたら幸に存じます。

    • ベストアンサー
    • Flash
  • ムービークリップの制御

    ムービークリップの制御に関してですが・・ 組み込んだムービークリップを、メインフレームから制御したいと思っています。 任意の位置で停止させたいのですが、gotoandstopでは、そのフレームまでジャンプしてしまいます。 「任意のフレームまで再生する」、といった制御はできないでしょうか? mc内に、if文にてstopを組み込む方法では、一回目の再生で停止せず、二回目の再生で止まる・・といった現象に悩んでいる為、メインフレームから停止フレームが指定できるような制御があればいいのですが・・ お手数ですが、良い方法をご存知の方がおられましたらお願いいたします。

  • 【FLASH】ムービークリップの色変え

    こんにちは。 携帯向けのFLASH待ちうけを作成しているのですが 9種類のキャラクターがランダムで登場する設定になっています。 種類が多いのでどうしても容量が大きくなってしまいます。 大元のムービークリップを色を変えて使いまわしたいのですがうまくいきません。 どなたかご教授いただけないでしょうか? 説明用の画像を作成したのですが貼り付けると自動調整されてしまい 文字が非常に読みづらくなってしまいました。 yahooフォトに画像掲載したのでお手数ですがこちらを参照していただきたいです。 http://photos.yahoo.co.jp/kaerunokimutidon ※シンボルの色変えはネットを検索していて見つかったのですが ムービークリップについては触れていなかったので、もしかして ムービークリップではできないのでしょうか。。。?

専門家に質問してみよう