ケータイFlashゲーム制作レクチャー
第8回 カードゲームレクチャー(2) スクリプトを仕込む!!
魔法の呪文!? FlashLite1.xのActionScriptの底力を知ろう!

擬似配列を使ったデータ上のシャッフル
複数のオブジェクトやデータを一様に扱いたい場合,たいていのプログラム言語では,配列というデータ構造を利用する。Flashでもバージョン5のActionScriptからこの"配列"が使えるようになった。しかし,Flash4のスクリプト仕様を踏襲するFlashLite1.xのスクリプトには,この配列がない。その代わりとして用いられている方法が,擬似配列である。
今回作成する"神経衰弱ゲーム"の場合,場に並ぶ8枚のカード(とそのパラメタを管理するための変数)を,この擬似配列で作成する。
(1)擬似配列の作り方
いきなり”擬似配列”などと仰々しい名前を出して脅かしてしまったかも知れないが,実の所は普通のオブジェクトであり,普通の変数だ。ただ,そのインスタンス名(もしくは変数名)を末尾のみ連番とした統一の名前で命名すれば良いのだ。
例えば,phase3の「カードを選ぶ,めくる(プレイ部分)」においては,"場"に8枚分のカードクリップのインスタンスが並ぶことになるが,これらのインスタンス名をCard0~Card7とするだけで,擬似配列は利用可能なのだ。
- 実際のflaファイルGameCard.fla(Flash CS3用のもの,Flash 8用のもの)
ご覧いただけば分かるように各カードクリップは,ゲームクリップ上に直接配置しているわけではなく,プレイクリップを介している。プレイクリップのインスタンス名は,"CardPlay"である。
(2)各カードのマークやナンバーを保持する変数
前回の復習になるがカードクリップは,1フレーム目に裏模様のイメージを,2フレーム目以降に52枚分のカードパターンを,すべて持っている。フレームアクションとして,1フレーム目にstopが記述されているため,初期状態では裏向きのまま停止しているのだ。したがってカードがめくられた場合には,2フレーム目以降のどこかのフレームにgotoAndStopでジャンプすれば,そのフレームに設定したマークやナンバーを表示することができる。ここでカードは,何度もめくられたり戻されたりする点に注意が必要である。めくられる度にカードのマークやナンバーが変わってしまったのでは,ゲームにならない。そこでカードごとに,ジャンプすべきフレーム番号を保持する変数が必要になる。この変数は8枚のカードそれぞれに対応しているため,カードのインスタンス名と同様に擬似配列とした方が扱いやすい。そこで,各カードのマークやナンバーを保持する変数として,CardVal0~CardVal7を設定することにする。
(3)シャッフルさせるスクリプト
ゲームクリップの1フレーム目にカードをシャッフルさせるスクリプトを記述する。もっともカードそのものをシャッフルさせる必要はない。CardVal0~CardVal7に設定するフレーム番号をシャッフルさせるだけで良いのだ。
ここに記述するスクリプトは次のようなものだ。
List1 カードをシャッフルさせるスクリプト
//0~12の数列を作る・・・・・・①
for(i=0;i<13;i++){
set("Number" add i, i);
}
//適当に交換して,乱数列を作る(頭4つを利用)・・・・・・②
for(i=0;i<13;i++){
idx1 = Random( 13);
idx2 = Random( 13);
temp = Eval("Number" add idx1);
set("Number" add idx1,Eval("Number" add idx2));
set("Number" add idx2,temp);
}
//場に並ぶカードの決定・・・・・・③
for(i=0;i<4;i++){
j=i+4;
switch(Random( 6)){
case 0: //スーツ(ダイヤ×クローバ)
set("CardVal" add i,Eval("Number" add i)+2);
set("CardVal" add j,Eval("Number" add i)+15);
break;
case 1: //スーツ(ダイヤ×ハート)
set("CardVal" add i,Eval("Number" add i)+2);
set("CardVal" add j,Eval("Number" add i)+28);
break;
case 2: //スーツ(ダイヤ×スペード)
set("CardVal" add i,Eval("Number" add i)+2);
set("CardVal" add j,Eval("Number" add i)+41);
break;
case 3: //スーツ(クローバ×ハート)
set("CardVal" add i,Eval("Number" add i)+15);
set("CardVal" add j,Eval("Number" add i)+28);
break;
case 4: //スーツ(クローバ×スペード)
set("CardVal" add i,Eval("Number" add i)+15);
set("CardVal" add j,Eval("Number" add i)+41);
break;
case 5: //スーツ(ハート×スペード)
set("CardVal" add i,Eval("Number" add i)+28);
set("CardVal" add j,Eval("Number" add i)+41);
break;
}
//カードロック状態を未ロックにする・・・・・・④
set("CardLook" add i, 0);
set("CardLook" add j, 0);
}
//場に並ぶカードを切る・・・・・・⑤
for(i=0;i<20;i++){
idx1 = Random( 8);
idx2 = Random( 8);
temp = Eval("CardVal" add idx1);
set("CardVal" add idx1,Eval("CardVal" add idx2));
set("CardVal" add idx2,temp);
}
//各種フラグの初期化・・・・・・⑥
selectCard1 = -1; //1枚目にめくったカードのインデックス
selectCard2 = -1; //2枚目にめくったカードのインデックス
sameCount = 0; //揃った回数
missCount = 0; //ミスした回数
targetIndex = 0; //選択候補カードのインデックス
List1をご覧いただけばわかるように,このフレームで行っている処理は大きく6つのブロックに分けることができる(リスト内①~⑥)。ここで④と⑥は,カードのシャッフルには直接関係ない処理なので後回しとし,残る4つのブロックを順に解説することにしよう。
ケータイFlashゲーム制作レクチャー
- 第18回 最終回!クリエイトツールFlash!!
- 第17回 パズルゲームレクチャー(3)オリジナルパズルを考える!
- 第16回 パズルゲームレクチャー(2)パズルを完成させる!
- 第15回 パズルゲームレクチャー(1) お手軽パズルゲームを作る!
- 第14回 マップ冒険ゲームレクチャー(4) イベントの作成②~そして!!
- 第13回 マップ冒険ゲームレクチャー(3) マップ上のイベントを作る!
- 第12回 マップ冒険ゲームレクチャー(2) PCの移動とマップスクロールを作る!
- 第11回 マップ冒険ゲームレクチャー(1) ゲームの王道 マップ冒険ゲームをFlashで作る!
- 第10回 カードゲームレクチャー(4) いよいよ完成!!
- 第9回 カードゲームレクチャー(3)めくったカードとその判定!!


