Alarmas en GameMaker para controlar ataques

Resumen

Programar el ataque de un enemigo en GameMaker requiere algo más que detectar al jugador dentro de un rango. Necesitas un temporizador que evite que el disparo se vea como una ametralladora descontrolada, y ahí entran las alarmas, una herramienta clave para controlar intervalos de tiempo en cada objeto.

Por qué usar alarmas en lugar de disparar de inmediato

Si configuras al enemigo para que ataque en cuanto el jugador entre al círculo de detección, la animación se dispara cada frame y rompe la sensación de juego. La solución es introducir una pausa antes de cambiar al state de ataque, y eso se logra con el sistema de alarmas que GameMaker integra en cada objeto.

Cada objeto puede tener hasta 11 alarmas numeradas (de la 0 a la 10). Una alarma es básicamente una cuenta regresiva: tú defines un valor en frames, y cuando llega a cero, ejecuta el bloque de código que programaste dentro del evento de esa alarma.

¿Qué es una alarma en GameMaker? Es un evento temporizador que ejecuta código después de un número definido de frames. Cada objeto puede tener hasta 11 alarmas independientes.

Cómo se configura alarm 0 con room_speed

Dentro del state enemy_neo_idle, cuando el enemigo detecta al jugador dentro del círculo, asignas el valor de la alarma así: alarm[0] = room_speed * 3. La variable room_speed devuelve la velocidad del cuarto, que en este proyecto está a 60 frames por segundo. Multiplicarla por 3 te da exactamente 3 segundos de espera antes de atacar.

¿Qué hace room_speed en GameMaker? Devuelve los frames por segundo a los que corre la room. Si trabajas a 60 fps, room_speed * 3 equivale a 3 segundos.

Dentro del evento Alarm 0 colocas el cambio de estado: asignas state = scr_enemy_neo_attack y reseteas la animación con image_index = 0 para que el sprite arranque limpio.

Por qué necesitas un if para que la alarma funcione

Aquí está el detalle que rompe a muchos principiantes. Si dejas la línea alarm[0] = room_speed * 3 corriendo en cada frame del state idle, la alarma nunca termina. Le estás diciendo 60 veces por segundo que vuelva a empezar la cuenta de 3 segundos, así que se resetea infinitamente.

La corrección es envolver la asignación en un condicional:

  • Si alarm[0] <= 0, entonces asignas room_speed * 3.
  • Si ya está corriendo, no haces nada y dejas que termine.

De esta forma la alarma sí completa su cuenta regresiva y dispara el cambio de estado.

Cómo regresar del ataque al idle con animation end

Una vez que el enemigo entra al state de ataque, necesitas que regrese al idle cuando termine la animación. Si no programas esa transición, el enemigo se queda congelado en pose de ataque aunque te alejes del círculo.

La solución replica lo que ya hiciste con el jugador: agregas el evento Other > Animation End y dentro escribes una condición. Si state == scr_enemy_neo_attack, entonces regresas a scr_enemy_neo_idle. Así el ciclo se cierra y el enemigo puede volver a detectar, esperar 3 segundos y disparar de nuevo.

Dentro del script de ataque, por ahora basta con asignar sprite_index = spr_enemy_neo_attack para que se vea la animación correspondiente. El proyectil real lo instanciarás en la siguiente etapa.

Cómo balancear la dificultad con el intervalo de ataque

El valor que pongas en la alarma define qué tan agresivo se siente el enemigo. Tres segundos es un punto medio razonable, pero puedes ajustarlo según el ritmo que busques.

  • Intervalos cortos (1 a 2 segundos): combate intenso, exige reflejos.
  • Intervalos medios (3 a 4 segundos): equilibrio entre tensión y respiro.
  • Intervalos largos (5 segundos o más): enemigos pasivos, útil para zonas iniciales.

Esta etapa de ecualización es una de las partes más entretenidas del desarrollo, porque ahí defines la personalidad de cada enemigo y el tono general de tu videojuego.

Al probar el código verás el flujo completo: el enemigo te persigue, entras al círculo, pasan 3 segundos y dispara. Te alejas, vuelves a entrar, vuelven a pasar 3 segundos y dispara de nuevo. Cuando lo confirmes funcionando, el siguiente paso es crear el proyectil que instancia ese ataque y darle la lógica para que impacte al jugador.

¿Tienes dudas sobre cómo ajustar el valor de la alarma o cómo encadenar varios states? Déjalas en los comentarios para resolverlas.