カー・レースを作ろう その3 |
6.自分の車の移動 |
矢印キーの左右で自分の車を動かします。一度に4ドット動かすことにします。
; ;メイン・ループ ; *Main_Loop await 16 ;自分の車の移動 getkey key, 37 if key == 1 { mycar_x -= 4 } getkey key, 39 if key == 1 { mycar_x += 4 } if mycar_x < 0 { mycar_x = 0 } if mycar_x > GWIDTH - 32 { mycar_x = GWIDTH - 32 }
7.敵の車の出現 |
(1)敵の車の出現
;敵の車の出現 if appear_cnt == 16 { appear_cnt = 0 敵の車をn_enemy台出す処理 car_cnt++ if car_cnt == 30 { car_cnt = 0 if n_enemy < 6 { n_enemy++ } } }
appear_cntが16になったらappear_cntを0に戻し、敵の車をn_enemy台出す処理を行います。また、敵の車を出したのでcar_cntを1増やします。
car_cntが30になったら0に戻し、n_enemyを1増やします。ただしn_enemyの上限は6(こういった数値はテストプレイを繰り返して決めます)とします。
ゲーム画面のすぐ上、図の赤い四角(一つの四角は32×32)の位置のどれかをランダムに選んで敵の車をn_enemy台出します。しかし、乱数で決めた際に、複数の車が同じ位置に出てしまっては困ります。そこで、先に車のx座標を決めてしまって、その後出す処理を行います。すると敵の車をn_enemy台出す処理は
の2つに分かれます。
(2)車のx座標を決める処理
n_enemy台分の車のx座標を一時的に入れておく配列変数をtmp_enemy_xとします(tmpはtemporary(一時的な)の略です)。
上図の赤い四角をブロックと呼ぶことにすると、ゲーム画面の幅が480で1ブロックの幅が32ですから、15ブロック分あります。左端を0ブロック目とすると右端が14ブロック目です。すると、敵の車のx座標はrnd(15) * 32となります。
for i, 0, n_enemy if i == 0 { tmp_enemy_x(0) = rnd(15) * 32 } else { while tmp_enemy_x(i) = rnd(15) * 32 f = 0 for j, 0, i if tmp_enemy_x(j) == tmp_enemy_x(i) { f = 1 _break } next if f == 0 { _break } wend } next
0番目からn_enemy - 1番目までの敵のx座標を決めます。1番目以降は、自分と同じ座標の敵がすでにあるかないかを確認しなければなりません。
同じ座標の敵がすでにあるかないかのフラグをfとします。あれば1、なければ0を入れます。まず、fに0を入れておきます。
自分(i番目の敵)と、0からi - 1番目の敵のx座標を順に比べていって、同じものがあればfに1を入れます。比べた後、fが0であればx座標が確定するのでwhile 〜 wendループから抜けます。1であれば
tmp_enemy_x(i) = rnd(15) * 32
に戻ってx座標を決め直します。
(3)車を出す処理
n_enemy台の敵を出します。
for i, 0, n_enemy for j, 0, ENEMAX if enemy_f(j) == 0 { enemy_f(j) = 1 enemy_x(j) = tmp_enemy_x(i) enemy_y(j) = -32 _break } next next
敵の車を1台出す処理は以下の通りです。
nはどのようにして決めればいいでしょうか。存在フラグが1であるものは、すでに画面に出ている敵ですから、それに割り当てるわけにはいきません。存在フラグが0であればどれでもいいですね。そこで存在フラグを0番目の要素から順に見ていって、最初に見つかった0である要素に割り当てます。割り当てたら以後の要素は見ても仕方ないので_breakで抜けます。
もし敵の出現数が上限に達していた場合(enemy_f(0) 〜 enemy_f(ENEMAX - 1)がすべて1である場合)は、それ以上出しません。
まとめますと、敵の車の出現処理は以下のようになります。
;敵の車の出現 if appear_cnt == 16 { appear_cnt = 0 for i, 0, n_enemy if i == 0 { tmp_enemy_x(0) = rnd(15) * 32 } else { while tmp_enemy_x(i) = rnd(15) * 32 f = 0 for j, 0, i if tmp_enemy_x(j) == tmp_enemy_x(i) { f = 1 _break } next if f == 0 { _break } wend } next for i, 0, n_enemy for j, 0, ENEMAX if enemy_f(j) == 0 { enemy_f(j) = 1 enemy_x(j) = tmp_enemy_x(i) enemy_y(j) = -32 _break } next next car_cnt++ if car_cnt == 30 { car_cnt = 0 if n_enemy < 6 { n_enemy++ } } }