Jak stworzyć system zdrowia gracza w Godot 4?
System zdrowia gracza to jedna z najważniejszych mechanik w większości gier. Nawet bardzo prosta gra platformowa, RPG, gra akcji albo survival potrzebuje informacji o tym, ile obrażeń może przyjąć postać, kiedy powinna umrzeć i w jaki sposób można ją uleczyć.
W Godot 4 najlepiej nie wrzucać całej logiki zdrowia bezpośrednio do głównego skryptu gracza. Znacznie lepszym rozwiązaniem jest stworzenie osobnego komponentu, na przykład HealthComponent . Dzięki temu ten sam system można później wykorzystać nie tylko u gracza, ale także u przeciwników, bossów, skrzyń, drzwi, beczek wybuchowych albo innych obiektów zniszczalnych.
Przykładowa struktura sceny
Najprostsza struktura gracza może wyglądać tak:
Node Player odpowiada za ruch, wejście gracza i ogólne zachowanie postaci. Node HealthComponent odpowiada wyłącznie za zdrowie. Taki podział pozwala łatwiej rozwijać projekt, ponieważ każda część gry ma swoje konkretne zadanie.
Skrypt HealthComponent.gd
Utwórz nowy skrypt o nazwie HealthComponent.gd i przypisz go do node’a HealthComponent .
extends Node
signal health changed current health: int, max health: int signal died
@export var max health: int = 100
var current health: int = 0 var is dead: bool = false
func ready - void: current health = max health health changed.emit current health, max health
func take damage amount: int - void: if is dead: return
if amount <= 0: return
current health -= amount current health = clamp current health, 0, max health
health changed.emit current health, max health
if current health <= 0: die
func heal amount: int - void: if is dead: return
if amount <= 0: return
current health += amount current health = clamp current health, 0, max health
health changed.emit current health, max health
func die - void: if is dead: return
is dead = true died.emit
Co robi ten skrypt?
Zmienna max health określa maksymalną liczbę punktów życia. Dzięki oznaczeniu @export można zmieniać tę wartość bezpośrednio w edytorze Godot, bez edytowania kodu.
Zmienna current health przechowuje aktualną liczbę punktów życia. Przy starcie gry jest ustawiana na wartość max health , czyli gracz zaczyna z pełnym zdrowiem.
Funkcja take damage odejmuje zdrowie. Jeżeli zdrowie spadnie do zera, wywoływana jest funkcja die . Funkcja heal działa odwrotnie — dodaje zdrowie, ale nie pozwala przekroczyć maksymalnej wartości.
Dlaczego używamy sygnałów?
Sygnały health changed i died pozwalają innym elementom gry reagować na zmianę zdrowia bez sztywnego łączenia skryptów. Na przykład pasek życia może słuchać sygnału health changed , a główny skrypt gracza może słuchać sygnału died .
Dzięki temu komponent zdrowia nie musi wiedzieć, czy aktualizuje pasek życia, wyświetla ekran końca gry, odtwarza animację śmierci czy usuwa przeciwnika ze sceny. On tylko informuje: „zdrowie się zmieniło” albo „postać umarła”.
Podłączenie systemu zdrowia do gracza
W skrypcie gracza można odwołać się do komponentu zdrowia w taki sposób:
extends CharacterBody2D
@onready var health component: Node = $HealthComponent
func ready - void: health component.died.connect on player died
func on player died - void: print "Gracz zginął" queue free
func damage player - void: health component.take damage 10
Jak testować system zdrowia?
Najprostszy test można zrobić przez przypisanie obrażeń do klawisza. Najpierw w ustawieniach projektu dodaj akcję, na przykład test damage . Następnie w skrypcie gracza dodaj:
Po uruchomieniu gry każde naciśnięcie przypisanego klawisza odejmie graczowi 10 punktów zdrowia.
Jak rozbudować system zdrowia?
- nieśmiertelność przez kilka sekund po otrzymaniu obrażeń, - różne typy obrażeń, na przykład ogień, trucizna albo lód, - regenerację zdrowia, - pancerz zmniejszający obrażenia, - animację otrzymania ciosu, - efekty dźwiękowe, - automatyczne odrodzenie gracza.
Podsumowanie
System zdrowia warto przygotować jako osobny komponent. Jest to proste, czytelne i bardzo wygodne rozwiązanie. Dzięki niemu można łatwo dodawać zdrowie do różnych obiektów w grze, bez kopiowania tej samej logiki do wielu skryptów.
<center <sub Published using <a href=' Blurt Publisher</a from <a href='
Komentarze