• 締切済み

FLASHで「かるた」を作りたいのですが…

あるイベントで小学生が作った「いろはかるた」を、記念にWEB上でできるゲームにしたい、FLASHで作ろうという話しが持ち上がりました。 父兄の中でたまたま私が簡単なFLASH作成の経験があったため、依頼を受けたのですが、恥ずかしながら私のFLASH知識は、動きを付けられる程度でゲーム作りの経験は全くありません。 依頼主は「記念に残すだけなので、難しいモノは必要無い」と言うのですが、それでもどうしたら良いのかわからず、そうは言っても多少はゲーム性のあるものにしたいし… と、困ってしまっております。 恐れ入りますが、参考となる作り方、あるいは「かるたゲーム作りのfla.を公開」しているサイトとか、あるいは書籍等、ご存知の方がおられましたら、教えていただけないでしょうか。 何卒、よろしくお願いいたします。

みんなの回答

  • eye-eye
  • ベストアンサー率66% (2/3)
回答No.2

>動きを付けられる程度でゲーム作りの経験は全くありません。 正直、ゲーム的カルタをつくるとなると非常に難しいと思います。 お断りするのが無難と考えます。 他の方が回答されたプログラムがご理解できるというのであれば、 問題はないと思いますが「どうにも難しい…」とお思いであるのであればなおさらです。 それでも、何とかしたい・・・とお考えでしたら、 例えば、次のようなことをしてはいかがでしょうか? ■参考サイト:マウスに追随する虫眼鏡 http://www.geocities.jp/flashiroha/script/as23.html ↑これを応用することで、子どもたちのつくったカルタを小さいスペースで表示させることが出来ます。 また、この特性をいかして、親がPCの前で読み札を読み上げ、 虫眼鏡で子どもが取り札を探すといった「遊び」もできます。 親が読み札を読み上げられるように、 読み札をPDFなど印刷できるようししてあげると親切かもしれません。 また、取り札も同様に印刷できるようにしてあげると、 PCの前だけではなく、リアルなカルタゲームが楽しめるようになるのではないでしょうか。 以上、拙い文章ですがご参考くださいませ。

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

ここではテキストと画像1つのみの回答しかできませんので苦肉の策です。 ActionScriptをコピペするだけで簡易的なカルタを作成できるものを作ってみました。 バージョンがわかりませんので, できるだけバージョンを下げて FlashMX以上で使用可能 なものにしています。 /*------------------------------------- 「フレーム1 にコピペ&パブリッシュするだけで動作するカルタ」 このままの数値である場合ステージは 330×200 前後が適当 FlashMX以上で使用可能 ActionScript1.0 要 FlashPlayer6 以上の SWF パブリッシュ -------------------------------------*/ // カルタ問題データ配列を作成 cartaArr = new Array(); // カルタ問題データを用意 (★可変) cartaArr[0] = "犬も歩けば棒にあたる"; cartaArr[1] = "論より証拠"; cartaArr[2] = "花より団子"; cartaArr[3] = "憎まれっ子世にはばかる"; cartaArr[4] = "骨折り損のくたびれ儲け"; cartaArr[5] = "屁をひって尻すぼめ"; cartaArr[6] = "年寄りの冷水"; cartaArr[7] = "塵もつもれば山となる"; cartaArr[8] = "律義者の子沢山"; cartaArr[9] = "盗人の昼寝"; cartaArr[10] = "瑠璃も玻璃も照らせば光る"; cartaArr[11] = "老いては子に従え"; // 札の横幅の設定 (★可変) cardW = 40; // 札の高さの設定 (★可変) cardH = 60; // 札の横並び個数を設定 (★可変) colNum = 6; // カルタ問題出題のスピードを設定 (★可変) speed = 10; // 札を並べる上の空白スペースを設定 (★可変) marginTop = 50; // 札を並べる左の空白スペースを設定 (★可変) marginLeft = 20; // 札の間隔のスペースを設定 (★可変) spacing = 10; // ---札のランダム配置配列作成--- // 0から昇り順の整列した一時的な配列を作成 tmpArr = new Array(); for (i=0; i<cartaArr.length; i++) { tmpArr[i] = i; } // 札のランダム配置用配列を作成 cardArr = new Array(); for (i=0; i<cartaArr.length; i++) { ranNum = Math.floor(Math.random()*tmpArr.length); cardArr[i] = Number(String(tmpArr.splice(ranNum, 1))); } // --- ランダム出題用配列を作成--- // 0から昇り順の整列した一時的な配列を再作成 tmpArr = new Array(); for (i=0; i<cartaArr.length; i++) { tmpArr[i] = i; } // ランダム出題用配列を作成 questArr = new Array(); for (i=0; i<cartaArr.length; i++) { ranNum = Math.floor(Math.random()*tmpArr.length); questArr[i] = Number(String(tmpArr.splice(ranNum, 1))); } // ---札の配置--- // 列の値の初期化 C = 0; // 行の値の初期化 R = 0; // for (i=0; i<cartaArr.length; i++) { // i が 0 ではなくて colNum で割りきれる数の時 if (i != 0 && i%(colNum) == 0) { C = 0; R++; // それ以外で i が 0 ではない時 } else if (i != 0) { C++; } // 札MCを作成 (※本当はライブラリにでも用意) _root.createEmptyMovieClip("cardMC"+i, i); // 札MCを配置 _root["cardMC"+i]._x = marginLeft+(spacing+cardW)*C; _root["cardMC"+i]._y = marginTop+(spacing+cardH)*R; // 札MCに札番号変数をセット _root["cardMC"+i].num = cardArr[i]; // 札MCにフラグの変数 flag をセット _root["cardMC"+i].flag = false; // 札MC内にテキストフィールドを作成 _root["cardMC"+i].createTextField("_txt", 0, 0, 0, cardW, cardH); _root["cardMC"+i]._txt.border = true; _root["cardMC"+i]._txt.background = true; _root["cardMC"+i]._txt.backgroundColor = 0xBBFFDD; _root["cardMC"+i]._txt.selectable = false; _root["cardMC"+i]._txt.text = cartaArr[cardArr[i]].substr(0, 1); } // 問題MCを作成 (※本当はステージ右横にでも用意) _root.createEmptyMovieClip("questMC", cartaArr.length); // 問題MC内にテキストフィールドを作成 _root.questMC.createTextField("_txt", 0, 0, 0, 0, 0); _root.questMC._txt.background = true; _root.questMC._txt.backgroundColor = 0xA0FFFF; _root.questMC._txt.autoSize = true; _root.questMC._txt.selectable = false; _root.questMC._txt.text = " =*=*=*= カルタ =*=*=*= "; // 問題MCを配置 _root.questMC._x = Stage.width/2-_root.questMC._width/2; _root.questMC._y = 10; // スタートボタンを作成(※ココではテキストフィールド入りMC) _root.createEmptyMovieClip("startMC", cartaArr.length+1); _root.startMC.createTextField("_txt", 0, 0, 0, 0, 0); _root.startMC._txt.border = true; _root.startMC._txt.background = true; _root.startMC._txt.backgroundColor = 0xFF3333; _root.startMC._txt.autoSize = true; _root.startMC._txt.text = "\n  スタート  \n "; _root.startMC._x = Stage.width/2-_root.startMC._width/2; _root.startMC._y = Stage.height/2-10; // スタートボタン(MC)ロールオーバー時の動作 _root.startMC.onRollOver = function() { _root.startMC._txt.backgroundColor = 0xFFFF33; }; // スタートボタン(MC)プレス時の動作 _root.startMC.onPress = function() { _root.startMC._txt.backgroundColor = 0x999900; }; // スタートボタン(MC)ロールアウト時&外で放した時の動作 _root.startMC.onRollOut = _root.startMC.onReleaseOutside=function () { _root.startMC._txt.backgroundColor = 0xFF3333; }; // スタートボタン(MC)クリック時の動作 _root.startMC.onRelease = function() { // カルタ問題作成ユーザ定義関数を実行 makequest(); // カルタを動かすユーザ定義関数を実行 playCarta(); // 札クリック時の動作を定義するユーザ定義関数を実行 funcCard(); // この startMC を削除 this.removeMovieClip(); }; // 問題カウント用変数の初期化 cnt = 0; // 札クリック時の動作を定義するユーザ定義関数の定義 function funcCard() { for (i=0; i<cartaArr.length; i++) { // 札クリック時の動作を定義 _root["cardMC"+i].onRelease = function() { // もしこの札の札番号変数 num が問題番号と一致していれば if (this.num == questArr[cnt]) { // この札の変数 flag の値を true にする this.flag = true; // この札のテキストフィールドの色を変える this._txt.backgroundColor = 0xFF6666; } }; } } // 問題作成ユーザ定義関数の定義 function makequest() { // 問題MCを初期座標に配置 _root.questMC._x = Stage.width+20; // 問題MCに問題番号変数をセット _root.questMC.num = questArr[cnt]; // 問題テキストに問題をセット _root.questMC._txt.text = cartaArr[questArr[cnt]]; } // カルタを動かすユーザ定義関数の定義 function playCarta() { // 1フレーム進む時間に毎回実行 _root.questMC.onEnterFrame = function() { // この questMC を speed ずつ左に移動 this._x -= speed; // もし 問題カウント用変数 cnt がカルタの枚数-1 未満で // なおかつ この questMC が左に消えれば if (cnt<cartaArr.length-1 && this._x<=-this._width) { for (i=0; i<cartaArr.length; i++) { // もし札の変数 num が 問題番号と一致していて // なおかつ 札のフラグ変数 flag が false のとき if (_root["cardMC"+i].num == questArr[cnt] && !_root["cardMC"+i].flag) { // その札を削除する _root["cardMC"+i].removeMovieClip(); break; } } // 問題カウント用変数 cnt を 1 加算 cnt++; // 問題作成ユーザ定義関数を実行 makequest(); } else if (this._x<=-this._width) { for (i=0; i<cartaArr.length; i++) { if (_root["cardMC"+i].num == questArr[cnt] && !_root["cardMC"+i].flag) { _root["cardMC"+i].removeMovieClip(); break; } } // 採点&得点表示するユーザ定義関数を実行 markCarta(); // // この _root.questMC.onEnterFrame を削除 delete _root.questMC.onEnterFrame; } }; } // 採点&得点表示するユーザ定義関数の定義 function markCarta() { // 得点の変数 point の初期化 point = 0; for (i=0; i<cartaArr.length; i++) { // もし札のフラグ変数 flag が true であれば if (_root["cardMC"+i].flag) { // ポイントを 1 加算 point++; } } // 得点の表示 _root.questMC._txt.text = "☆ "+Math.round((point/cartaArr.length)*100)+"点 ☆"; _root.questMC._x = Stage.width/2-_root.questMC._width/2; } // ------//------//------//------ // 以上をコピペです。 (★可変) マークを付けた場所以外も全て変更可能です。 スクリプト本体を触らなくてもこの部分を変えるだけで色々カスタマイズできます。 という意味の (★可変) です。  // 札MCを作成 (※本当はライブラリにでも用意) と書いていますが, 実際は絵札をちゃんと描いたりして作成する方が良いです。 ライブラリの中にムービークリップシンボルとして絵札を用意しておいて そのムービークリップシンボルの絵札を attachMovie で呼びだすとか, また, 外部にJPEGとして絵を置いておいて そのJPEGを空のムービークリップ内に loadMovie するとか, そういう方法を使う方が良いという意味です。

syousa19
質問者

お礼

丁寧なご指導、ありがとうございます!  ここまで教えていただけるとは思っていなかったので、嬉しい驚きです。 心から感謝します。 使っているのはFlashMXなので、その点はクリアでしょうか。 後は、教えていただいた内容でとにかく頑張ってやってみます。 まずは、手描きされた絵札をスキャンするところからではありますが(笑) 本当にありがとうございました。