Menu
CoddyTech

振り返り:ヘルスシステム

CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 39/65。

challenge icon

チャレンジ

簡単

ヘルスコンポーネントが変更のたびに通知し、ヘルスバーがそれに反応するヘルスシステムを構築します。

Health (health.gd) は max_hp と hp(どちらもコンストラクターに渡された値で開始)を保持し、3つのシグナルを宣言します: damaged(amount, hp)、healed(amount, hp)、died。

  • take_damage(amount) は hp を減らしますが、0 未満にはならず、実際に失われた HP と新しい hp を指定して damaged を発行します。hp が 0 になると、died も発行します。
  • heal(amount) は hp を増やしますが、max_hp を超えず、実際に回復した HP と新しい hp を指定して healed を発行します。体力が最大のときに回復しても、何も発行しません。
  • hp が 0 になると、どちらのメソッドも何もしません。

HealthBar (health_bar.gd) には watch(health) があり、3つすべてのシグナルを自身のメソッドに接続します。それらのメソッドは -8 HP [12/20]、+5 HP [17/20]、Game over を出力します。バーは必要な最大 HP を数値として保持します。Health オブジェクトへの参照は保持しないでください。

提供されたコードは最大 HP と後に続くコマンドの数(damage 8、heal 5)を読み取り、その後、最終 HP を出力します。最大値が 20 で、damage 8、heal 5、heal 10、damage 30、heal 5 の場合、次のように出力します:

-8 HP [12/20]
+5 HP [17/20]
+3 HP [20/20]
-20 HP [0/20]
Game over
Final HP: 0

コードは health.gd と health_bar.gd に記述します。main.gd には提供された入出力コードが含まれており、編集できません。

自分で試してみよう

extends Node

func _ready():
	# 提供された入出力コード:そのままにしてください
	var health := Health.new(int(OS.read_string_from_stdin()))
	var bar := HealthBar.new()
	bar.watch(health)
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		if parts[0] == "damage":
			health.take_damage(int(parts[1]))
		elif parts[0] == "heal":
			health.heal(int(parts[1]))
	print("Final HP: ", health.hp)

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: GDScriptオンラインコンパイラ