ゲームブロックで敵スプライトに弾が当たった時の処理を追加しよう


ゲームブロックでプレイヤースプライトから弾を発射するアニメーションを作ってみようで作成したコードに敵スプライトを作成し、プレイヤーから発射した弾が当たったら消えるようにします。


始めに敵のスプライトを作成してみます。



敵スプライトの作成は最初だけブロック内の他に弾が着弾した時もありますので、生成は関数にしておきます。



前回作成したコードで、弾が上の端まで行った時に弾スプライトを削除していましたが、今回は敵に当たった時も弾を削除する必要がありますので、こちらも関数にしておきます。



弾が上の端に着く判定の前に弾が敵と当たった時の判定を追加します。

弾と敵が当たる箇所の処理ですが、今後敵が下に向かって移動するといった処理を追加する可能性を考えまして、弾が移動する度に敵と当たったか?を判定するようにしています。




今回のコードをMicroPythonで書き換えてみます。

from microbit import *
import random

# プレイヤーの座標
player = [2, 4]

# 弾
bullet = [0, 0]

# 敵
def create_enemy():
	return [random.randint(0, 4), 0]
enemy = create_enemy()

# 弾が発射中 
is_launching = 0

# ボタンの押しっぱなし問題を回避
is_push_button = 0

def render():
	global player, bullet, enemy, is_launching
	
	coord = ""
	for y in range(0, 5):
		for x in range(0, 5):
			if is_launching and bullet[0] == x and bullet[1] == y:
				coord += "9"
			elif player[0] == x and player[1] == y:
				coord += "9"
			elif enemy[0] == x and enemy[1] == y:
				coord += "9"
			else:
				coord += "0"
		coord += ":"
	img = Image(coord)
	display.show(img)

# 弾の移動に関する処理
def update_bullet():
	global bullet, enemy, is_launching

	if is_launching == 1:
		if bullet[0] == enemy[0] and bullet[1] == enemy[1]:
			is_launching = 0
			enemy = create_enemy()
        
		bullet[1] -= 1
		if bullet[1] < 0:
			is_launching = 0	

run_every(render, ms=100)
run_every(update_bullet, ms=100)

while True:
	if is_push_button == 0:
		# ボタンA + Bの同時押しをしたい且つボタン押しっぱなしで反応することを回避したい場合はボタンの押し状況を事前に確認して変数に入れておく
		is_button_a_pressed = button_a.was_pressed()
		is_button_b_pressed = button_b.was_pressed()
		
		if is_button_a_pressed and is_button_b_pressed:
			if is_launching == 0:
				is_launching = 1
				bullet[0] = player[0]
				bullet[1] = 4
				is_push_button = 1
		else:
			if is_button_a_pressed:
				if player[0] > 0:
					player[0] -= 1
				is_push_button = 1
			elif is_button_b_pressed:
				if player[0] < 4:
					player[0] += 1
				is_push_button = 1
	else:
		is_push_button = 0

	# ボタン押しっぱなしで反応する問題を回避する時にWhile Trueの最後でsleep(50)を入れておくと良い
	sleep(50)
京都の東本願寺で開催されているプログラミング教室で講師をしています。
詳しくはTera schoolを御覧ください。
同じカテゴリーの記事
マインクラフト用ビジュアルエディタを開発しています。

詳しくはinunosinsi/mcws_blockly - githubをご覧ください。