Creando Rooms en nuestros juegos
¿Qué es un room en Game Maker? Una room o habitación es el espacio donde ocurre toda la acción en nuestros juegos. En esa room colocamos nuestros instancias de los objetos que hemos definido y, al ejecutar nuestro juego, empezarán a generar los eventos que hemos programado. Como mínimo debemos de tener una room en nuestro proyecto, pero podemos tener muchas más que definen cosas muy diferenteS: niveles de nuestro juego, menús de inicio, de pausa, etc. Cuando añadimos/editamos una room de nuestro árbol de recursos, nos aparecerá una ventana como ésta:
Vemos que la mayor parte del editor de rooms lo ocupa la visualización de como queda la room, donde colocamos objetos, fondos completos o también tiles, pero tenemos varias opciones también: botones, pestañas y una barra de información para ayudarnos a configurar la room de nuestro juego.
Barra de herramientas del editor de rooms
En la parte superior podemos encontrar una barra de herramientas con varios botones. Estos botones hacen diferentes acciones que vamos a explicar a continuación:
- Confirmar: guardamos los cambios y cierra la ventana del editor de rooms. Al hacer esto no veremos ninguna ventana de confirmación, no como en otras ventanas, así que tenemos que tener especial cuidado al hacerlo. Pero si podemos configurar una cosa (lo vimos en las Preferencias globales (enlace del programa) y es que si queremos que nos pregunte si eliminamos todas las instancias que hay fuera de la habitación o no. Dependiendo de cómo hemos añadido esas instancias nos puede interesar que se borren o no.
- Deshacer: podemos deshacer ÚNICAMENTE la última acción que hemos hecho.
- Acciones de instancia: estos botones nos permite cambiar algunos valores de las propiedades de las instancias (y de los tiles si estamos en la pestaña adecuada). Podemos eliminar todas las instancias que tenemos en la room (para volver a empezar a colocarlas), cambiar la posición de todas las instancias al valor que le quieras dar (aparece una ventana) y bloquear o desbloquear instancias (de esta manera nos aseguramos que no se moverán accidentalmente del lugar dónde se han colocado).
- Grid o rejilla: podemos decir el ancho y alto de la grid que se muestra en la room, para facilitarnos cuando colocamos objetos.
- Tipo de grid: si queremos una rejilla 2D normal o isométrica.
- Opciones de visualización: se abrirá un menú con todas las opciones que podemos activar o desactivar para mostrar mientras editamos la room: objetos, objetos invisibles, objetos sin sprites, fondos, tiles, etc.
- Opciones de zoom: tenemos tres botones para ampliar, reducir o dejar el zoom a tamaño real.
- Orden de instancias: nos abrirá una ventana donde podemos cambiar el orden de las instancias que hemos colocado. Muy importante para la activación de algunos parámetros o la creación de variables globales.
- Información de accesos directos: se nos abre una ventana con la información de las acciones directas relacionadas con el editor de room. Sabremos cómo añadir objetos, seleccionar varios, eliminarlos, alinearlos al grid, etc. combinando el ratón con algunas teclas. Si no tenemos muy claro como funciona la edición, siempre podemos tener esta ventana activa.
Minimapa
Si queremos ver como va quedando nuestra room, tenemos una representación pequeña del tamaño total de la room. Así podemos movernos por toda la room rápidamente, da igual el tamaño de la room o si le hemos aplicado un zoom grande o pequeño, simplemente situándonos en el minimapa y moviéndonos en él.
Barra de información
En la parte de abajo podremos ver información adicional cuando colocamos objetos o tiles en la room. Podemos ver la posición actual del ratón, parap oder situarnos, el número de instancia cuando nos colocamos por encima del ratón, y si una instancia tiene código personalizado.
Las pestañas del editor
A la izquierda vemos un grupo de seis pestañas para configurar diferentes aspectos. Vamos a verlos a continuación.
Ajustes
En la pesaña de Ajustes vemos la configuración básica de la room. Las opciones que podemos cambiar son:
- Nombre: el nombre de la room es su identificador único, es decir, tendrá un nombre que no podrá repetirse en todo el proyecto. De esta manera podemos saber que nos referimos a este recurso. Lo habitual es llamarlo room_ + un nombre. Este nombre lo podemos usar en los objetos, ya sea por código GML o las acciones relacionadas que ya hemos visto.
- Ancho y alto: es el tamaño total de la room. Es importante optimizar el tamaño de la room, ya que hacer rooms grandes implican un gran consumo de recursos. Por ejemplo, pensemos en un juego de naves espaciales, quizás creemos que necesitamos una room enorme. Pero no es necesario hacerlo de esta manera, con que lo programemos correctamente será suficiente. Ya veremos un ejemplo en próximos posts.
- Velocidad: La velocidad de la room son el número de pasos por segundo que ejecutará Game Maker Studio. La velocidad no tiene nada que ver que los fps, frames por segundo, que suelen tener un valor diferente. La velocidad es un valor constante donde Game Maker la utiliza para generar los eventos y las acciones, como puede ser el movimiento de los sprites, y los fps es la velocidad real de tu juego. El valor habitual es 30, a veces se puede poner el doble, y raramente se suele poner más de ese valor. Todo dependerá del tamaño de las rooms, las instancias que contiene y si el código de los objetos suponen mucho coste de procesador, ya que mayor velocidad implicrá reducir los frames por segundo. Lo dicho, no se suele cambiar su valor de 30, pero se puede valorar aumentarlo si hemos valorado sus opciones.
- Persistente: normalmente, al entrar en una room, nos la encontramos con sus valores iniciales, tal y como la hemos diseñado. Eso significa que si hemos diseñado un juego donde se sale de una room y queremos volver a entrar, se pierde tal y como está el juego. Si queremos mantener esos valores, dónde están las instancias en ese momento, como puede ser en un juego RPG, debemos marcar el check de Persistent. Cuando se vuelve a esa room, se recordará el estado tal y como se dejó. Recordemos que los objetos también pueden ser persistentes, eso significa que se mantendrán cuando cambiemos de una room a otra.
- Orden de instancias: para controlar que un objeto se cree antes que otro, se necesita saber en qué orden se van a crear las instancias. Con el botón que vemos en esta pestaña podemos seleccionar cada un a de las incluidas en la room y cambiar su orden de creación. En la lista que vemos, las que estén más arriba se crearán antes de las que están más abajo. Si un objeto crea nuevas instancias en su evento Create, éstas se ejecutarán inmediatamente antes del siguiente de la lista. Además de cambiar el orden, desde aquí podemos editar el objeto relacionado, eliminar la instancia o añadirle código de creación a esa instancia en concreto.
Fondos
Dentro de esta pestaña podemos configurar el fondo de la room. El fondo puede ser un color, una imagen o una combinación de una imagen con zonas transparentes y un color. Las opciones son:
- Dibujar color de fondo. Activamos esta opción para que dibuje un color. El color lo podemos seleccionar o cambiar un poco más abajo. Vemos que podemos elegir una serie de colores predefinidos o personalizarlo al gusto. El color de fondo lo solemos utilizar cuando no tenemos imagen de fondo que cubra toda la room, así que si tenemos claro que no es necesario activarlo lo desmarcamos y nos ahorramos tiempo de proceso.
- Número de fondos. Debajo de la selección de color, tenemos una lista de hasta 8 fondos numerados. Ninguno de estos está activo, así que hay que definirlos para poderlos mostrar. Por ejemplo, seleccionamos Background 0 y todas las opciones que aparecen abajo se refiere al elemento seleccionado. Veamos esas opciones.
- Visible when room starts. Decidimos si el fondo será visible o no al arrancar esa room. Lo habitual es definir un fondo visible, pero nos puede interesar configurar otro y activarlo más tarde, con los dos fondos a la vez o intercambiarlos. Si tuviéramos fondos con zonas transparentes podríamos tener activos varios fondos a la vez.
- Foreground image. Lo habitual es que el fondo se sitúa por detrás de todos los elementos, pero es posible que nos interese que se sitúe en primer plano, por encima de las instancias.
- Background select. En esta opción aparecerá una lista de todos los fondos disponibles en el árbol de recursos y seleccionar uno de ellos.
- Tile Hor. y Tile Vert. Es para aplicar un mosaico del fondo, es decir, repetirá el fondo seleccionado horizontal o verticalmente hasta el infinito. Vemos que podemos elegir la posición X/Y desde dónde empieza la repetición.
- Stretch. Con esta casilla elegimos extender la imagen de fondo a todo el alto y ancho de la habitación. Dependiendo del tamaño de la imagen respecto a la room, es posible que se distorsione al cambiar su ratio.
- Horizontal y Vertical speed. ¿Como hacer que el fondo se mueva en Game Maker? ¡Cambiando estos valores! Poniendo valores positivos haremos que se desplace hacia la derecha, y con valores negativos hacia la izquierda. Con la velocidad vertical será idéntico, pero arriba y abajo. La velocidad se calcula por píxeles por paso, así que no puede tener valores con decimales. Esta opción es muy interesante si la combinamos con tiles o baldosas, ya que daremos la sensación de habitación infinita gracias al movimiento del fondo.
Objetos
La pestaña de objetos sirve para seleccionar un objeto del árbol de recursos y colocar sus instancias en la room. Primero elegimos el objeto de la lista seleccionable, una vez seleccionado veremos una previsualización de su sprite asociado. Colocaremos las instancias en el área más grande de la ventana, con el botón izquierdo del ratón. Si el objeto no tiene sprite no se verá la previsualización, pero al añadir la instancia veremos un icono que nos servirá de referencia.
- Propiedades de la instancia. Una vez colocada la instancia, podremos ver una serie de propiedades que nos permitirá personalizar únicamente esa instancia. Vamos a ver:
- ScaleX: Nos permite cambiar la escala o tamaño en el eje x del objeto. Un valor de 1 es por defecto, podemos ampliar ese valor o incluso usar negativos para hacer un efecto de espejo.
- ScaleY: Cambiamos la escala en el eje y del objeto. También podemos voltear la instancia con valores negativos.
- Rotation: gira la instancia respecto su origen X/Y. Su valor se mide en grados.
- Alpha: para medir su transparencia, con valor entre 0 y 255, siendo 255 totalmente opaco y 0 totalmente transparente.
- Colour: con un valor predeterminado de blanco, dejará la instancia tal cual, pero con cualquier otro valor la coloreará mezclandolo con el sprite asignado.
- Flip X: Hará un efecto de espejo, que es lo mismo que hemos comentado con ScaleX al poner un valor de -1.
- Flip Y: Igual que la anterior, pero volteándolo verticalmente.
También podemos cambiar los valores de escalado de una instancia haciendo click en ello y arrastrando una de las esquinas del recuadro que aparece.
- Check Delete Underlying: cuando colocamos instancias en la room, es posible que estén una encima de las otras, poniendo en la parte superior la última. Si no nos interesa que se haga así, marcando esta opción eliminaremos las instancias que están en la misma posición. Para saber si una instancia está encima de otra se mirará si colisionan sus máscaras.
- Shortcuts: en la parte inferior de la pestaña vemos los atajos que podemos combinar con el ratón y el teclado para hacerlo todo más fácil. Vemos que podemos alinear a la grid, usar la selección múltiple, acercar o alejar con la rueda del ratón…
Tiles o baldosas
Ya hablamos de los Tiles cuando comentamos cómo funcionan los fondos en Game Maker. Ahora vamos a ver cómo lo aplicamos a nuestro juego.
En esta pestaña vemos como trabajan los tiles. Antes de nada, hay que elegir un fondo que hemos preparado para que funcione con baldosas, marcando el check Use as tile set, y nos aparecerá la previsualización del fondo en la misma pestaña, con un cuadrado o rectángulo marcado. Si hacemos click en la imagen, vemos que el cuadrado cambiará dependiendo de la zona donde pulsamos, que es como hemos definido los tiles en el fondo (altura, anchura, separación, etc). Una vez elegida la zona que nos interesa, ya podemos colocarlo en la room, dónde dibujará ese trozo de fondo que tiene marcado. Si ya existen azulejos en la room en el mismo lugar donde lo colocamos, se eliminarán de forma permanente, a no ser que desmarquemos el check Delete underlying.
Podemos colocar tiles con el botón izquierdo del ratón, y eliminarlas con el derecho, pero también existen algunas combinaciones del teclado que podemos usar.
- Con la tecla <Mayus>, añadirá azulejos uno detrás de otro.
- Con la tecla <Ctrl>, moveríamos una baldosa a una nueva posición.
- Con la tecla <Alt>, para cambiar temporalmente el ajuste a la grid definida en la room.
Si tenemos la tecla <Ctrl> y pulsamos el botón derecho, aparece un menú con estas opciones:
- Eliminar: elimina el tile actual en la profundidad actual.
- Borrar todo: elimina todos los azulejos que se encuentran en esa posición, da igual la profundidad.
- Propiedades de tile: abrirá una ventana para cambiar algunas propiedades al igual que un sprite, como la escala, rotación, mezcla de color, alfa, etc.
- Cambiar posición: aparece una ventana para escribir la posición X/Y, así se ajustaría de una manera más precisa.
- Ajustar a la cuadrícula: ajusta el tile con la cuadrícula definida en la room.
- Bloquear: bloquea el tile en la posición y evita que se borre. Se puede desbloquear en esta misma opción.
- Renombrar la instancia: podemos establecer un valor fijo y así usarlo para referenciarnos a él, mediante código GML.
Es posible que el tamaño que hayamos elegido para los azulejos no sea exactamente el tamaño que queramos, porque a lo mejor agrupa a varias fechas, por ejemplo. Si no queremos cambiar la configuración que tenemos en el fondo, podemos hacerlo de otra manera. En la previsualización de la pestaña, si pulsamos la tecla <Alt> y arrastramos el ratón, seleccionaremos una nueva área rectangular, que podemos colocar en la room como si fuera un tile normal. SI ese área queremos que se ajuste a la configuración predefinida, para elegir varias baldosas, lo podemos hacer con la tecla <Mayus>. También existe otra opción muy interesante: con la tecla <Ctrl> usaríamos la grid definida en la room para seleccionar el tile que queramos. Así podemos trabajar con diferentes tamaños de tiles para añadir en nuestro nivel del juego.
Hemos comentado que existe una profundidad en los azulejos, que es el número que vemos en la pestaña, informado como una capa. Podemos definir capas o diferentes profundidades, nos pone por defecto el valor 1000000, para definir una profundidad detrás de todas las instancias y objetos. Podemos añadir nuevas capas de profundidad con el botón Add, y así tener varias capas para los tiles que se puedan solapar en la misma posición. Estos valores de profundidad también influyen con los que hemos definido en los objetos. Por ejemplo, por defecto un objeto tiene un depth de 0, si creamos una capa para los tiles de -100, estos quedarían por encima de ese objeto.
Si eliminamos una capa eliminará todos los tiles añadidos con esa capa. Con el botón Change cambiamos el valor de profundidad, y si esa ya existe con tiles, se fusionarán todos.
Vistas
En esta pestaña encontramos una de las opciones más importantes a la hora de configurar nuestro juego en la room. Las views y vistas son un sistema para dibujar sólo una parte, o varias, de la room en diferentes lugares de la pantalla. También podemos mostrar sólo una parte de la room que cubre toda la pantalla, como en muchos juegos de plataformas (que además, la vista sigue al personaje principal) o los juegos de rol. En juegos de dos jugadores podemos configurar la pantalla para dividirla donde cada jugador ve su parte.
En la parte superior de la pestaña nos encontramos con varios checks de activación. El primero es para activar el uso de las vistas, podemos tenerla configurada y desactivarla o activarla cuando queramos. Después tenemos los check Clear Background with Window Colour y Clear Display Buffer with Window Colour. Se utilizan cuando tenemos varias vistas superpuestas. Si en la ventana o pantalla tenemos huecos que no cubren las vistas, lo rellenaremos con un color que definamos. Si no es así, si la view cubre toda la pantalla, entonces podemos desactivar estas opciones y ahorra a la hora de redibujar.
Debajo de estas opciones tenemos una lista de las posibles vistas disponibles, con un máximo de 8, y en la parte inferior las opciones de cada una de las vistas cuando las seleccionemos. Primero indicamos si la vista debe ser visible cuando la room empieza marcando la primera casilla (se puede activar también por programación). Si está activa aparecerá en negrita en el listado.
Cuando definimos la vista, tenemos dos grupos de valores, donde pone View in room y Port on screen. Aunque los valores de X, Y, W, H son iguales en cada grupo, se refieren a cosas diferentes. En la primera opción, definimos la vista, el área de habitación que vamos a mostrar en pantalla. en la segunda opción definimos el puerto, que es el área de la pantalla donde vamos a dibujar la visto. Veamos un ejemplo.
Podemos tener una room de 5000×3000, pero no nos interesa mostrarla completa, porque es un juedo RPG. Definimos la vista de 640×480 en la room, y establecemos el puerto a 320×240. Cuando activamos las vista podemos ver un marco en la room de como queda, con el tamaño de 640×480 vemos el trozo que mostraría. ¿Y que veremos cuando ejecutamos el juego? Pues lo veremos al tamaño que hemos definido en el port (podemos decir que es un zoom de la vista), es decir 320×240. Podríamos duplicar el tamaño de la vista en el port sin tocar el área que queremos mostrar.
Estos tamaños que hemos comentado corresponden a los valores de W (ancho) y H (altura). También podemos mover inicialmente la posición inicial de la vista con los valores X/Y.
Como ya hemos comentado, podemos tener varias vistas activas, y jugar con el port para mostrarlo. Por ejemplo, podemos tener una vista que muestra una parte de la room y otra que la muestra entera, pero con un port muy pequeño y utilizarlo de mapa. Con los valores X/Y del port podremos colocarlo donde queramos.
Para que la vista se mueva, le podemos decir un objeto de referencia, con el fin que siga ese objeto (con la vista centrada). Se puede hacer fácilmente eligiendolo de la lista en la opción Object following. Si hay varias instancias sólo elegirá una de ellas. La vista se moverá junto con el personaje, aunque podemos definir cuando empieza a moverse con los valores Hbor y Vbor. Por ejemplo, si definimos esos valores con 64, la vista no empezará a moverse y seguir al personaje hasta que éste llegue a 64 píxeles del borde de la vista.
Para finalizar, podemos indicar a qué velocidad se mueve la vista, con los valores Hsp y Vsp. Por defecto tiene un valor de -1, que significa que se mueve al instante en que se mueve el objeto seleccionado. Con un valor de 0 la vista no se moverá en absoluto, y con un valor positivo la vista seguirá al personaje con ese valor.
Física
Las opciones que nos ofrece trabajar con físicas en nuestros proyectos nos ayuda a crear más realismo a nuestros juegos. Ya hablamos brevemente de como usar la física en los objetos, ahora vamos a verlo en las rooms.
Para que las variables de física tengan efecto en la habitación, lo primero de todo es activar la primera casilla, dónde pone Room is Physics World. Ahora podemos modificar las propiedades básicas, que es la dirección de la gravedad y la fuerza que se mide en píxeles. Para los parámetros más avanzados ya usamos funciones específicas de GML, pero con estos pequeños cambios ya tenemos nuestra room preparada para el uso de physics.
Gran artículo y de gran ayuda. Ante lo que explicas, me queda una duda. Imaginamos que queremos añadir un fondo animado, sabemos que debemos hacer uso del tiles, para crear la animación debemos usar la creación del sprite.
Aqui viene mi duda, ya creado el sprite con la animación, ¿debemos de crearlo como objeto para usarlo como Tiles? porque dentro de las opciones del Background no veo en ninguna parte la manera de añadir estos sprites creados anteriormente (tampoco lo veo si los añado al grupo de objetos).
Muchas gracias por tu atención y tu gran trabajo, de alguien que está aprendiendo a través de tu web.
En realidad, desde la room estás moviendo/desplazando el fondo, es la única animación que creas. Por eso no puedes añadir sprites a las rooms.
Si quieres una animación de fondo, se me ocurre por ejemplo los que estaban en el fondo de Street Fighter, tienes que crear un sprite, un objeto con un Depth alto para que no se pise con los objetos de “jugar”, y colocarlos.
Excelente explicación. Me has ayudado mucho. Gracias
¡De nada!
Hola David. Mi pregunta es la siguiente: Si pretendo hacer un juego isométrico, basado en una batalla campal, al estilo Age of Empires ¿Cómo diseñar el terreno con relieves en la superficie?
Si estás usando objetos, podrías jugar con las variables y y depth. Entiendo qu cuanto más arriba sea el el objeto que quieres poner, su y será más pequeño y su profundidad menor. Si por ejemplo colocas los objetos con programación, o un personaje que se va moviendo, lo suyo es hacer algo así:
depth = -y;
Si lo que quieres es pintar tiles y poner tiles encima de otros, juega con las capas que puedes poner en cada tile. Creo una capa por cada fila de tiles que hagas.
Hola, tengo un problema, el cual es que cuando tengo rooms de diferentes tamaños, por ejemplo una que mide 600p x 350p y otra 1200p x 600p al momento de yo ir de la primera a la segunda con el room_goto(“y el nombre”) cambia el tamaño de la segunda a el que estaba antes, es decir, que se cambió su tamaño de 1200p x 600p a 600p x 350p, y ya intenté cambiando la altura y anchura con código pero no hace nada, como podría solucionarlo? gracias
Hola Iván,
por defecto, Game Maker coge el tamaño de la ventana de la primera room, aunque tengas rooms de diferente tamaño, la ventana no cambiará. Prueba de poner el siguiente código en un objeto que sólo esté en la segunda:
Pero piensa que si tu juego está a pantalla completa, o lo haces para dispositivos móviles, no te funcionará, porque no hay ventana que modificar.
Muchas gracias! Y si se lo que dices sobre el tamaño para dispositivos móviles, el juego que estoy creando lo pienso hacer solo para Windows, así que no creo que haya problemas, de nuevo muchas gracias! que tengas un buen día, saludos.
Hola de nuevo, probé el código que me aportaste, y si funciona, solo que se pierde resolución, creo que mejor cambiaré el tamaño de la room, es un menú de inicio, por lo que no es muy complicado hacerlo de nuevo mas grande, gracias 🙂
Claro que pierde, es la mitad de tamaño 🙂
Si todo tu juego tiene un tamaño, aunque el primero tenga un menú debería de tener la misma resolución.
saludos, exelente artículo, tengo una duda sobre las ventanas , en el windows media, existen mascaras, que son estilos para visualizar el reproductor, lo que pasa es que muchas de estas mascaras, son ventanas no cuadradas, muchas veces con contornos de dibujos, y con los botones de minimizar y cerrar en cualquier parte del dibujo, lo que quiero es saber como programar una ventana no cuadrada en game maker, muchas gracias
Pues que yo sepa, no se puede hacer, o yo no se hacerlo.
Hola David quiero hacer un juego horizontal con Sprite de 320, cree un room de 2000 x 1200 pero cuando voy a agregar el objeto del personaje me sale error. Que debo hacer?☹
Depende del error que te aparece. ¿Entiendo que arrastras el objeto correctamente?