08/04/2024
En el fascinante mundo del desarrollo de videojuegos, hacer que los elementos en pantalla se muevan es fundamental. En
https://www.youtube.com/watch?v=PLjoLbN1uRJGx5FgCUhYjh5R4lj7gEUtPJ
Para entender cómo se mueve un objeto en GameMaker, primero debemos comprender algunos conceptos esenciales dentro del entorno de desarrollo. GameMaker organiza los elementos de tu juego en recursos, y los más importantes para el movimiento son los Sprites, los Objetos y las Instancias, todo esto contenido dentro de las Rooms (habitaciones).

Conceptos Fundamentales: Sprites, Objetos e Instancias
Un Sprite es básicamente la representación visual de algo en tu juego, una imagen o una secuencia de imágenes. Por sí solo, un sprite es estático.
El
Una
Las Rooms son los escenarios o niveles de tu juego donde colocas las instancias de tus objetos. El movimiento ocurre dentro de estas habitaciones.
El Corazón del Juego: El Game Loop y los Eventos
GameMaker funciona mediante un "game loop" o ciclo de juego que se ejecuta constantemente, muchas veces por segundo. Cada pasada de este ciclo se llama un "paso" o "frame". La velocidad a la que se ejecutan estos pasos se define como los Frames por Segundo (FPS) de tu juego.

Los eventos son momentos específicos dentro de este ciclo de juego donde puedes ejecutar código o acciones. Para el movimiento continuo, el evento más importante es el
El Step Event: Movimiento Continuo
El Step Event se ejecuta en cada paso del juego para cada instancia que lo tiene. Si tu juego corre a 60 FPS, el Step Event de cada instancia se ejecutará 60 veces por segundo. Esto lo convierte en el lugar ideal para colocar el código de movimiento que debe actualizarse constantemente, como mover un personaje o comprobar la entrada del jugador.
Otros eventos importantes relacionados con el ciclo de vida de una instancia incluyen:
- Create Event: Se ejecuta una sola vez cuando la instancia se crea. Ideal para inicializar variables como la posición inicial o la velocidad.
- Draw Event: Se ejecuta en cada paso para dibujar la instancia.
- Destroy Event: Se ejecuta justo antes de que una instancia sea eliminada del juego.
Métodos de Movimiento en GameMaker
Existen dos enfoques principales para hacer que una instancia se mueva en GameMaker, a menudo utilizados en combinación:
1. Modificar la Posición Directamente (Variables x e y)
Cada instancia tiene variables integradas `x` y `y` que representan su posición en la Room. `x` es la posición horizontal e `y` es la posición vertical. El origen (0, 0) de la Room está en la esquina superior izquierda. Aumentar `x` mueve la instancia hacia la derecha, disminuir `x` la mueve hacia la izquierda. Aumentar `y` mueve la instancia hacia abajo, disminuir `y` la mueve hacia arriba.
Puedes cambiar la posición de una instancia directamente en el Step Event. Por ejemplo, para mover una instancia 4 píxeles a la derecha en cada paso:
x = x + 4;
o de forma abreviada:
x += 4;
Para moverla hacia arriba, restarías de y:
y -= 4;
Movimiento Basado en Entrada del Jugador
Combinando la modificación directa de `x` e `y` con funciones que detectan la entrada del jugador (como presionar teclas), puedes crear movimiento interactivo. La función `keyboard_check()` verifica si una tecla está siendo mantenida presionada.
En el Step Event de un objeto de jugador, podrías tener código como este para moverlo con las teclas de flecha:
if (keyboard_check(vk_right)) x += 4;
if (keyboard_check(vk_left)) x -= 4;
if (keyboard_check(vk_up)) y -= 4;
if (keyboard_check(vk_down)) y += 4;
Aquí, la instancia solo modificará su posición si la tecla correspondiente está presionada.
2. Utilizar Variables de Velocidad y Dirección
GameMaker también tiene variables integradas `speed` y `direction` que definen un vector de movimiento. `speed` (velocidad) determina cuántos píxeles se mueve la instancia en cada paso, y `direction` (dirección) es un ángulo en grados (0° es derecha, 90° es arriba, 180° es izquierda, 270° es abajo, medido en sentido antihorario). Si estableces estos valores, GameMaker actualizará automáticamente las variables `x` e `y` de la instancia en cada paso basándose en ellos.

Por ejemplo, para que un objeto se mueva constantemente hacia arriba a una velocidad de 5 píxeles por paso, podrías poner esto en su Create Event (para que se configure una vez al inicio):
speed = 5;
direction = 90;
En el Step Event, GameMaker se encargaría de actualizar `x` e `y` automáticamente. Puedes cambiar `speed` y `direction` en cualquier momento (por ejemplo, en el Step Event o en un evento de
Funciones de Movimiento que Usan Velocidad/Dirección
GameMaker proporciona funciones que simplifican tareas de movimiento comunes y que internamente utilizan las variables `speed` y `direction`. Un ejemplo es `move_towards_point(target_x, target_y, spd)`. Esta función hace que la instancia se mueva desde su posición actual hacia un punto `(target_x, target_y)` a una velocidad determinada por `spd`. Esta función es útil, por ejemplo, para que un enemigo persiga al jugador.
En el Step Event de un objeto enemigo, podrías tener:
if (instance_exists(obj_player)) { // Asegúrate de que el jugador exista
move_towards_point(obj_player.x, obj_player.y, spd);
}
Aquí, `obj_player.x` y `obj_player.y` acceden a la posición de la instancia del jugador (suponiendo que solo hay una, si hay varias, necesitarías una referencia a una instancia específica). `spd` sería una variable de instancia definida en el Create Event del enemigo (por ejemplo, `spd = 1.5;`).
Añadiendo Rotación al Movimiento
El movimiento a menudo va acompañado de rotación, especialmente si el sprite debe mirar en la dirección en la que se mueve. La variable integrada `image_angle` controla el ángulo de rotación del sprite de una instancia (0° es sin rotación, rotación antihoraria). Puedes establecer `image_angle` directamente.
Para hacer que una instancia rote para apuntar hacia el puntero del ratón, puedes usar la función `point_direction(x1, y1, x2, y2)`, que devuelve el ángulo desde el punto (x1, y1) hasta el punto (x2, y2). En el Step Event:
image_angle = point_direction(x, y, mouse_x, mouse_y);
Aquí, `mouse_x` y `mouse_y` son variables globales integradas que dan la posición actual del puntero del ratón en la Room.
Si estás usando las variables `speed` y `direction`, a menudo querrás que `image_angle` coincida con `direction` para que el sprite mire en la dirección del movimiento:
image_angle = direction;
Ajustando la Velocidad General del Juego
Es importante recordar que la velocidad a la que se ejecuta el código de movimiento en el Step Event está ligada a los Frames por Segundo (FPS) del juego. Si mueves un objeto 4 píxeles por paso a 30 FPS, se moverá 120 píxeles por segundo (4 * 30). Si cambias el FPS a 60, se moverá 240 píxeles por segundo (4 * 60), pareciendo el doble de rápido. Puedes ajustar el FPS en las Opciones del Juego para que el movimiento se sienta más fluido o más rápido en general.

Colisiones y su Impacto en el Movimiento
Las
El Collision Event se activa cuando una instancia colisiona con otra de un tipo específico. Dentro de este evento, puedes escribir código para reaccionar a la colisión, lo que a menudo implica detener o alterar el movimiento de las instancias involucradas.
Por ejemplo, si una bala colisiona con un enemigo:
// En el Collision Event del objeto obj_bullet con obj_enemy
with (other) { // 'other' se refiere a la instancia de obj_enemy
hp = hp - 1; // Reduce la vida del enemigo
}
instance_destroy(); // Destruye la instancia de la bala
Aquí, la bala se destruye (deteniendo su movimiento de golpe), y la vida del enemigo se reduce, lo que podría llevar a su destrucción si `hp` llega a cero (código manejado en el Step Event del enemigo, por ejemplo, `if (hp <= 0) instance_destroy();`).
Si el jugador colisiona con un enemigo, podrías reiniciar el juego:
// En el Collision Event del objeto obj_player con obj_enemy
game_restart();
Estos ejemplos muestran cómo las colisiones no solo detectan interacciones, sino que también son puntos clave para modificar o detener el movimiento de las instancias.
Comparativa de Métodos de Movimiento
| Método | Variables/Funciones Clave | Cuándo Usarlo | Ventajas | Desventajas |
|---|---|---|---|---|
| Modificación Directa (x, y) | x, y, +=, -=, keyboard_check() | Movimiento simple, constante; Movimiento preciso basado en entrada o lógica paso a paso. | Control directo y granular; Fácil de entender para principiantes. | No maneja la inercia automáticamente; Puede requerir más lógica para movimientos complejos. |
| Velocidad y Dirección | speed, direction, move_towards_point() | Movimiento en una dirección constante; Persecución o movimiento hacia un punto; Simular física básica. | GameMaker maneja la actualización de posición automáticamente; Funciona bien con rotación automática (`image_angle = direction`). | Menos control directo sobre la posición exacta en cada paso; La dirección es un ángulo en grados (puede requerir funciones trigonométricas para cálculos avanzados). |
| Funciones de Movimiento | move_towards_point(), etc. | Tareas de movimiento comunes (perseguir, mover a un punto). | Simplifican código para tareas específicas; Integran velocidad y dirección. | Limitadas a las tareas predefinidas por la función. |
Preguntas Frecuentes sobre Movimiento
- ¿Dónde debo poner el código que hace que mi objeto se mueva?
- Generalmente, el código de movimiento continuo se coloca en el Step Event del objeto, ya que este evento se ejecuta en cada frame del juego.
- ¿Cuál es la diferencia entre usar
x += 5;y configurarspeed? x += 5;mueve la instancia 5 píxeles horizontalmente en cada Step Event. Configurarspeed(ydirection) hace que GameMaker calcule y actualice automáticamente las variablesxeyen cada paso basándose en esos valores. Ambos logran movimiento, perospeed/directiones más un enfoque basado en vectores.- ¿Cómo hago que mi objeto gire para mirar a donde se mueve?
- En el Step Event, puedes establecer
image_angle = direction;. Si usasmove_towards_point, esta función establecedirectionautomáticamente. - Mi objeto se mueve demasiado rápido o demasiado lento. ¿Cómo lo ajusto?
- Puedes cambiar el valor que sumas/restas a
x/y, o cambiar el valor de la variablespeed. También puedes ajustar la velocidad general del juego cambiando el FPS en las Opciones del Juego. - ¿Qué es la máscara de colisión y por qué es importante para el movimiento?
- La máscara de colisión es el área del sprite que GameMaker usa para detectar colisiones. Si la máscara no se ajusta bien al sprite, las colisiones pueden detectarse (o no detectarse) en momentos inesperados, afectando cómo el movimiento interactúa con otros objetos.
Dominar el movimiento es un paso emocionante y esencial en tu viaje con GameMaker. Al entender cómo funcionan los objetos, las instancias, los eventos y las variables integradas, puedes hacer que tus personajes y elementos se desplacen, giren y reaccionen de la manera que imaginas. Experimenta con los diferentes métodos y funciones para encontrar la mejor manera de dar vida a tus ideas de juego.
Si quieres conocer otros artículos parecidos a Da Vida a tus Objetos en GameMaker puedes visitar la categoría Maquillaje.
