インタラクティブにゲームを動かす!これぞボタンアクション!

めくるカードを選択させる(続)
まずは、
(4)選択候補枠移動の仕掛け
スクリプトを記述する場所は、
- 実際のflaファイルGameCard.
fla (Flash CS3用のもの、 Flash 8用のもの)

ここに記述するスクリプトは次のようなものだ
//6キー押下時(選択候補枠移動(→))・・・・・・①
on (keyPress "6") {
//次の候補インデックスを検索・・・・・・②
flg=0;
do{
targetIndex++;・・・・・・③
targetIndex%=8;
flg = Eval("CardLook" add targetIndex);
} while(flg);
//候補インデックスに対応するカードに候補枠を付加
if(selectCard1・・・・・・④
gotoAndStop( ../:targetIndex+1);
}
}
else{ //2枚目の選択時
tellTarget("Target2"){
gotoAndStop( ../:targetIndex+2);
}
}
}
//4キー押下時(選択候補枠移動(←)) ・・・・・・⑤
on (keyPress "4") {
//次の候補インデックスを検索
flg=0;
do{
targetIndex+=7; ・・・・・・⑥
targetIndex%=8;
flg = Eval("CardLook" add targetIndex);
} while(flg);
//候補インデックスに対応するカードに候補枠を付加
if(selectCard1
List1についてポイントとなる所に項番を付した。この順に解説していこう。
① 6キー押下時は、
右送りに選択が移ることになる。これはCardの連番を昇順に数えていく動きとなる。 ② 次の候補インデックスを検索する。すでにペアが揃ってしまい場に存在しなくなったカードは、
該当するCardLockに"1"がセットされているため、 この値が"0"になるまで処理を繰り返すことにより、 次の"めくれるカード"を発見することができる。 ③ 式targetIndex++は、
変数targetIndexへの1加算を示す。これを繰り返していくとすぐにtargetIndexが上限値である"7"を超えてしまうが、 次の行にある式targetIndex%=8により、 その値が8になると0にリセットされる。これは%が剰余算 (割り算の余りを求める演算) を行う演算子であるためだ。このようにある範囲の数値を循環して利用したいような場合、 %演算を利用すると、 if (targetIndex == 8) { targetIndex = 0; }
などとif文を使って値を記述するよりも、
幾分処理効率がよく、 またコードがスマートである。 ④ ②で決定した候補インデックスに対応するカードに候補枠を付加する。これは選択候補クリップのインスタンスTarget1もしくはTarget2の表示フレームをgotoAndStopで変更してあげればよい
(この時、 選択候補クリップは1枚目用と2枚目用で空白フレームの分フレーム番号が1つずれている点注意すること。)。
⑤ 今度は、
4キー押下時。左送りに選択が移ることになる。つまりCardの連番を降順に数えていく動きとなる。 ⑥ ③がtargetIndex++だったから、
今度はtargetIndex--だと思った人! ・・・残念でした。それだとtargetIndexあえてtargetIndex+=7と7加算することにより、
次の行の式targetIndex%=8で余りを求め、 結果的に-1させるように作るのだ。この方が、 形が③と揃いスマートでしょっ!! 実にちょっとしたことだけれども、 こうした点にこだわりが持てるとスクリプトがグッとカッコよくクールに見えるのだ。
いよいよカードをめくる
続いて5キー押下時の処理。カードをめくる仕掛けだ。前項にも記したように、
//5キー押下時(決定) ・・・・・・①
on (keyPress "5") {
//カードを表にする ・・・・・・②
tellTarget("CardPlay/Card"add targetIndex ){
gotoAndStop( Eval("../../:CardVal" add ../../:targetIndex));
}
//カードをロック状態にする
set("CardLook" add targetIndex, 1);
if(selectCard1 ・・・・・・③
selectCard1 = targetIndex; //1枚目の選択インデックスを保存
//次の候補インデックスを検索
flg=0;
do{
targetIndex++;
targetIndex%=8;
flg = Eval("CardLook" add targetIndex);
} while(flg);
//候補インデックスに対応するカードに候補枠を付加
tellTarget("Target2"){
gotoAndStop( ../:targetIndex+2);
}
}
else{ //2枚目の選択時 ・・・・・・④
selectCard2 = targetIndex; //2枚目の選択インデックスを保存
//2枚のカードのナンバーが同じか確認する
List3を参照
}
}
List2についてもポイントとなる所に項番を付した。やはりこの順に解説する。
① 5キー押下時は、
カードをめくる動きとなる。これは、 カードの表を表示するブロック、 1枚目のカードがめくられた後の処理をするブロック、 2枚目のカードがめくられた後の処理をするブロックの3つのブロックからなる。 ② カードの表を表示する。Card0~Card7の表面となるマークやナンバーのフレーム番号は、
それぞれ変数CardVal0~CardVal7に保存されている。また、 めくるべきカードの番号は変数targetIndexに保持されている。 したがって、
"CardPlay/ Card" add targetIndex の表示フレームをgotoAndStopで変数"CardVal" add targetIndexの値に移動してやれば、カードはめくられることになる。 めくられたカードは、
もう一度選択されることがない様にロック状態とする。これは変数"CardLock" add targetIndexの値を1とすればよい。 ③ めくられたのが1枚目か2枚目かで、
次の処理が変わってくる。1枚目の時は、 まず、 変数targetIndexの値を変数selectCard1に保存 (これにより、 逆に式selectCard1の判定により現在めくられたカードが1枚目か2枚目かを見分ける事も可能となる)、 次の選択候補を検索し (これは前項の②と同様の処理である。)、 2枚目用の選択候補枠を表示状態とする。 ④ めくられたのが2枚目の時は、
変数targetIndexの値を変数selectCard2に保存した後、 めくられた2枚のカードのナンバーが同じかどうかチェックする。これについては、 さらに項を分けて解説しよう。
2枚のカードのナンバーが同じかどうかの判定
さて、
//2枚のカードのナンバーが同じか確認する
n1 = -1; ・・・・・・①
n1 += Eval("CardVal" add selectCard1); ・・・・・・②
n1 %= 13; ・・・・・・③
n2 = -1; ・・・・・・④
n2 += Eval("CardVal" add selectCard2);
n2 %= 13;
if(n1 == n2){ //同じ時 ・・・・・・⑤
gotoAndPlay("phase4a");
}
else{ //違う時
gotoAndPlay("phase4b");
}
List3は短いがプログラミングに慣れていない人には、
① 変数n1は、
1枚目のカードのナンバーの値を代入するために用意した。初期値を-1としているのは、 ②、 ③の式を簡略して記述するためである。 ② カードクリップの2~53フレームには、
Fla画面2のように、 A (=1)~K (=13) が4回繰り返しで並んでいる。したがって、 あるカードのナンバーの値は、 (フレーム番号-1) を計算すれば良い。ここでn1は、÷13の余り あらかじめ-1で初期化されているため単純に"CardVal" add selectCard1の値を足しこむことにより、 めくられた1枚目のカードの (フレーム番号-1) の値を取ることになる。Fla画面2 カードクリップの内部。各カードが並んでいる ③ あとは、
剰余算 (%) を使って13で割った余りを代入すれば、 変数n1は1枚目のカードのナンバーの値となる。 ④ 同様の計算を行い変数n2に2枚目のカードのナンバーの値を代入する。
⑤ 2つの変数n1とn2の値を比較し、
等しければ 「2枚のカードのナンバーは同じ」 としてphase4aに、 等しくなければ 「2枚のカードのナンバーは異なる」 としてphase4bに処理を移す。
今回は、
