Jak stworzyć prosty system ataku w Godot 4?

W ostatnich dwóch wpisach zajęliśmy się kwestiami paska życia oraz systemu punktów życia. Teraz czas na zadawanie obrażeń ;

System ataku pozwala graczowi zadawać obrażenia przeciwnikom. Może to być atak mieczem, uderzenie pięścią, strzał z broni, zaklęcie albo dowolna inna akcja bojowa. W tym artykule stworzymy prosty system ataku w Godot 4, który wykrywa przeciwników w zasięgu i zadaje im obrażenia.

Najważniejsze jest to, aby system ataku nie był na sztywno połączony tylko z jednym przeciwnikiem. Gracz powinien móc zaatakować dowolny obiekt, który posiada system zdrowia.

Przykładowa struktura gracza

AttackArea to obszar ataku. Jeżeli przeciwnik znajduje się wewnątrz tego obszaru, może zostać trafiony.

Skrypt AttackArea.gd

Utwórz skrypt AttackArea.gd i przypisz go do node’a AttackArea .

extends Area2D

@export var damage: int = 10 @export var attack cooldown: float = 0.4

var targets: Array Node = var can attack: bool = true

func ready - void: body entered.connect on body entered body exited.connect on body exited

func on body entered body: Node - void: if body.has node "HealthComponent" : targets.append body

func on body exited body: Node - void: targets.erase body

func attack - void: if not can attack: return

if targets.is empty : return

can attack = false

for target in targets: if not is instance valid target : continue

if target.has node "HealthComponent" : var health component = target.get node "HealthComponent" health component.take damage damage

await get tree .create timer attack cooldown .timeout can attack = true

Jak działa ten system?

Gdy przeciwnik wejdzie w obszar AttackArea , zostaje dodany do tablicy targets . Gdy wyjdzie z obszaru, zostaje z niej usunięty. Dzięki temu gracz zawsze wie, które obiekty znajdują się w zasięgu ataku.

Funkcja attack sprawdza, czy atak jest aktualnie możliwy. Jeżeli tak, przechodzi po wszystkich celach w zasięgu i zadaje im obrażenia przez wywołanie funkcji take damage w komponencie zdrowia.

Wywołanie ataku ze skryptu gracza

W skrypcie gracza trzeba odwołać się do node’a AttackArea .

extends CharacterBody2D

@onready var attack area: Area2D = $AttackArea

func process delta: float - void: if Input.is action just pressed "attack" : attack area.attack

W ustawieniach projektu należy wcześniej dodać akcję attack w Project Settings → Input Map . Można przypisać do niej na przykład lewy przycisk myszy, spację albo klawisz F .

Dlaczego potrzebny jest cooldown?

Bez ograniczenia czasowego gracz mógłby zadawać obrażenia w każdej klatce gry. To oznaczałoby, że przeciwnik mógłby zginąć natychmiast. Zmienna attack cooldown określa, jak często można wykonać kolejny atak.

Jak dodać animację ataku?

Jeżeli gracz posiada AnimatedSprite2D , można podczas ataku odtworzyć animację:

@onready var animated sprite: AnimatedSprite2D = $AnimatedSprite2D

func process delta: float - void: if Input.is action just pressed "attack" : animated sprite.play "attack" attack area.attack

W bardziej rozbudowanej wersji obrażenia powinny być zadawane dopiero w konkretnym momencie animacji, na przykład wtedy, gdy miecz faktycznie trafia przeciwnika.

Co można rozbudować?

- różne typy broni, - różne zasięgi ataku, - atak tylko w kierunku patrzenia gracza, - obrażenia krytyczne, - odrzucenie przeciwnika, - efekty cząsteczkowe, - dźwięk uderzenia, - blokowanie ataku podczas animacji.

Podsumowanie

Prosty system ataku w Godot 4 można stworzyć z pomocą Area2D , sygnałów wejścia i wyjścia oraz komponentu zdrowia. To dobry fundament pod bardziej rozbudowany system walki, który można później rozwijać o broń, animacje, efekty i różne typy przeciwników.

Linki do zewnętrznych artykułów:

<

<center <sub Published using <a href=' Auto Publisher for Blurt</a from <a href='

Komentarze

Ładuję komentarze…