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

signal hit_by_hitbox(area: HitBox)

func _ready() -> void:
    connect_signals()

func connect_signals() -> void:
    area_entered.connect(func(area: Area2D):    
	    if area is HitBox:
            hit_by_hitbox.emit(area)
        )
    

lo más destacable es que vamos a utilizar la señal hit_by_hitbox, que hemos definido nosotros y la señal area_entered que está asociada a un Area2D.

La función connect_signals conecta la señal area_entered a una función lambda, que tiene como parámetro el area que ha entrado. En esa función se comprueba si el área es un HitBox y, en caso afirmativo, se emite la señal hit_by_hitbox, que lleva como parámetro asociado ese Hitbox.

La responsabilidad de lo que ocurra después recae en el propietaro del HurtBox. Ese propietario, tiene que conectar la señal hit_by_hitbox a una función que la maneje, ya sea muriendo, disminuyendo su salud, etc.

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


signal hit_area(area: Area2D)
signal hit_body(body: Node2D)

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

@export var damage : int = 0

func _ready() -> void:
    connect_signals()


func connect_signals() -> void:
    area_entered.connect(func(area: Area2D): hit_area.emit(area))

    body_entered.connect(func(body: Node2D): hit_body.emit(body))

Se trata de un script muy sencillo. En este caso definimos dos señales hit_area y hit_body y las conectamos, como vimos es el caso del HurtBox, para que se emitan, con su respectivo parámetro, en el caso de que entre un cuerpo o un area en el HitBox.

Por otra parte, se define la variable exportable damage, que permite saber cuánto daño hay que aplicar al HurtBox.

Hay que tener en cuenta, que salvo que el propietario del HitBox sea un projectil que se destruye al impactar con algo, normalmente no conectaremos desde el propietario a las señales del HitBox

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)