• ベストアンサー

FlashLite1.1でのランダム表示について

携帯Flashで下記のようなゲームを作成しようと思っています。 http://teto5527.tsukaeru.jp/nouryoku/NOU010104.htm ・数字MCを配置 ・ランダムで表示 ・1種類だけ同じ数字が2つある ・正解・不正解の判定 ・次の問題へ の一連の流れをどう作っていけば良いか分からず困っています。 当方、FlashLite1.1のactionscriptは多少理解しているつもりです。 ご教授頂けると幸いです。 よろしくお願いします。

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

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

#1 です。 すみません。 見落としていたわけではないのですが, > ・数字MCを配置 と書かれていらっしゃる条件を取りまちがえていたかもしれません。 この「数字MCを配置」の意味は, ひょっとして 「画像でできた数字を表示」 という意味でしょうか? それだと MC が出てくる意味もわかります。 MCの中に画像を入れて切り替えるという意味になりますね。 また,#1 では, 1,2,3,4,5,6,7,8,9 の9個の数をランダムに入れ替えたものに 後からランダムな数を挿入するという流れのプログラムを書いています。  6,9,3,8,5,2,7,1,4     ↑     ○=ランダムな数(どこかに挿入) しかし,最初から, 1,2,3,4,5,6,7,8,9,○=ランダムな数 の10個の数を用意して,それをランダムに入れ替えた方が早かったですね...。 そこの部分の修正も加えて回答し直します。 修正すると言っても,ムービー全体の構造はそのままです。 2フレーム2レイヤーで, 1つのレイヤーにはコンテンツ 1つのレイヤーにはActionScript ActionScriptのレイヤーはフレーム1と2にキーフレームを入れておく。 ここまでは#1と変わりません。 インスタンスは変えます。 まず「disp」という変数名を付けたダイナミックテキストを削除します。 それでその代わりに, 1~9 までの数字画像を それぞれ1~9フレームに配置したムービークリップを用意します。 【下の図】↓ の上側半分。 このムービークリップのフレームを指定フレームに gotoAndStop() させれば良いわけです。 _root の編集に戻って, 上で作ったムービークリップを 元「disp」という変数名を付けたダイナミックテキストがあった部分に 10個横並びで並べます。 そして,左から順に 「dsp_mc1」,「dsp_mc2」,「dsp_mc3」,…,「dsp_mc10」 という "インスタンス名" を付けます。 【下の図】↓ の下側半分。 ここまでで構造は次のようになります。  _root(メインのタイムライン)    ├dsp_mc1(1~9の画像入りMC)    ├dsp_mc2( 〃 )    ├dsp_mc3( 〃 )    ├dsp_mc4( 〃 )    ├dsp_mc5( 〃 )    ├dsp_mc6( 〃 )    ├dsp_mc7( 〃 )    ├dsp_mc8( 〃 )    ├dsp_mc9( 〃 )    ├dsp_mc10( 〃 )    ├ダイナミックテキスト 変数名:point    └ボタン(透明にしておいても良い) あとは ActionScript用の2フレームと,ボタンにスクリプトを書いて行きます。 一応全部書きますが,変えたのは フレーム1 のスクリプトのみです。 ◎ フレーム1 のキーフレームに書くスクリプト↓(短くなった) --------------------------------------------- // 再生停止 stop(); // 変数 num1~num9 に 1~9 の数を代入 for (i=1; i<=9; i++) { eval("num" add i) = i; } // 1~9までのランダムな数を my_num に取得 my_num = random(9)+1; // 変数 num10 に my_num の値を代入 num10 = my_num; // ランダムシャッフル用ループ for (i=1; i<=10; i++) { // 1 以上 (10-i)+1未満の整数の乱数を取得 r = random(10-i)+1; // num[10+1-i] の値と num[r] の値とを入れ替える tmp = eval("num" add (10+1-i)); eval("num" add (10+1-i)) = eval("num" add r); eval("num" add r) = tmp; } // dsp_mc1~10 を フレーム num1~10 に進めて停止 for (i=1; i<=10; i++) { tellTarget ("dsp_mc" add i) { gotoAndStop(eval("/:num" add /:i)); } } // 変数 point が空白文字列であれば実行 if (point eq "") { //変数 point に 0 を代入 point = 0; } --------------------------------------------- ◎ フレーム2 のキーフレームに書くスクリプト↓(変更ナシ) --------------------------------------------- // もし my_num の値が btn_num の値と等しいとき if (my_num == btn_num) { // 変数 point の値に 5 を加算 point += 5; // my_num の値が btn_num と等しくなければ } else { // 変数 point の値から 5 を減算 point -= 5; } // フレーム1 に書いたスクリプトを実行 call(1); --------------------------------------------- ◎ ボタン に書くスクリプト↓(変更ナシ) --------------------------------------- on (keyPress "1") { // 変数 btn_num に 1 を代入 btn_num = 1; // フレーム2 に書いたスクリプトを実行 call(2); } on (keyPress "2") { btn_num = 2; call(2); } on (keyPress "3") { btn_num = 3; call(2); } on (keyPress "4") { btn_num = 4; call(2); } on (keyPress "5") { btn_num = 5; call(2); } on (keyPress "6") { btn_num = 6; call(2); } on (keyPress "7") { btn_num = 7; call(2); } on (keyPress "8") { btn_num = 8; call(2); } on (keyPress "9") { btn_num = 9; call(2); } ------------------------------------- 作成は以上です。 上で, > そして,左から順に > 「dsp_mc1」,「dsp_mc2」,「dsp_mc3」,…,「dsp_mc10」 > という "インスタンス名" を付けます。 ということを書きましたが, これは説明の都合上そうするだけで, インスタンス名の付け忘れや重複がなければ,どこにMCを配置しても良いわけですから, #1の方法より,この方法の方が面白いレイアウトなどできて良いような気がします。 例えば輪に並べるとか,場合によっては例えば波のように動かすとか。 その他の補足説明は,すみませんが #1 の補足を見てください。 同じです。

ihsotufeba
質問者

お礼

できました。 scriptや参考画像など、ご丁寧な回答どうもありがとうございました。 非常に参考になりました。

その他の回答 (1)

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

===○作成前のメモ======================== ・1~9で重複のないランダムな9桁の文字列を作成 ・ランダムな位置にランダムな1~9の数(文字)を挿入 ・キーを押す→正解で得点 +5 不正解で得点 -5        →同時に次の問題を出題 ======================================= だいたい上のメモの内容のようなものを作成することにします。 【下の図】↓ のように, ステージ上に , 「disp」 という "変数名" を付けたダイナミックテキスト と 「point」 という "変数名" を付けたダイナミックテキスト と ボタン (透明にしておいても良い)を用意し, ムービーのフレームを 2フレーム にします。 そして, ActionScript用にするレイヤーを追加し, ActionScript用にするレイヤーの フレーム2 を空白キーフレームにします。 ◎ フレーム1 のキーフレームに書くスクリプト↓ --------------------------------------------- // 再生停止 stop(); // 変数 num1~num9 に 1~9 の数を代入 for (i=1; i<=9; i++) { eval("num" add i) = i; } // ランダムシャッフル用ループ for (i=1; i<=9; i++) { // 1 以上 (9-i)+1未満の整数の乱数を取得 r = random(9-i)+1; // num[9+1-i] の値と num[r] の値とを入れ替える tmp = eval("num" add (9+1-i)); eval("num" add (9+1-i)) = eval("num" add r); eval("num" add r) = tmp; } // 表示用変数 disp の初期化 disp = ""; // disp に9個の数を連結 for (i=1; i<=9; i++) { disp = disp add eval("num" add i); } // 1~9までのランダムな数を my_num に取得 my_num = random(9)+1; // 0~9までのランダムな数を pos に取得 pos = random(9+1); //disp の pos の位置に my_num を挿入(※↓改行ナシの1行) disp = substring(disp, 0, pos) add my_num add substring(disp, pos+1, 9-pos); // 変数 point が空白文字列であれば実行 if (point eq "") { //変数 point に 0 を代入 point = 0; } --------------------------------------------- ◎ フレーム2 のキーフレームに書くスクリプト↓ --------------------------------------------- // もし my_num の値が btn_num の値と等しいとき if (my_num == btn_num) { // 変数 point の値に 5 を加算 point += 5; // my_num の値が btn_num と等しくなければ } else { // 変数 point の値から 5 を減算 point -= 5; } // フレーム1 に書いたスクリプトを実行 call(1); --------------------------------------------- ◎ ボタン に書くスクリプト↓ --------------------------------------- on (keyPress "1") { // 変数 btn_num に 1 を代入 btn_num = 1; // フレーム2 に書いたスクリプトを実行 call(2); } on (keyPress "2") { btn_num = 2; call(2); } on (keyPress "3") { btn_num = 3; call(2); } on (keyPress "4") { btn_num = 4; call(2); } on (keyPress "5") { btn_num = 5; call(2); } on (keyPress "6") { btn_num = 6; call(2); } on (keyPress "7") { btn_num = 7; call(2); } on (keyPress "8") { btn_num = 8; call(2); } on (keyPress "9") { btn_num = 9; call(2); } ------------------------------------- 作成は以上です。 以下は補足です。 上のものだと,ゲームの開始は自動開始です。 作りたいものに応じて考えてみてください。 例えば フレーム1 にルール説明などを置いておいて, 上の フレーム1 と フレーム2 に用意した全てを フレーム2 と フレーム3 にズラして用意するとかです。 ※ちなみに書かれていらっしゃるページ↓で,  http://teto5527.tsukaeru.jp/nouryoku/NOU010104.htm  最初に スタートボタン を用意してある理由は  おそらくFlash にフォーカスを与えるためです。  PCのブラウザ でページを見た場合,  Flash にフォーカスなど当たっていませんから,  1~9 のキーを押される前に  Flash にフォーカスを与える必要があります。  そのためにあるもので  ゲーム上,本来は必要ないはずのボタンです。 また上のものだと, いつまで経ってもゲームは終了しません。 この辺も作りたいものに応じて考えてみてください。 一応,ゲーム終了のために フレーム1 と フレーム2 にスクリプトを分けて書いています。 フレーム2 のスクリプトで得点(point)を計算した後, 普通は次の問題を出題するので最終行で  // フレーム1 に書いたスクリプトを実行  call(1); をしています。 しかし例えば得点(point)が 100 になったら call(1); をするのではなくて gotoAndStop(3); などをして,「おめでとう」フレームに進めることもできますよね。 そういうことをするためにスクリプトを フレーム1 と 2 とに分けています。 ランダムシャッフルで 私が 参考にしたページ↓ 「FN0212003 - 配列を偏りなくランダムに並替える」 http://fumiononaka.com/TechNotes/Flash/FN0212003.html

関連するQ&A

専門家に質問してみよう