[目次へ][前へ][次へ][表紙へ]
 カー・レースを作ろう その4

 8.敵の車の移動
	;敵の車の移動
	for i, 0, ENEMAX
		if enemy_f(i) == 1 {
			enemy_y(i) += 4
			if enemy_y(i) >= GHEIGHT { enemy_f(i) = 0 }
		}
	next

 存在する敵のみ移動処理を行います。本ゲームではまっすぐ上から下に動くだけです。一度にy座標を4増やすことにします。画面下端より外に出たら存在フラグを「存在しない」に変えます。

 敵の移動処理は敵の出現処理より前に書きます。なぜかというと、後ろに書くと、出現した後すぐに移動を行うため、出現位置が1回動いた位置になってしまうからです。

 9.スコアの処理
	;スコアの処理
	if score_cnt == 32 {
		score_cnt = 0
		score += 100
		if score > hiscore { hiscore = score }
	}

 score_cntが32になったら0に戻し、スコアに100点足します。すると結局、走行距離に応じてスコアが上がっていくことになります。
 スコアがハイスコアを超えたらハイスコアを更新します。

 10.自分の車と敵の車の当たり判定

 自分の車と敵の車の当たり判定は、見た目の大きさで行わない方がいいです。プログラム的にはちゃんと当たっているのですが、人間の目には近寄っただけで当たったことにされたように見えてしまいます。自分の車の真ん中1ドットにしか当たり判定がないくらいでちょうどよいのです。

 自分の車は32×32ですから、中心座標は(mycar_x + 16, mycar_y + 16)です。これが敵の矩形の範囲内にあれば当たりとなります。

	;自分の車と敵の車の当たり判定
	cx = mycar_x + 16
	cy = mycar_y + 16
	for i, 0, ENEMAX
		if enemy_f(i) == 1 & cx >= enemy_x(i) & cx <= enemy_x(i) + 31 & cy >= enemy_y(i) & cy <= enemy_y(i) + 31 {
			explosion_f = 1
			_break
		}
	next

 存在する敵とだけ当たり判定を行います。1台でも当たっている敵があれば、explosion_fを1(爆発中)にします。

 11.画面の更新
	;
	;画面の更新
	;
	redraw 0
	;背景の描画
	color 64, 64, 64
	boxf 0, 0, GWIDTH - 1, GHEIGHT - 1
	color 0, 0, 255
	boxf GWIDTH, 0, 639, 479

 背景が真っ黒だとタイヤが見にくいので、ゲーム画面は灰色、スコア等の表示部は青で塗りつぶします。

	;敵の車の描画
	for i, 0, ENEMAX
		if enemy_f(i) == 1 {
			gdx = enemy_x(i) : gdy = enemy_y(i)
			wid = 1
			div_no = 1
			gosub *Graphic_Draw
		}
	next

 存在する敵のみ描画します。

	;自分の車の描画
	if explosion_f == 0 {
		gdx = mycar_x : gdy = mycar_y
		wid = 1
		div_no = 0
		gosub *Graphic_Draw
	} else {
		;爆発時は爆発を描く
		gdx = mycar_x - 16 : gdy = mycar_y - 16
		wid = 2
		div_no = 0
		gosub *Graphic_Draw
	}

 explosion_fが0(爆発中ではない)なら自分の車を、explosion_fが1(爆発中)なら爆発を描きます。
 車の大きさが32×32、爆発の大きさが64×64ですから、(mycar_x - 16, mycar_y - 16)に爆発を描くとちょうどよい位置に表示されます(32×32の矩形の左上隅は中心からx方向に16、y方向に16離れています。64×64の矩形の左上隅は中心からx方向に32、y方向に32離れています)。

	;スコアの表示
	msx = GWIDTH + 16 : msy = 32
	message = "SCORE:"
	gosub *Write_Message
	msx = GWIDTH + 32 : msy = 52
	message = score
	gosub *Write_Message
	msx = GWIDTH + 16 : msy = 72
	message = "HI-SCORE:"
	gosub *Write_Message
	msx = GWIDTH + 32 : msy = 92
	message = hiscore
	gosub *Write_Message
	;残機表示
	for i, 0, n_car - 1
		gdx = GWIDTH + 16 + 40 * i : gdy = 128
		wid = 1
		div_no = 0
		gosub *Graphic_Draw
	next
	redraw 1

 残機は、実際の数より一つ少なく描くのが一般的です。今走っている車の他に、あとこれだけ残っているよ、という意味です。
 x座標は、GWIDTH + 16の位置から、車と車の間隔が8になるように描くことにします。すると、車の左上隅と隣の車の左上隅との距離が40になるように描けばよいということになります。



 12.自分の車が爆発中の処理
	;自分の車が爆発中の処理
	if explosion_f == 1 {
		mmplay 1
		wait 200
		n_car--
		if n_car > 0 {
			goto *Restart
		} else {
			msx = 208 : msy = 232
			message = "GAME OVER"
			gosub *Write_Message
			wait 300
			goto *Title_Screen
		}
	}

 explosion_fが1ならば爆発音を鳴らします。mmplay命令では、WAVファイルの音を鳴らしている最中に別のWAVファイルの音(同じ音でも)を鳴らすと、前の音は止まります。そのため、ここで自動的に走行音は止まります。MIDIファイルの音楽を流しながらWAVファイルの効果音を鳴らすことは可能です。

 2秒待ち、残機を1機減らします。残機が残っていれば再スタート時の初期設定に戻ります。
 残機が0ならば"GAME OVER"と書き、3秒待ち、タイトル画面に戻ります。

 13.6.に戻る
	appear_cnt++
	score_cnt++
	
	goto *Main_Loop

[サンプルをダウンロード]


[目次へ][前へ][次へ][表紙へ] inserted by FC2 system