振り返り:ヘルスシステム
CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 39/65。
チャレンジ
簡単ヘルスコンポーネントが変更のたびに通知し、ヘルスバーがそれに反応するヘルスシステムを構築します。
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オンラインコンパイラ