¿Qué significa "get to shoot em up game"?

Da Vida a tus Objetos en GameMaker

08/04/2024

Valoración: 4.32 (3088 votos)

En el fascinante mundo del desarrollo de videojuegos, hacer que los elementos en pantalla se muevan es fundamental. En GameMaker, una herramienta poderosa y flexible, tienes diversas formas de lograr que tus creaciones cobren vida. Ya sea un personaje que camina, un proyectil que vuela o un enemigo que persigue, dominar el movimiento es clave para crear experiencias interactivas y atractivas para tus jugadores.

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).

¿Cómo crear un objeto en GameMaker?
Para crear un nuevo object asset, es lo mismo que para cualquier otro asset y simplemente se hace clic con el botón derecho del ratón en en la carpeta Objects asset y se selecciona Crear (o se hace clic con el botón derecho del ratón en cualquier lugar del Navegador de Activos y se selecciona Crear Objeto).

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 Objeto es donde reside la inteligencia y el comportamiento. Piensa en un objeto como una plantilla o un plano. Defines qué puede hacer, cómo reacciona a eventos y qué propiedades tiene (como su velocidad, vida, etc.). Un objeto por sí solo no aparece en el juego.

Una Instancia es una copia real de un objeto que colocas en una Room. Es la instancia la que realmente existe en el juego y ejecuta el código definido en su objeto plantilla. Puedes tener múltiples instancias del mismo objeto, y cada una puede tener sus propias propiedades y comportamientos independientes.

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.

¿Cómo hacer que un objeto se mueva en GameMaker?
Las dos formas principales de mover una instancia son establecer la posición real o establecer un vector de velocidad/dirección , y esto se puede hacer utilizando las variables de instancia integradas o utilizando funciones de movimiento específicas.

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 Step Event.

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.

¿Puedes crear un FPS en GameMaker?
Un juego en GameMaker Studio 2 es simplemente una selección de código dentro de eventos que se ejecutan varias veces por segundo. Esto se denomina "bucle de juego", y cada bucle de juego se denomina fotograma de juego. El número de fotogramas de juego por segundo es lo que nos da el valor de fotogramas por segundo (FPS) del proyecto .

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 Colisión) para alterar el movimiento.

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.

¿Cómo hacer que un objeto se mueva en GameMaker?
Las dos formas principales de mover una instancia son establecer la posición real o establecer un vector de velocidad/dirección , y esto se puede hacer utilizando las variables de instancia integradas o utilizando funciones de movimiento específicas.

Colisiones y su Impacto en el Movimiento

Las Colisiónes ocurren cuando las máscaras de colisión de dos instancias se superponen. Puedes definir máscaras de colisión para tus sprites en el Editor de Sprites. El tamaño y forma de la máscara (rectangular, diamante, precisa) afectan cómo se detectan las colisiones. A menudo, se hace la máscara de colisión un poco más pequeña que el sprite para dar al jugador un margen de error.

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étodoVariables/Funciones ClaveCuándo UsarloVentajasDesventajas
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ónspeed, 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 Movimientomove_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 configurar speed?
x += 5; mueve la instancia 5 píxeles horizontalmente en cada Step Event. Configurar speed (y direction) hace que GameMaker calcule y actualice automáticamente las variables x e y en cada paso basándose en esos valores. Ambos logran movimiento, pero speed/direction es 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 usas move_towards_point, esta función establece direction automá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 variable speed. 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.

Subir