ゲームブロックでプレイヤースプライトから弾を発射するアニメーションを作ってみよう


ゲームブロックでシューティングゲーム風のプレイヤーから弾を発射するアニメーションを作ってみます。

今回のアニメーションができれば、このコードを元にシューティングゲームを作る事が出来るようになります。


ゲームブロックを使ってみようのコードを参考にして、プレイヤーとして操作できるスプライトを作成します。


操作はプレイヤースプライトを作成し、ボタンAを押した時に左に動き、ボタンBを押した時に右に動きます。

ボタンA + B同士押しでプレイヤースプライトの位置で弾スプライトを生成して、100ミリ秒毎に上に移動して、弾が動いているように見せます。






続いて、弾を発射するコードを追加したいところなのですが、MakeCodeにはテキスト言語にあるようなスプライトが既に作成されているか?といった判定用のブロックが用意されていないため、変数のフラグとしての使い方について見てみようで触れました変数を使ったフラグの仕組みを利用することにします。


フラグを使う箇所は、弾が発射中であるかどうかで、今回は発射中という名前の変数を用意します。



発射中のフラグはボタンA + B同士押しの時の弾の発射周辺で 1 にして、


ずっとブロック内で弾の移動についてのコードを書きます。

今回のコードでは連射は出来ませんが、ボタンA + Bが押されたとき内で「もし発射中 = 0」の判定を外せば弾を連射できるようになります。




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

from microbit import *

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

# 弾
bullet = [0, 0]

# 弾が発射中 
is_launching = 0

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

def render():
	global player, bullet, is_launching

	# 弾の移動に関する処理
	if is_launching:
		bullet[1] -= 1
		if bullet[1] < 0:
			is_launching = 0
	
	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"
			else:
				coord += "0"
		coord += ":"
	img = Image(coord)
	display.show(img)

run_every(render, 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をご覧ください。