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

 12.敵の弾の射出

 毎回弾を出していたら、あっという間に画面が弾だらけになってしまいます。そこで、敵が64回動く毎に1発弾を撃つことにします。
 弾は一度に6ドット動くものとします。
 種類0番の敵は下に、1番の敵は上に、2番の敵は横に弾を撃ちます。

	;敵の弾の射出
	for i, 0, ENEMAX
		if enemy_state(i) == 1 & enemy_x(i) >= 0 & enemy_x(i) <= GWIDTH -32 & enemy_y(i) >= 0 & enemy_y(i) <= GHEIGHT - 32 & enemy_cnt(i) \ 64 == 0 {
			for n, 0, ESHOTMAX
				if eshot_f(n) == 0 { _break }
			next
			if n != ESHOTMAX {
				eshot_f(n) = 1
				eshot_x(n) = enemy_x(i) + 8
				eshot_y(n) = enemy_y(i) + 8
				switch enemy_kind(i)
				case 0:
					eshot_dx(n) = 0
					eshot_dy(n) = 6
					swbreak
				case 1:
					eshot_dx(n) = 0
					eshot_dy(n) = -6
					swbreak
				case 2:
					if enemy_dx(i) == -3 {
						eshot_dx(n) = -6
					} else {
						eshot_dx(n) = 6
					}
					eshot_dy(n) = 0
					swbreak
				swend
			}
		}
	next


	for i, 0, ENEMAX
		if enemy_state(i) == 1 & enemy_x(i) >= 0 & enemy_x(i) <= GWIDTH -32 & enemy_y(i) >= 0 & enemy_y(i) <= GHEIGHT - 32 & enemy_cnt(i) \ 64 == 0 {

 通常状態の敵のみ弾を撃ちます。爆発中の敵は弾を撃ちません。
 敵が画面の外から弾を撃ってくるのは嫌ですから、画面内にいる場合に限り弾を撃ちます。
 enemy_cnt(i)が64の倍数の時に弾を撃ちます。

			for n, 0, ESHOTMAX
				if eshot_f(n) == 0 { _break }
			next

 敵の弾の配列変数のうち空いている(存在フラグが0である)要素を探します。その添え字nを取得します。

				eshot_f(n) = 1
				eshot_x(n) = enemy_x(i) + 8
				eshot_y(n) = enemy_y(i) + 8

 存在フラグを1にします。弾の出現位置は、敵の真ん中とします。弾の大きさは16×16です。

				case 2:
					if enemy_dx(i) == -3 {
						eshot_dx(n) = -6
					} else {
						eshot_dx(n) = 6
					}
					eshot_dy(n) = 0
					swbreak

 種類2番の敵については、敵が左に動いていれば弾も左に、右に動いていれば弾も右に動かします。

 13.敵の弾の移動
	;敵の弾の移動
	for i, 0, ESHOTMAX
		if eshot_f(i) == 1 {
			eshot_x(i) += eshot_dx(i)
			eshot_y(i) += eshot_dy(i)
			if eshot_x(i) <= -16 | eshot_x(i) >= GWIDTH | eshot_y(i) <= -16 | eshot_y(i) >= GHEIGHT { eshot_f(i) = 0 }
		}
	next

 存在フラグが1である弾のみ移動処理を行います。
 弾のx座標、y座標にeshot_dx(i)、eshot_dy(i)を足しこみます。
 弾が画面外に出たら消します。

 なお、敵の弾の移動処理は敵の弾の射出処理より前に書きます。


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