ケータイFlashゲーム制作レクチャー

第10回カードゲームレクチャー(4) いよいよ完成!!

"神経衰弱"ついに完成!

今回はゲームの仕上げだよ!めくった2枚のカードが揃っていた時、揃っていなかった時、各場合のリアクションを作ってゲームを盛り上げるピピ!そして、もうひとつ。プログラマーズコラムもあるぞ!最後まで読むピピ~ィ!

めくった2枚のカードが同じナンバーだった時の処理

前回見ていただいたように、めくった2枚のカードが同じナンバーだった時は、phase4aに処理が移る。Phase4aでは、"GoodJob!!"のメッセージを表示し、全て揃い場にカードがなくなったか否かをチェックする。

(1)"GoodJob!!"メッセージの表示

"GoodJob!!"メッセージ自体はイメージシンボルとして作成し、それをモーション・トゥイーンで拡大する。

Fla画面1 モーション・トゥイーンによる"GoodJob!!"のアニメーション
Fla画面1 モーション・トゥイーンによる

(2)確認ボタンの押下時のアクション

"GoodJob!!"メッセージ表示後、次のフェーズに移行するために、確認ボタンを置き、オブジェクト・アクションを記述する。

Fla画面2 次のフェーズに移行するためのスクリプトの記述場所
Fla画面2 次のフェーズに移行するためのスクリプトの記述場所
List1 確認ボタン用オブジェクト・アクションとなるスクリプト
//揃った時
on (keyPress "5") {
    sameCount++;    //揃った回数を1加算・・・・・・①
    //揃ったカードを非表示・・・・・・②
    tellTarget("CardPlay/Card"add selectCard1){
        gotoAndStop( "NULL");
    }
    tellTarget("CardPlay/Card"add selectCard2){
        gotoAndStop( "NULL");
    }
    //めくったカードのインデックス初期化・・・・・・③
    selectCard1 = -1;
    selectCard2 = -1;
    if(sameCount<4){    //まだカードが残っている時・・・・・・④
       gotoAndPlay("phase3");
       //次の候補インデックスを検索
       flg=0;
       do{
           targetIndex++;
           targetIndex%=8;
           flg = Eval("CardLook" add targetIndex);
       } while(flg);
       //候補インデックスに対応するカードに候補枠を付加
       tellTarget("Target1"){
           gotoAndStop( ../:targetIndex+1);  
       }
       //2枚目の候補枠を非表示にする
       tellTarget("Target2"){
           gotoAndStop( 1);  
       }
    }
    else{      //もうカードが残っていない時・・・・・・⑤
           gotoAndPlay("phase5a")
           //候補枠を非表示にする
           tellTarget("Target1"){
               gotoAndStop("NULL");  
           }
           tellTarget("Target2"){
               gotoAndStop( 1);  
           }
    }
}

List1についてポイントとなる所に項番を付した。この順に解説していこう。

  •  2枚のカードのナンバーが揃った回数を保存するカウンター変数sameCountに1を加算する。

  •  Cardxx1とCardxx2(xx1とxx2はともにめくられたカードのインデックス)の表示ヘッドを、何もイメージのないNULLフレームに移動する。これにより、見かけ上、場よりカードが消える。

  •  めくられたカードのインデックスを保存する変数SelectCard1および2の値を-1にて初期化する。

  •  式sameCount<4の解が真であれば、場にまだカードが残っているという事である。この場合、gotoAndPlayにて、次に再生するフレームを"phase3"と登録し、次の候補インデックスを検索する。これは、前回の「選択候補枠移動の仕掛け」にて解説した同処理と同じロジックである。

  •  逆に場にもうカードが残っていない場合、再生ヘッドは"phase5a"に移す。この時、忘れずに選択枠を非表示にすること。

めくった2枚のカードが異なるナンバーだった時の処理

めくった2枚のカードが異なるナンバーだった時は、phase4bに処理が移る。Phase4bでは、"TooBad!!"のメッセージを表示後、ミスマークを付加。ミスの回数が3回を超えていないかをチェックする。

(1)"TooBad!!"メッセージの表示

"TooBad!!"メッセージも"GoodJob!!"メッセージ同様イメージシンボルとして作成し、それをモーション・トゥイーンでアニメーションする。

Fla画面3 モーション・トゥイーンによる""TooBad!!""のアニメーション
Fla画面3 モーション・トゥイーンによる

(2)確認ボタンの押下時のアクション

"TooBad!!"メッセージ表示後、次のフェーズに移行するために、確認ボタンを置き、オブジェクト・アクションを記述する。

Fla画面4 次のフェーズに移行するためのスクリプトの記述場所
Fla画面4 次のフェーズに移行するためのスクリプトの記述場所
List2 確認ボタン用オブジェクト・アクションとなるスクリプト
//揃わなかった時
on (keyPress "5") {
 missCount++;      //ミスした回数を1加算・・・・・・①
 if(missCount・・・・・・②
  //めくったカードを裏に戻す
  tellTarget("CardPlay/Card"add selectCard1){
   gotoAndStop(1);
  }
  tellTarget("CardPlay/Card"add selectCard2){
   gotoAndStop(1);
  }
  gotoAndPlay("phase3");
  //カードのロック状態解除
  set("CardLook" add selectCard1, 0);
  set("CardLook" add selectCard2, 0);
  //めくったカードのインデックス初期化
  selectCard1 = -1;
  selectCard2 = -1;
  //候補インデックスに対応するカードに候補枠を付加
  tellTarget("Target1"){
   gotoAndStop( ../:targetIndex+1);  
  }
  //2枚目の候補枠を非表示にする
  tellTarget("Target2"){
   gotoAndStop( 1);  
  }
  //ミスマーク付加・・・・・・③
  tellTarget("Miss"){
   nextFrame( );  
  }
 }
 else{        //4回ミスした時・・・・・・④
  gotoAndPlay("phase5b")
 }
}

List2についてもポイントとなる所に付した項番の順に解説していこう。

  •  ミスした回数を保存するカウンター変数missCountに1を加算する。

  •  ミスした回数が4回未満の時は、めくったカードを裏に戻し、再びカードがめくれるようにロック状態を解除。1枚目の候補枠を表示状態に戻す。

  •  ミスマークムービークリップは、1~4フレームに順に0~3個の×マークが描かれ、ロード時は1フレーム目でstopされている。したがって、ミスするごとにnextFrameを掛けていけば、ミスマークが増えていくのである。

  •  ミスが4回になってしまったら、再生ヘッドを"phase5b"に移す。

プレイ結果の表示~そして完成!!

phase5aおよびphase5bでは、プレイ結果をモーション・トゥイーンでアニメーション表示する。これでゲームは完成となる。

画面1 phase5aで表示される画面、画面2 phase5bで表示される画面

さて、今回は、皆が比較的良く知っているカードゲームということで、トランプを使った神経衰弱を取り扱ったが、いかがだったろうか?

同じトランプを扱ったゲームなら他にもポーカーやブラックジャックなんていうものもある。また、トレーディングカードや麻雀なんていうのも、公式にはカードゲームの一種だ。

いろいろあるが、取りあえずカードを扱う上でのテクニックは、皆共通している。このレクチャーを参考に、是非いろいろなカードゲームの制作に取り組んで欲しいと思う。

レクチャー補足

『Eval( ) → eval( ) 関数利用について』

今回のレクチャーで使用したサンプルゲームでは、変数の値を返す関数evalについてはEvalと表記し使用している。これは、FlashLite1.xの元となったスクリプトがFlash4仕様のものであり、Flash4のスクリプトではEvalと表記するのが普通だったので、その名残りとして使っていたのだが、今回CS3において、Eval表記を行なうと次の現象を生じることが筆者らの調べで確認された。

現象
tellTargetブロック内でEval関数を利用した際にシンタックスチェックを行なうと、Eval関数を利用した文がtellTargetブロックの外に はじき出されてしまう。

上記の現象はシンタックスチェックを行わなければ発生しないのだが、同様の現象はeval関数では起きていない。したがって、変数の値を調べるための関数は、Evalではなくevalを使用のこと、念のため記すこととした。ご注意を。

ピピ~! これで終了~!!3回の予定から4回に膨らませてレクチャーしてきました!!お役に立てたかな??さて次回からは、冒険や謎解きゲームが好きな方にオススメ、マップ冒険ゲームをFlashで作っていくよ~!!

おすすめ記事

記事・ニュース一覧