Game Maker Studio #04 Objects
Siguiendo con las entregas sobre la utilización de Game Maker, vamos a abordar los principales elementos que permiten la creación de un videojuego sencillo. Veamos en esta entrada cómo funcionan y para qué sirven los Objects. Para ello utilizaremos como base, el juego Menjapomes mencionado en las entregas anteriores.
Los objetos son los elementos principales a través de los que podemos definir comportamientos, es decir, que la mecánica del juego está programada en función de las opciones que otorguemos a nuestros objetos.Dispondremos de objetos que recibirán movimiento, que podrán chocar con otros, o que alterarán algunos parámetros del juego como las vidas o el marcador. En definitiva, la labor de programación se realiza en este apartado a través de bloques de eventos.
Inicialmente es conveniente diferenciar entre Objeto e Instancia. Mientras que un Objeto representa el concepto y comportamiento de un elemento, cada aparición de ese objeto en pantalla recibe el nombre de Instancia y es tratado de forma independiente. De esta manera, podemos generar un Objeto «obj_ghost» que define el comportamiento de nuestros fantasmas, pero en el juego pueden existir varias Instancias de forma simultánea.
Las propiedades principales de los objetos son la Visibilidad, Solidez y Profundidad. La propiedad de Solidez nos permitirá controlar el evento de Colisión y la Profundidad es la capa en pantalla dónde podremos dibujar el sprite asociado, de manera que a valores inferiores tendremos la imagen en capas inferiores de forma que las de capas superiores tapen a la inferior si se superponen. El interfaz se compone de tres partes, la izquierda incluye la asignación de sprite y las propiedades fundamentales, al centro encontramos los eventos que se pueden desencadenar sobre el objeto, y a la derecha el conjunto de acciones ordenadas que se ejecutarán al dispararse el evento.
Como primer ejemplo, tomemos el «obj_player» que representará al jugador activo. Se ha definido el sprite que utilizará y se ha marcado la propiedad Visible y Solid. Además se han programado cuatro eventos principales asociados a las teclas de movimiento. Cada una de ellas realiza dos acciones, primero comprobar si el movimiento mantendrá al jugador en pantalla (Check VAR) y encaso favorable, desplazar el objeto 5 píxels hacia la izquierda (Jump to position) de forma relativa a la posición actual. Con eso tendremos una figura en movimiento sobre la pantalla de juego (paciencia, que en la próxima entrega abordaremos las Rooms).
El funcionamiento de monedas y manzanas es sencillo. Se crean en posiciones aleatorias del tablero (Jump to a random position) y si se produce Colisión con un objeto «obj_player» desencadenan unas acciones: efecto de sonido pertinente, aumentar marcador o vidas, destruir esta instancia de moneda o manzana, y finalemnte, generar una nueva para que el juego continúe. Esta generación vuelve a desencadenar el evento «Create» y lo situará en una posición aleatoria. Con unas sencillas órdenes tenemos un bucle de objetos interminable.
Para dificultar el avance entre niveles, hemos generado un objeto «obj_stone» que será un simple obstáculo que no se puede atravesar, de manera que el jugador y los fantasmas rebotan al chocar (Bounce against solid objects) cambiando su dirección. Hay una excepción y por ello no aparece como evento, los fantasmas rojos pueden atravesar obstáculos convirtiéndolos en enemigos más peligros e impredecibles.
Los fantasmas son los enemigos a evitar y su contacto provoca la pérdida de una vida del juugador. Como vemos se han definido diferentes eventos. En la creación se le dota de movimiento en una dirección aleatoria con una velocidad inicial. La Alarm 0 se utiliza para que cada segundo de juego cambien de trayectoria de forma aleatoria. Se define una colisión con el muro para que queden dentro de la pantalla de juego, y finalmente, se definen las propiedades en caso de tocar al jugador. Lanzamos un sonido, bajamos las vidas y seguidamente comprobamos si quedan vidas disponibles. Si el jugador mantiene vidas, el fantasma se teleporta aleatoriamente (Jump to a random position) y sigue el juego. En caso contrario se lanza un mensaje y se acaba la partida para iniciar una nueva. Cada fantasma tiene sus peculiaridades en cuanto a movimiento y velocidad, de manera que los blancos son loos más sencillos de evitar y el resto van complicando sus trayectorias y velocidades.
Finalmente nos encontramos con objetos que no representan sprites en pantalla. Son objetos utilizados para definir mecánicas o comportamientos generales del juego. De esta manera, «obj_start» se limita a inicializar los valores de marcador y vidas, mientras que en «obj_level» tenemos todas las opciones que hacen avanzar el juego. La base es sencilla, tenemos niveles en cada pantalla que van complicando al jugador con la aparición de nuevas instancias de fantasmas. A través de temporizadores lanzados por alarmas, el nivel va avanzando hasta llegar a completar los 10 niveles de cada pantalla. El evento Draw muestra textos e imágenes en pantalla y lo utilizaremos para indicar el marcador y vidas del jugador. Como vemos Alarm 1 define el avance de niveles y genera Instancias de fantasmas por pantalla, además de lanzar una acción que puede hacer aparecer a cuatro fantasmas de golpe con una posibilidad entre 6.
Estos objetos que definen las mecánicas suelen ser los que más se pueden llegar a complicar y en los que recae toda la lógica que controla la mecánica del juego. Es por ello que debemos prestar especial atención a la hora de crearlos e ir definiendo las acciones que van lanzando. En este caso hemos optado por diferenciar «start» de «level», ya que el «obj_start» se ejecutará en la primera pantalla y el resto de niveles irán acumulando los valores de marcador y vidas obtenidas por el jugador.
Los objetos definidos en el proyecto Menjapomes nos van a permitir disponer de un jugador en pantalla que se mueve a través del cursor del teclado, enemigos en forma de fantasmas que recorren la pantalla aleatoriamente y una serie de bonus a recoger para incrementar nuestro marcador. Finalmente tenemos dos objetos de estructura (muro y piedras) que nos servirán para definir los diferentes niveles e ir complicandolos de forma progresiva. La mecánica está definida en «obj_level» mientras que en «obj_start» tenemos la inicialización de las variables. ya casi tenemos el juego acabado, nos queda definir los niveles de juego a través de las habitaciones o Rooms, pero esa será otra entrega.