• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:flashランダム処理 5秒ごとにどれかを表示する)

Flashランダム処理で非表示のシンボルを表示する方法

このQ&Aのポイント
  • Flashを使用して、5秒ごとに非表示のシンボルの中からランダムに1つ表示する方法について教えてください。
  • シンボルの初期状態はすべて非表示に設定されていますが、5秒ごとにランダムに1つを表示させたいです。
  • タイムラインを使用せずにこの処理を行う方法があれば教えてください。もしくは、他の処理でタイムラインを使用しつつ、問題を解決する方法があればお教えください。

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

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

5秒ごとに、今表示しているムービークリップを非表示にして、次に表示するものを選んで表示する・・・という処理を専門に行うムービークリップを1つ作っておくのはいかがでしょう。 タイマーの処理は、onClipEvent( enterFrame ) を利用して作ります。インスタンスにアクションを設定しますから、このインスタンスをステージに置いておくだけで、メインのタイムラインとは関係なくタイマーの処理が行われます。 例えば、タイマー処理を行う timer というムービークリップと、表示するムービークリップ clip1 ~ clip7 があるとします。 clip1 ~ clip7 は、_alpha を0にするか、もしくは _visible を false にして、非表示にしておきます。 最初の1回だけは、メインのタイムラインにフレームアクションを設定するか、ムービークリップ timer の onClipEvent( load ) イベントを利用して、clip1 ~ clip7 の中から、表示するムービークリップをランダムに選びます。そして変数を1つ用意し、選んだムービークリップの名前を保存しておきます。これは、5秒後に違うムービークリップを表示する時に、現在表示中のムービークリップを非表示にする処理で必要になります。 timer のムービークリップは、絵は適当に描くか、または全くなくても構いません。絵があった方が作る時には分かりやすいですが、本番ではこれも非表示にします。 5秒のインターバルタイマーの作り方は、あまりスマートな方法が思いつかず、いささか鈍くさい方法で申し訳ないのですが... ムービーが再生されてからの経過時間を返す、getTimer という関数があります。単位はミリ秒なので、1000 で割ることで秒に直すことができます。5秒=5000ミリ秒ですから、これを利用して5秒間を計ることにします。 ロードにかかった時間など、カウントされてはいけない時間はとりあえず考慮しないことにすると、理論的には、getTimer で取得した時間を 5000 で割った余りが0になる時が、5秒ごとの間隔となります。つまり、5秒のインターバルタイマーとは、  if ( (getTimer() % 5000) == 0 )  {   ・・・  } になるような気がします。 しかし実際は、フレームレート等の関係で、getTimer で、経過時間が 5000 の倍数になる瞬間を逃さず捉えられるという保証はありません。ですから、剰余がきっちり0になった時にだけ何かをするというのは、まずアテにできないと考えた方が良さそうです。 そこで、常に1フレーム前での経過時間と現時点での経過時間の差をとって別の変数に加算していく、という方法を考えてみました。(この辺りが、ちょっとヘッポコ ^^;) まず、変数を2つ用意して、1つの変数には1フレーム前での経過時間を保存しておきます。すると、現在の経過時間と1フレーム前の経過時間の差で、どのくらいの時間が経過したかが分かります。この差を、もう1つの変数に蓄積していきます。この、蓄積された差が 5000 以上であれば、5秒経ったと見なすことができます。数ミリ秒の誤差が生じますが、そこはご勘弁を。 この方法で組むなら、ムービークリップ timer に設定するスクリプトは、こんな感じでしょうか。  onClipEvent(enterFrame)  {   var clip_no , clip_name , timer;   //前のフレームでの経過時間との差をとり、   //累積の差を記憶しておく   timer = getTimer();   _root.def_time += timer - _root.before_time;   //現在の経過時間を保存   _root.before_time = timer;   //累積の差が5000以上になったら5秒経過したと見なし、   //表示するムービークリップを選ぶ   if(_root.def_time >= 5000)   {    clip_no = Math.floor((Math.random()*7)+1);    clip_name = "_root.clip"+clip_no;    //今表示しているムービークリップを非表示にする    eval(_root.disp_clip)._visible = false;    //選択したムービークリップを可視にし、    //表示中のムービークリップ名を更新する    eval(clip_name)._visible = true;    _root.disp_clip = clip_name;    //タイマーの時間差をリセット    _root.def_time = 0;   }  } (↑このスクリプトをコピーして使う場合は、各行の行頭に入っている全角のスペースを、半角のスペースかタブに置き換えて下さい。このまま使うとシンタックスエラーになります) 初期設定はメインのタイムラインの1フレーム目で行っているのですが、スペースの都合上、こちらは割愛させていただきました。上記のスクリプトで、_rootで始まる変数は、メインのタイムラインの1フレーム目で初期化しているものです。各変数の内容は、 ・before_time 1フレーム前での経過時間。初期値は、メインのタイムラインの1フレームが再生された時点での、getTimer()で取得した経過時間です。 ・def_time 毎フレームごとに発生する、現在と1フレーム前の時点での経過時間の差を管理します。初期値は0です。 ・disp_clip 現在、表示しているムービークリップの名前を記憶する変数です。初期値は、最初に選んだムービークリップの名前(_root.clip1~_root.clip7のいずれか)です。 なお、1~7の範囲で乱数を作る方法は、Flash のテクニカルノートで紹介されている式を使わせていただきました。 あまりスマートではない上に、文章だけでは分かりにくくて恐縮ですが、何かのお役に立てれば幸いです。

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

お礼

ありがとうございます。恐縮です。 大変わかりやすかったです。 getTimerがあったなんて… どうもどの関数を使うのかって F1でヘルプみても見逃してしまうんですよね(^^; DPEさんはどのように辞書から、 さがしているんでしょうか? 慣れですかね(^^;

その他の回答 (1)

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

再び、DPEです。 #1の件は、問題・不明な点など、ありませんでしたでしょうか? 関数の探し方ですか?うーん... はっきり言ってテキトーです、テキトー *^へ^*; 作りたいものに近いサンプル、似たような構想の作品を眺めていると、大抵、「これなんか使えそう」と思う関数や考え方が見つかります。 Flash のヘルプも、何かないかな~、と思って見ていると、使えそうなものが見つかる場合も、たまにはあるのですが、ヘルプは機能の簡単な説明と単純なサンプルしか載っていないので、よく分からないです。 市販の書籍のサンプルのように1つの作品になっているものは、「この関数をこう利用すると、こんな処理になる」というのが具体的に分かり、しかも詳しい解説も付いているので、とても参考になります。 今回の getTimer は、「GO!GO!FLASH5[ゲームを作ろう編]」(エーアイ出版)に載っている、ストップウォッチのサンプルで使われているのを見て知りました。また、getTimer の戻り値を算術的に加工して時間を制御する処理は、Flash MX に付属のタイマーのサンプル( Flash をインストールしたフォルダの、「 Samples 」の中にあります)のスクリプトからヒントを得たものです。 この2つの作品がなかったら、Date オブジェクトの何かを使ってできるのでは・・・と考えていたかも知れませんね。 Flash の Date オブジェクトは、FlashPlayer のバージョンによっては不具合があったり、Windows と Macintosh とでは動作が違っていたりと、ひとクセある仕様になっている(今は大分改善されたようですが)ので、タイマーを作るにはちょっと向かないオブジェクトかと。 使えそうな関数を見つけてきても、それをどう使うかは工夫と試行錯誤。失敗もいろいろあります。白状しますと、#1で書いた  if ( (getTimer() % 5000) == 0 )  {   ・・・  } は、実際にやってしまった失敗だったりします ^^; スクリプトの組み方・考え方、スクリプトの記述のスタイルは、人によって傾向も違うし、好みもあります。書籍やネットで公開されているものは、ほんの一例に過ぎないです。 mamelightさんも、いろいろ試して、自分なりのスタイルで楽しい作品を作って下さいね。 質問の本題から外れてしまいましたが、#1の補足も兼ねて、ご参考までに。

mamelight
質問者

お礼

再びありがとうございました。 おかげさまで問題はありません。 やっぱりサンプルですかー。 サンプルはいくつか集めているんですが、 …こりゃ知り合いに 貸してしまった本を返してもらった方がいいですね(^^; 思い通りにつくれるようになりたいですね。

関連するQ&A