Hace un tiempo vi un video de InboundSovel sobre crear un sistema de frame data para su juego de plataformas, y en vista de que el sistema de hitboxes que estaba utilizando para mi juego/framework/lo que sea era un poco rudimentario, pensé que valdría la pena tratar de implementar algo similar.
Si bien usé su video como guía para tener un punto de referencia de donde empezar, terminé utilizando un acercamiento distinto que al menos a mí parecer es más ordenado y fácil de entender.
En mi caso, creo un nodo dentro de mi jerarquía de componentes al que llamo “Attacks”, es un Node2D sin nada en especial.

Luego, agrego un nodo por cada ataque distinto que quiera utilizar. Cada ataque es un objeto de la clase AttackFrameData, que hereda de Node2D, que se encarga de activar y desactivar las hitboxes correspondientes a cada frame de la animación. Este es un script del tipo tool, lo que le permite ejecutar código dentro del editor y no sólo en tiempo de ejecución, así que puedo usarlo para agregar frames desde el mismo editor.

Esto agrega un nodo del tipo AttackFrame, que hereda de mi componente de Hitbox (el que a su vez hereda de Area2D). Ahora es sólo cuestión de agregar las hitboxes correspondientes a cada frame de animación.


Cada hitbox es un objeto de la clase FrameDataHitbox, que hereda de CollisionShape2D puede contener un ataque distinto. “Attack” es un recurso de Godot implementado por mí, que incluye una cantidad de daño, fuerza de knockback, dirección de knockback, y tipo de daño (ya sea daño normal, de fuego, veneno, etc. aunque de momento sólo está implementado el daño normal)

Una vez hecho todo eso, sólo es cosa de llamar los metodos correspondientes del AttackFrameData en la línea de tiempo del AnimationPlayer, que se encargarán de manejar las hitboxes de cada frame.

Logré implementar esto en un par de horas de trabajo, la verdad pensé que me demoraría más. Aún quedan cosas por implementar pero de momento todo es bastante funcional.
Los dejo con un par de videos del sistema de combate en cuestión, CHAO CHILENOS!!