martes, 30 de junio de 2026

Página 211: Apuntes de "Creación de un patrón de disparo radial para bullet hell"

 

Hoy muestro cómo hacer un patrón de disparo radial para bullet hell. Este patrón consiste en que el enemigo invoca una serie de proyectiles que forman un círculo y, una vez cargado el ataque, el círculo se expande antes de lanzarse contra el jugador.

Bueno, no he vuelto a saltarme vídeos del tutorial de la granja. He visto la idea en mi cabeza y he tenido que plasmarla.

Considero que el código es muy mejorable, pero he preferido centrarme en tener una versión funcional que sirva como punto de partida para seguir iterando y construir algo más complejo en el futuro.

Hay contenido reciclado de la Página 208: Apuntes de "Tutorial de proyectiles de Godot 4", recomiendo ver el video.

https://apuntesgodot.blogspot.com/2026/06/pagina-208-apuntes-de-tutorial-de.html 


Antes de empezar con las capturas, quiero explicar como funciona de forma resumida el disparo radial.

 1) El enemigo genera un círculo de proyectiles a su alrededor.

 2) Las balas se alejan del centro, expandiendo el círculo.

3) Una vez completada la expansión, las balas cambian de comportamiento y se lanzan contra el jugador.

  

Ahora si, empezamos creando la escena del jugador, Player(CharacterBody2D).

No tiene ningún misterio: solo he implementado la opción de que la imagen se invierta horizontalmente cuando el personaje se mueve hacia la izquierda o la derecha.

  

  

Creamos ahora la escena de la bala, Bullet (CharacterBody2D).

De esta escena voy a comentar los timers CambiarPatrón TiempoDeVida.

CambiarPatrón controla el tiempo que las balas permanecerán expandiendo el círculo antes de cambiar a la fase de persecución. 

TiempoDeVida define cuánto tiempo permanecerá la bala en escena. Su objetivo es evitar que se acumulen demasiados proyectiles, una solución rápida y sencilla de implementar, aunque probablemente no sea la más adecuada a largo plazo. 

 

Adjuntamos script.

Cosas a comentar: la función encenderProyectil()  y la variable encedido sirven para evitar que los proyectiles salgan disparados nada más entrar en escena. Al encenderlos, activamos el temporizador que iniciará el modo persecución de los proyectiles y dará paso a la función cambiarPatron().  

Lo interesante de esta función es reparent(get_tree().current_scene, true), que sirve para sacar las balas de la escena del enemigo. Mientras el patrón se está formando, nos interesa que las balas se muevan junto al enemigo; sin embargo, una vez comienza el ataque, ya no queremos que sigan desplazándose al ritmo de este.

Tras separar las balas de la escena del enemigo, activamos enemigo_fijado durante un tiempo determinado para que los proyectiles persigan temporalmente al jugador.

No nos interesa que las balas sigan al jugador de forma permanente, así que, cuando enemigo_fijado se desactiva, los proyectiles conservan la última dirección recibida en la función actualizar_direccion(). 

 

Finalmente, creamos la escena de Enemy(CharacterBody2D).

De aqui comento que Contenedor (Node)

 

Adjuntamos el script. 

 

Como un extra, que use para calcular distancias, aunque en el proceso no caí que Godot ya tiene herramientas para hacer lo mismo.

En este script, mide la distancia del objetivo que le pongas y el puntero del ratón. 

   


Siempre me ha llamado la atención que muchos tutoriales de bullet hell se centren en disparar sobre un eje que gira constantemente, en lugar de crear patrones de disparo más elaborados. Es una técnica útil, pero no representa todo lo que el género puede ofrecer.

Algo que he hecho casi sin darme cuenta es que este patrón también sirve para avisar al jugador de que se aproxima una tanda de proyectiles. Yo simplemente lo repliqué porque me parecía visualmente espectacular. 


No hay comentarios:

Publicar un comentario