Godot Game: Hit y HurtBoxes

📆 12 de diciembre de 2024

Godot Game: Hit y HurtBoxes

El protagonista del juego tiene una salud que puede dufrir altibajos en función de las agresiones que reciba del exterior. Para poder gestionar esa pérdida de vida se utilizan frecuentemente las cajas de daño. En mi jugador he implementado una HurtBox, es decir, una caja que es afectada por HitBoxes del exterior, ya sean peligros, como los pinchos del techo, balas o enemigos varios.

HurtBox

La HurtBox es una Area2D, con una CollisionBox asociada. En cuanto al script que gestiona el comportamiento de la HurtBox:

class_name HurtBox extends Area2D

func _on_area_entered(area: Area2D) -> void:
	owner.get_hurt.emit(area.damage)
	if area.owner is Bullet:
		area.owner.hit_something()

lo más destacable es la función on_area_entered, que está conectada a la señal area_entered. En ella se recibe como parámetro el área que ha colisionado con la HurtBox y se emite la señal get_hurt del propietario (owner) de la HurtBox (el jugador, en este caso), con el valor damage de la HitBox. Esta señal está conectada al nodo que gestiona la salud del jugador y sirve para informar de la cantidad de daño recibido.

Además, se comprueba si el propietario de la HurtBox es una bala (Bullet), para que la bala sepa que ha impactado en el jugador y haga lo que tenga que hacer, como, por ejemplo, desaparecer (queue_free()).

HitBox

Se trata de una Area2D con su CollisionShape2D asociada y que almacena la información del daño que puede llegar a causar en la variable damage.

En mi caso, todos los enemigos o peligros llevan asociado una HitBox de este tipo:

class_name HitBox extends Area2D

"""Deal damage points to HurtBox Areas"""

@export var damage : int = 0

Se trata de un script muy sencillo, en el que únicamente se define el nombre la clase HitBox y se exporta el valor de la variable damage, de forma que se puede ajustar directamente en el editor.

Collision Layers

En la HurtBox no hago una comprobación de si la área que colisiona es o no una HitBox, porque he definido una capa en la que interaccionan únicamente Hit y HurtBoxes, pero tampoco sería una mala idea hacer dicha comprobación en la función on_area_entered.

Eso es todo respecto a cómo gestiono el daño al jugador en mi juego.

Un saludo.

Puedes compartir el enlace si te gustó: Godot Game: Hit y HurtBoxes

También puedes dejarme un mensaje:





(Esto funciona gracias a Un-static Forms)