Sensor de ataque en GameMaker paso a paso

Resumen

Implementar un sistema de ataque en GameMaker requiere coordinar sprites, eventos de colisión y variables de control para que tu personaje pueda dañar enemigos sin generar bugs. Aquí verás cómo construir un sensor de ataque funcional para un videojuego 2D estilo Batman, paso a paso, ideal si estás dando tus primeros pasos en desarrollo de videojuegos.

Cómo se construye el sensor de ataque del personaje

El sensor es el objeto invisible que detecta cuándo tu golpe conecta con el enemigo. Sin él, presionar el botón de ataque sería puramente cosmético.

Qué sprite y objeto necesito crear

Primero creas un sprite llamado spr_batman_attack_sensor, lo centras y le das un color llamativo (fucsia funciona bien) solo para identificarlo durante el desarrollo [01:00]. Luego generas el objeto obj_player_attack_sensor y le asignas ese sprite.

En las propiedades del objeto activas las físicas, revisas el collision shape y lo marcas como sensor, porque no necesitas que empuje físicamente al enemigo, solo que detecte contacto.

¿Qué es un sensor en GameMaker? Es un objeto con físicas activadas que detecta colisiones sin aplicar fuerza física. Sirve para disparar eventos cuando algo entra en contacto, sin mover ni empujar al otro objeto.

Cómo destruyo al enemigo en la colisión

Dentro del objeto sensor agregas un evento de colisión con el enemigo. La instrucción es directa:

gml with (other) { instance_destroy(); }

Con eso, cualquier enemigo que toque el sensor desaparece de un solo golpe [02:15]. La lógica es simple: el sensor existe brevemente durante la animación de ataque y, si encuentra al enemigo, lo elimina.

Cómo conecto el sensor con el botón de ataque

El sensor debe aparecer únicamente cuando presionas la tecla J, y solo uno a la vez. Aquí entra el control de instancias mediante una variable.

Por qué necesito la variable attackSensor

En el script del personaje declaras attackSensor = noone. Esta variable evita que se generen múltiples sensores simultáneos, lo que rompería la lógica del juego. La condición queda así:

gml if (attackSensor == noone) { attackSensor = instance_create_layer(x + 30 * hDir, y, "Instances", obj_player_attack_sensor); }

El valor noone es una constante de GameMaker que indica ausencia de instancia. Solo cuando la variable está en ese estado se crea un nuevo sensor.

Cómo controlo la dirección del ataque

Para que el sensor aparezca al frente del personaje según hacia dónde mira, creas la variable hDir = 1 y la actualizas igual que xScale. Multiplicas la posición por hDir para obtener x + 30 o x - 30 dependiendo de la orientación [04:30].

Esto es clave porque sin esa variable horizontal, el sensor aparecería siempre en el mismo lado y los ataques hacia la izquierda no conectarían.

¿Para qué sirve hDir en un personaje 2D? Es una variable que guarda la dirección horizontal (1 o -1) en la que mira tu personaje. La usas para posicionar sensores, proyectiles o efectos del lado correcto.

Cómo evito bugs cuando el sensor se destruye

Aquí está el detalle que mucha gente pasa por alto: cuando el sensor se destruye, la variable attackSensor queda apuntando a un ID inexistente, no a noone. Si no lo manejas, el siguiente ataque nunca se ejecutará.

Qué hago en el evento destroy del sensor

Dentro del objeto sensor agregas el evento destroy con esta línea:

gml obj_player.attackSensor = noone;

Así, cada vez que el sensor desaparezca, ya sea por colisión o por tiempo, la variable del jugador vuelve a su estado inicial y permite crear el siguiente.

Cómo destruyo el sensor si no toca al enemigo

Si tu golpe falla, el sensor se quedaría flotando para siempre. Para evitarlo, en el evento animation end del personaje agregas:

gml if (state == attack && attackSensor != noone) { instance_destroy(attackSensor); }

Esto limpia el sensor al terminar la animación de ataque, antes de regresar al estado idle [07:20].

Cómo mejoro el feel del ataque

El primer resultado funcional suele sentirse lento o desconectado. Hay dos ajustes que cambian completamente la sensación.

El primero es recortar los frames del sprite de ataque para dejar solo el golpe contundente, el azote del bat. Eliminas los frames de preparación y wind-up que hacen ver lenta la animación.

El segundo es revisar el momento exacto del ataque en que se instancia el sensor. Idealmente quieres que aparezca en el frame donde visualmente conecta el golpe, no al iniciar el movimiento.

Finalmente, desactivas el check de visible en el objeto sensor para que el cuadro fucsia no aparezca durante el juego. El sensor sigue funcionando, solo deja de mostrarse.

Todos estos valores como el offset de 30 píxeles, la velocidad de animación o los frames recortados los puedes ajustar según el ritmo que quieras para tu juego. ¿Tienes dudas sobre cómo adaptar este sistema a tu propio personaje? Déjalas en los comentarios.