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

Ładuję komentarze…