ゲームブロックで操作スプラウトと落下物のスプラウトがぶつかった時の処理を追加しよう


ゲームブロックで左右に操作できるスプライトと落下物スプライトがぶつかった(さわった)時に落下物スプライトを一旦消して、一番上に再度表示するようにしてみます。


ゲームブロックで操作スプラウトと落下物のスプラウトを同時に設置してみようのコードを少し改修するだけで対応できます。



もし落下物の y >= 4 ならの箇所を



もしプレイヤーが他のスプライト落下物にさわっているならに変更すれば良いです。




現状のコードでは単純に落下物スプライトが一番下に移動した時にプレイヤーをさわらなければ、そのまま下に居続けるだけになりますので、



落下物スプライトが一番下に到達した時はゲームオーバーにするの処理を追加しておきます。

プレイヤーと落下物がぶつかるのと、ゲームオーバーはどちらも落下物スプライトの y が 4 の時なので、落下物スプライトの y に 1 を追加した後にもしブロックで大きく囲っておきます。




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

from microbit import *

falling_object = [2, 0]

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

ticks = 20
current_tick = 0

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

# 点を表示後に次に点を表示する箇所を指定する
def update_falling_object():
	global falling_object, player, current_tick, ticks

	current_tick += 1

	if current_tick >= ticks:
		current_tick = 0

		# プレイヤーと落下物が接触した場合は音を出して、新しい落下物を用意する
		if player[0] == falling_object[0] and player[1] == falling_object[1]:
			audio.play(Sound.HAPPY)
			falling_object[1] = 0
			if ticks > 0:
				ticks -= 1
		else:
			# 点が一番下に到達していた場合は、次回は一番上に表示する
			if falling_object[1] == 4:
				falling_object[1] = 0
				if ticks > 0:
					ticks -= 1
			else:
				falling_object[1] += 1
    
run_every(render, ms=50)
run_every(update_falling_object, ms=50)

# プレイヤーの操作に関する処理
while True:
	if button_a.was_pressed():
		if player[0] > 0:
			player[0] -= 1
	if button_b.was_pressed():
		if player[0] < 4:
			player[0] += 1
from microbit import *

falling_object = [2, 0]

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

ticks = 20
current_tick = 0

# renderを止める為に必要
render_active = True

def render():
	global falling_object, player, render_active

	# GAME OVERを表示したらrender関数を止める
	if not render_active:
		return
    
	coord = ""
	for y in range(0, 5):
		for x in range(0, 5):
			if player[0] == x and player[1] == y:
				coord += "9"
			elif falling_object[0] == x and falling_object[1] == y:
				coord += "9"
			else:
				coord += "0"
		coord += ":"
	img = Image(coord)
	display.show(img)

# 点を表示後に次に点を表示する箇所を指定する
def update_falling_object():
	global falling_object, player, current_tick, ticks, render_active

	current_tick += 1

	if current_tick >= ticks:
		current_tick = 0

        # プレイヤーと落下物が接触した場合は音を出して、新しい落下物を用意する
		if player[0] == falling_object[0] and player[1] == falling_object[1]:
			audio.play(Sound.HAPPY)
			falling_object[1] = 0
			if ticks > 0:
				ticks -= 1
		else:
			# 落下物が一番下まで到達した
			if falling_object[1] > 4:
				display.scroll("GAMEOVER")
				render_active = False
			else:
				falling_object[1] += 1
    
run_every(render, ms=50)
run_every(update_falling_object, ms=50)

# プレイヤーの操作に関する処理
while True:
	if button_a.was_pressed():
		if player[0] > 0:
			player[0] -= 1
	if button_b.was_pressed():
		if player[0] < 4:
			player[0] += 1
京都の東本願寺で開催されているプログラミング教室で講師をしています。
詳しくはTera schoolを御覧ください。
同じカテゴリーの記事
マインクラフト用ビジュアルエディタを開発しています。

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