[目次へ][前へ][次へ][表紙へ]
 シューティングゲームを作ろう その9

 16.自機と敵、敵の弾との当たり判定
	;自機と敵、敵の弾との当たり判定
	if myship_state == 1 {
		f = 0
		cx = myship_x + 16
		cy = myship_y + 16
		for i, 0, ENEMAX
			if enemy_state(i) == 1 & cx >= enemy_x(i) & cx <= enemy_x(i) + 31 & cy >= enemy_y(i) & cy <= enemy_y(i) + 31 {
				enemy_state(i) = 0
				f = 1
			}
		next
		for i, 0, ESHOTMAX
			if eshot_f(i) == 1 & cx >= eshot_x(i) & cx <= eshot_x(i) + 15 & cy >= eshot_y(i) & cy <= eshot_y(i) + 15 {
				eshot_f(i) = 0
				f = 1
			}
		next
		if f == 1 {
			dsplay 2
			myship_state = 2
			myexplode_cnt = 0
		}
	}

 自機が爆発中は敵、敵の弾との当たり判定を行いません。また復活中は無敵なのでやはり当たり判定を行いません。つまり、自機が通常状態の時のみ当たり判定を行います。

 fは自機が敵または敵の弾に当たったかどうかのフラグで、どれか一つにでも当たっていれば1、そうでなければ0とします。

 自機は真ん中1ドットにしか当たり判定がないものとします。
 爆発中の敵には当たりませんから、通常状態の敵とのみ当たり判定を行います。弾は存在するものと当たり判定を行います。
 爆発する自機を敵や弾が素通りしても構わないのですが、当たっているのですから消した方が自然です。

 当たっていれば、自機の爆発音を鳴らし、自機の状態を「爆発中」にし、自機の爆発用カウンタを0にします。

 17.自機が爆発中の処理
	;自機が爆発中の処理
	if myship_state == 2 {
		myexplode_cnt++
		if myexplode_cnt == 100 {
			n_myship--
			if n_myship > 0 {
				myship_state = 3
				myrevival_cnt = 0
				myship_x = (GWIDTH - 32) / 2
				myship_y = GHEIGHT - 64
			} else {
				;GAME OVER処理
				mci "stop bgm"
				msx = 208 : msy = 232
				message = "GAME OVER"
				gosub *Write_Message
				wait 300
				goto *Title_Screen
			}
		}
	}

 自機の状態が「爆発中」であれば、爆発用カウンタを1増やし続けます。100になったら残機を1機減らします。

 残機が0より多ければ自機の状態を「復活中」に変え、復活用カウンタを0にします(revivalは「復活」です)。復活時の位置はステージスタート時と同じとします。

 残機が0であればGAME OVER処理を行います。BGMを止め、"GAME OVER"と書き、3秒待ち、タイトル画面に戻ります。

 なお、自機が爆発中の処理は自機と敵、敵の弾との当たり判定より前に書きます。

 18.自機が復活中の処理
	;自機が復活中の処理
	if myship_state == 3 {
		myrevival_cnt++
		if myrevival_cnt == 200 { myship_state = 1 }
	}

 自機の状態が「復活中」であれば復活用カウンタを1増やし続け、200になったら自機の状態を「通常」に変えます。

 なお、自機が復活中の処理は自機が爆発中の処理より前に書きます。


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