Acciones
Hasta ahora hemos visto los eventos, que hemos dicho que son lanzados en un momento exacto para decir qué acciones queremos hacer. Y, ¿qué es una acción en Game Maker? Las acciones son la manera que tenemos de manipular nuestro juego para que haga exactamente lo que queramos. Si queremos que nuestro juego empieza con 3 vidas, se lo tenemos que decir. Si queremos que cuando pulsemos la tecla con la flecha izquierda nuestro personaje se mueva en esa dirección se lo decimos. Y así con todo lo que podamos imaginar.
Afortunadamente, con Game Maker Studio es muy fácil usar las acciones, ya que solo necesitamos elegir el evento adecuado y arrastramos la acción o acciones que nos interese. En próximos posts habrá ejemplos para ver como se usan los eventos y las acciones en diferentes casos. Ahora veremos todas las acciones que nos podemos encontrar.
- 1 Como se utilizan las acciones en Game Maker Studio
- 2 Detalle de una acción
- 3 Depurando acciones
- 4 Pestaña de acciones de movimiento
- 5 Pestaña de acciones principales – grupo 1
- 6 Pestaña de acciones principales – grupo 2
- 7 Pestaña de acciones de control
- 8 Pestaña de acciones de puntuación
- 9 Pestaña de acciones extra
- 10 Pestaña de acciones de dibujo
Como se utilizan las acciones en Game Maker Studio
Cuando hablamos de la ventana de propiedades del objeto, comenté que las acciones se sitúan en la parte derecha de la ventana, agrupadas en diferentes pestañas. Para usar una de las acciones, es tan fácil como hacer click en una de ellas y arrastrar y soltar en el evento elegido (a esto se le llama Drag&Drop, también se puede encontrar como DnD).
Existen siete pestañas de diferentes categorías que explicaremos unos párrafos más abajo. Si queremos saber qué hace cada acción, aparte de consultar la ayuda que tiene todo el detalle, colocando el ratón encima podemos tener una breve descripción. Una vez arrastrada la acción, se abrirá una ventana popup con el detalle de la acción, para poder cambiar algunos parámetros. De esta manera ya tendríamos la acción definida.
Una vez tengamos la acción relacionada con el evento, podemos editar sus parámetros haciendo doble click sobre la acción. También podemos cambiar el orden de las acciones dentro de toda la lista, mediante arrastre Drag&Drop, eliminar una o seleccionar varias acciones para arrastrarlas o copiarlas entre diferentes objetos.
Detalle de una acción
En la ventana pop-up que nos aparece en una acción concreta, tenemos una serie de información que veremos en la mayoría de todas las acciones, así que lo explicamos ahora, aunque las acciones sean diferentes. En la barra de esta ventana encontramos una pequeña descripción y un pequeño icono indicando que acción es. También aparece un cuadro con el texto Aplica a/Applies to. Nos aparecen tres opciones:
- Self: la gran mayoría de las veces se deja esta opción por defecto. Se refiere a que esa acción se aplicará al mismo objeto dónde estamos programando la acción.
- Other: cuando existe un evento de colisión, podemos saber cual es el otro objeto causante de la colisión. Da igual el otro objeto con que colisionamos, si marcamos other estamos diciendo que esa acción corresponde al otro objeto.
- Object: si nos interesa cualquier otro objeto, al marcar la opción object nos aparece un listado con todos los objetos que hemos definido. Así esa acción se definiría a todas las instancias de ese objeto que hay en la room en ese momento.
Vamos a explicarlo con un ejemplo. Imaginamos que hacemos click a una instancia de un objeto en nuestro juego. Añadimos el evento Left button. Ahora vamos a definir una acción. Queremos que al pulsar con el ratón el objeto se mueva a una dirección. Arrastramos la acción correspondiente, y dejamos marcada la opción de Self. Imaginemos que ese objeto es un botón, y queremos que se mueva otro objeto. Entonces marcaremos la opción Object, elegimos ese objeto y tendría la misma acción. Hemos programado el evento en el objeto del botón y se movería el otro objeto. Si por ejemplo ese objeto está en contacto con otro, podemos elegir la opción Other para programar el otro objeto.
Hay otra opción que encontraremos en la mayoría de las acciones, que es la casilla o check Relative. Cuando marcamos esa opción, decimos que tiene que tener en cuenta el valor que ya tiene relacionada con esa acción. Dependerá de los parámetros de cada acción, ya que podemos tener valores de X/Y, variables, etc. La mayoría de las veces sumará los valores que tiene con los que estamos informando. Por ejemplo, tenemos la acción para asignar una puntuación o Score al juego. Podemos añadir esa puntuación cuando eliminamos un enemigo. Al arrastrar la acción al evento Destroy del enemigo, podemos añadir 5 puntos. Si ponemos el valor 5 a la puntuación, le estamos diciendo que Score vale 5. Si lo que queremos es sumar esos 5 puntos, lo hacemos marcando el check Relative. Así acumulará o sumará esa puntuación a la que ya tenemos.
Depurando acciones
Imaginemos que nos da un error en nuestro juego, o simplemente hace una cosa diferente a lo que queramos que haga. Sospechamos que eso ocurre en un evento en concreto. ¿Como lo podríamos arreglar? Sin entrar en la parte donde se debuga y corrige nuestro juego, podemos adelantar en decir que existe la posibilidad de parar nuestro juego en un momento exacto. Para eso colocamos un punto de ruptura, y se parará nuestro juego justo cuando ocurra esa acción. Luego veremos la ventana de depuración con toda la información necesaria para ver dónde puede estar el fallo, pero eso ya lo veremos más adelante.
Para definir ese punto de ruptura, podemos hacerlo con el botón derecho sobre la acción o línea de código y elegir la opción Toggle Breakpoint o pulsando la tecla <F9>. Veremos que aparece un punto rojo, para saber que si ejecutamos el juego en modo depuración se detendrá en ese punto.
Si quieres ver como depurar en detalle tu luego, lee como funciona el debugger de Game Maker.
Ahora detallaremos todas las acciones que podemos usar en Game Maker Studio. Haremos un apartado por cada pestaña que nos encontramos a la derecha.
Pestaña de acciones de movimiento
En la primera pestaña encontraremos agrupadas todas las acciones relacionadas con el movimiento y la posición de las instancias en la habitación/room. Vemos que está agrupado en tres secciones: movimiento/move, salto/jump, rutas/paths y steps/pasos.
- Movimiento fijo o Moved fixed. Utilizamos esta acción para que una instancia empiece a moverse en una dirección particular. Podemos indicar la dirección mediante uno de los botones de flecha que vemos (hay 8 direcciones). Si queremos detener el movimiento, podemos usar el botón central. Para especificar la velocidad en que se mueve, podemos definirlo en la propiedad Speed. Su valor es el número de píxeles por paso. Aunque es posible usar velocidades negativas, para decir que vamos en sentido contrario, no es necesario. Podemos especificar varias direcciones. Por ejemplo, si marcamos la flecha izquierda y la flecha derecha, Game Maker utilizará al azar una o la otra. El check Relative aumentaría la velocidad que ya lleva. Por ejemplo, si se está moviendo hacia la izquierda a una velocidad de 4 y ponemos esta acción cuando choque con la pared, si marcamos Speed 1 hacia la derecha con el check marcado, iría en esa dirección con una velocidad de 5.
- Movimiento libre o Move free. Con esta acción también indicamos cómo queremos el movimiento, pero en vez de ofrecer 8 direcciones, puede ser en cualquier dirección. Para eso tenemos la propiedad direction, que es un ángulo entre 0 y 360 grados. Por ejemplo, con un valor de 0 se movería a la derecha, con 90 hacia arriba, con 180 a la izquierda, con 270 hacia abajo, etc… Podemos coger cualquier valor para marcar esa dirección como queramos. A partir de 360 volvería a coger como si fuera el valor 0. El check Relative añadiría movimiento al que ya tiene. Por ejemplo, si estamos moviéndonos hacia arriba y añadimos esta acción hacia la izquierda, nos moveremos arriba hacia la izquierda.
TRUCO: si ponemos en direction
random(360)
, se moverá en una dirección arbitraria. Más adelante veremos que ponerrandom(360)
nos devolverá un valor entre 0 y 359. - Moverse hacia o Move Towards. También podemos especificar que una instancia se mueva hacia un punto en concreto. Esa posición la definimos con la propiedad X e Y. Al marcar una velocidad, la instancia empezará a moverse hacia allí, pero ¡cuidado! No significa que se pare allí, sino que una vez llegue a la posición continuará en la misma dirección. El check Relative es para los valores X/Y, pero no para la velocidad.
TRUCO: en los valores X/Y, podríamos poner la posición de un objeto. Por ejemplo, imaginemos que creamos un objeto bala y queremos que vaya hacia un enemigo. Podemos poner en X
obj_enemigo.x
y en Yobj_enemigo.y
. - Velocidad horizontal o Speed horizontal. La velocidad de un objeto puede ser horizontal o vertical. Con esta acción simplemente le indicamos que se moverá hacia la derecha a esa velocidad. Si le indicamos un valor negativo se moverá hacia la izquierda. Si tuviera velocidad vertical no variaría. Con el check Relative aumentaríamos o reduciríamos esa velocidad.
Como vemos, tenemos varias acciones que pueden hacer lo mismo. Podemos usar una u otra, nos servirá para que visualmente nos resulte más cómodo trabajar.
- Velocidad vertical o Speed Vertical. Lo mismo que la anterior, pero podemos cambiar la velocidad vertical.
- Dar Gravedad o Set Gravity. Con esta acción le damos a un objeto una gravedad. Vemos que podemos indicar una dirección, que es un valor en grados de 0 a 360 (¡la gravedad puede ser en cualquier dirección!), y una velocidad. La diferencia entre gravedad y velocidad es que con la gravedad, aumentamos la velocidad EN CADA PASO. Normalmente se pone un valor muy pequeño, lo habitual sería un valor por debajo de 1 (0.8 por ejemplo).
TRUCO: la gravedad se la asignamos a un objeto. Eso significa que podemos tener varios objetos con distinta gravedad y dirección. ¡Esto no es la vida real!
- Horizontal inverso o Reverse Horizontal. Con esta acción inviertes el movimiento horizontal de una instancia. Muy útil si queremos que un objeto rebote. Vemos que no tiene propiedades para modificar, ya que coge el valor que ya tiene.
- Vertical inverso o Reverse Vertical. Lo mismo que lo anterior, pero con la velocidad vertical.
- Dar roce o Set Friction. Con esta acción ralentizamos el movimiento de la instancia. Así, en cada paso, reducimos velocidad hasta que llegue a 0. Al igual que la gravedad, se suele poner un valor muy pequeño.
- Saltar a una posición o Jump to Position. Al usar esta acción, colocamos la instancia a una posición particular. Colocamos los valores X/Y y la referencia de posición del objeto cambiará. Con la casilla Relative podemos incrementar su valor en la posición.
Esta acción es la habitual para movimiento. Mientras está pulsada una tecla, lo detectará en cada paso y con el check Relative cambiará su posición poco a poco.
- Ir al inicio o Jump to Start. Un objeto siempre guarda su posición donde se ha colocado en el editor de rooms o dónde se ha creado. Con esta acción volvería a su posición inicial.
- Ir a un sitio aleatorio o Jump to Random. Esta acción mueve una instancia a un lugar aleatorio de la room. Siempre se colocará en un lugar donde no exista ningún objeto sólido. Las propiedades que aparecen snap hor. y snap. vert se utilizan para alinearse a una cuadrícula. Por ejemplo, si todos nuestros objetos tienen un tamaño de 32×32 píxeles, paredes, enemigos, etc, pondríamos el valor de 32 en snap para que se coloque correctamente en nuestra room. Todo esto significa que los valores de X/Y nuevos serán múltiplos de 32 (0, 32, 64, 96, 128, etc).
- Alinear a la cuadrícula o Align to Grid. Al igual que hemos comentado en la acción anterior, con esta acción alineamos una instancia a una cuadrícula. Es muy útil si nos interesa asegurarnos que todo esté en la cuadrícula.
- Volver a la pantalla o Wrap Screen. Con esta acción podemos decir a una instancia que cuando salga de un lado de la room aparezca por el otro lado. Por lógica, se suele usar con el evento de Salir de la room o Outside Room. Para que vuelva a la room tiene que tener ya una velocidad el objeto (no valdría colocarlo en un X/Y directamente). Podemos elegir valores para que se base en la dirección horizontal, vertical o ambos.
- Mover hasta contacto o Move to Contact. Esta acción se utiliza para mover una instancia hasta que choque o colisione con un objeto. Le indicamos la dirección para moverse y se colocara justo antes de la colisión (no se ejecutará el evento). Si se encuentra en colisión cuando llamamos a esta acción no se hará. Podemos indicar si afecta hasta que se encuentre un objeto sólido o cualquier objeto. También podemos indicar en la propiedad maximum cual es la distancia máxima que recorrería hasta que se encuentre el objeto.
Esta acción se suele utilizar en juegos de plataforma. Si ha saltado y está en el aire, le indicamos esta acción hasta que toque un objeto que haga de suelo.
- Rebote o Bounce. Al poner esta acción en caso de una colisión con algún objeto, la instancia rebota de forma natural. El parámetro precise lo ponemos a falso para que solo tenga en cuenta paredes horizontales y verticales. Si marcamos para que el rebote sea preciso también tendrá en cuenta la inclinación y paredes curvas. Este parámetro existe para que el tratamiento de colisiones se haga más rápido o no, depende de lo que marquemos. También podemos marcar si afecta solo contra objetos sólidos o cualquier objeto.
- Asignar ruta o Set Path. Cuando hemos creado una ruta, podemos decir con esta acción que la instancia seguirá ese camino en particular. Indicaremos el path a seguir y su velocidad. Si la velocidad es positiva empieza al inicio de su trayectoria, si es negativa, empieza desde el final. El parámetro at end indica su comportamiento cuando llega al final del camino, donde podemos elegir si nos detenemos o reinicia desde el principio. Aunque la ruta sea cerrada, tiene su inicio y su fin y se pararía en el último punto. El parámetro Relative es para indicar si la ruta que hemos pintado debe ser absoluto, que haría la ruta tal y como se ha definido en la room, o relativo, que hace el camino a partir de la posición actual de la instancia.
- Fin de la ruta o End Path. Utilizaremos esta acción para que la instancia que está haciendo un camino se detenga.
- Posición de la ruta o Path Position. Con esta acción cambiamos la posición actual de la ruta. El valor 0 es del principio de la ruta y el valor 1 es del final. Por lo tanto, da igual que la ruta sea grande o pequeña, ya que un valor de 0.5 indica que estamos justo en mitad del camino.
- Velocidad de la ruta o Path Speed. Usamos esta acción para cambiar la velocidad de la instancia en la ruta. Si tiene una velocidad negativa haría el camino hacia atrás. Con un valor de 0 podríamos detener temporalmente su movimiento.
- Pasos hacia o Step Towards. Con esta acción indicamos una posición y una velocidad y la instancia empezará a moverse, a la velocidad y posición marcada. Podemos asignar un tipo de objeto, sólidos o todos, y así los intentaría evitar. Esta acción es muy útil para asignar una IA (inteligencia artificial) sencilla. Si marcamos el check Relative, indicamos que la posición X/Y que ponemos se le añadirá a la posición actual de la instancia. El check no afecta a la velocidad.
Pestaña de acciones principales – grupo 1
En esta pestaña están agrupadas todas las acciones relacionadas con objetos/instancias, sprites, sonidos y rooms. Veamos cada uno de ellos.
- Crear instancia o Create instance. Con esta acción creamos una instancia de un objeto. Se especifica el nombre del objeto creado y la posición inicial.Como esto lo creamos desde un objeto, con el check Relative tendría en cuenta la posición de dicho objeto para sumar a la posición del objeto nuevo. Una vez creada la instancia se ejecutará su evento Create.
Crear instancias durante el juego es muy útil, ya que implica que no tenemos que dibujarlas en la room desde un principio. Por ejemplo, un arma puede crear balas, una bomba una explosión, etc. También habrá objetos que llamamos controladores que pueden crear enemigos u otros objetos.
- Crear con movimiento o Create moving. Funciona igual que la anterior, pero tendremos además las propiedades la velocidad y la dirección inicial de la instancia nueva. La casilla Relative solo son para aumentar en la posición, no en la velocidad y dirección.
Por ejemplo, tenemos un objeto arma
obj_gun
. Cuando pulsamos una tecla disparará una bala, por lo que usamos esta acción. Podemos marcar el check Relative y la posición X/Y como 0, así cogerá la posición del arma. ¿Qué dirección debe usar la bala? Para usar la dirección del arma, podemos escribir direction en vez de poner un número. Así cogerá el valor del objetoobj_gun
. Direction es una variable del objeto, que ya hablaremos en el apartado correspondiente. - Crear aleatoriamente o Create Random. Podemos añadir hasta 4 objetos para que cree al azar uno de ellos en la posición que le digamos. La casilla Relative es solamente para la posición, al igual que la anterior.
Muy útil para crear enemigos aleatorios o, por ejemplo, piezas del Tetris.
- Cambiar instancia o Change Instance. Podemos cambiar la instancia actual por la de cualquier otro objeto. Por ejemplo, podemos lanzar una bomba que al tocar un objeto explote. La animación de explotar podría ser otro objeto. Se utiliza porque los valores de movimiento y variables son iguales. En la propiedad perform events podemos marcar si se activaría el evento Destroy del objeto actual y el evento Create del nuevo objeto.
- Destruir instancia o Destroy instance. Eliminamos la instancia actual. Se ejecutará siempre el evento Destroy. Ya comentamos que cambiar de una room a otra no ejecuta el evento, solo en esta acción, y si un objeto sale de la room es posible que tengamos que valorar destruirlo.
- Eliminar desde una posición o Destroy at position. Con esta acción eliminamos las instancias dentro de un cuadro delimitado. Útil para asignar un área de una bomba.
- Cambiar sprite o Change sprite. Esta acción cambia el sprite de una instancia, indicando un nuevo sprite. También se puede indicar la subimagen que mostraría, lo habitual es poner un 0 porque sería la primera, o un valor específico. Con un valor de -1 usaría el mismo número que está utilizando en ese momento. También podemos elegir la velocidad de animación. Si no queremos asignar una velocidad, podemos poner su valor a 0 y se mostrará la subimagen que hemos definido. No se puede usar una velocidad negativa. Con un valor de 1 usará la velocidad estándar y mostrará todas las subimágenes, si es mayor saltará subimágenes para dar sensación de más velocidad.
Si tenemos un personaje que se mueva en varias direcciones, es posible que muestre un sprite diferente si se mueve arriba o hacia la izquierda, así que lo habitual es que en los eventos de teclado asignemos una dirección de movimiento y un sprite específico.
- Transformar sprite o Transform sprite. Podemos cambiar los valores del sprite de la instancia. Los valores xscale-yscale se utilizan para cambiar el tamaño del sprite. Si queremos duplicar su tamaño, pondremos un valor de 2 a las dos propiedades, si queremos la mitad, podemos poner 0.5. También podemos poner valores diferentes para “deformar” el sprite. También tenemos un ángulo de orientación, que marcamos en grados y se haría en referencia a si valor X/Y. Por ejemplo, imaginamos que tenemos un coche visto desde arriba, y nos interesa que el sprite gire dependiendo de la dirección que tenga. Aprovechamos la variable direction para usarla en la propiedad angle y el sprite girará en el mismo sentido. También podemos aplicar un efecto espejo al sprite, tanto horizontal como verticalmente. Por ejemplo, en un juego de plataformas, podríamos tener un sprite que mire a la izquierda y otro sprite que mire hacia la derecha. Pero también podemos usar sólo uno y usar esta acción para girarlo con efecto espejo, partiendo que su posición X/Y esté justo en el centro.
- Color del sprite o color sprite. Normalmente el sprite se dibuja tal y como se define. Pero con esta acción podemos colorear el sprite, mezclándolo con la imagen que tengamos. Si queremos dibujar un sprite en diferentes colores, podemos crear uno en blanco y negro y colorearlo con esta acción. También tenemos una propiedad de transparencia o alpha, para indicar si el sprite es totalmente opaco, valor 1, o totalmente transparente, valor 0.
- Reproducir sonido o Play Sound. Con esta acción podemos usar uno de los recursos de Game Maker, los sonidos, para reproducirlos. Podemos elegir si queremos que se escuche sólo una vez, opción por defecto, o en un loop constante (infinitamente). La opción de loop es típica para música de fondo, y sin loop es para los típicos efectos. Pueden escucharse varios sonidos a la vez.
- Detener sonido o Stop Sound. Esta acción detendrá el sonido indicado. Si hay varios objetos ejecutando ese sonido, los detendrá en todos.
- Comprobar sonido o Check Sound. Aquí encontramos la primera acción que condicionan otras acciones. Al chequear si un sonido se está ejecutando, llevará al cabo la siguiente acción (la que se encuentre debajo). Si no es así, no hará la acción de debajo. El check not es para indicar que la acción se ejecutará si el sonido NO se está ejecutando. Por ejemplo, podemos comprobar si si está escuchando una música de fondo. Si no se está reproduciendo (con check not marcado), podemos decir la siguiente acción sí que reproduzca el audio.
- Habitación anterior o Previous room. Empezamos a movernos entre habitaciones/rooms. Con esta acción nos moveremos a la habitación anterior de la lista que tenemos en el árbol de recursos. ¿Qué pasa si estamos en la primera room de todas y llamamos a esta acción? Pues que obtendremos un error.
- Habitación siguiente o next room. Lo mismo que la anterior, pero nos movemos a la habitación siguiente. Si estamos en la última habitación del árbol de recursos y ejecutamos esta acción, saltará un error.
- Reiniciar habitación o Restart Room. Reiniciará la habitación actual. Si las instancias se han eliminado o movido se obviará, todo volverá a como lo hemos definido inicialmente.
- Habitación diferente o Different room. Si no queremos movernos con las acciones de Previous room o Next room, podemos elegir esta acción especificando la room que queremos movernos.
- Comprobar habitación anterior o Check Previous. Para poder evitar movernos a una room anterior que no existe, y así no da error, podemos poner esta acción para que la siguiente se ejecute correctamente.
- Comprobar habitación diferente o Check Next. Lo mismo que la anterior pero gestionando la room siguiente.
Pestaña de acciones principales – grupo 2
En esta pestaña nos encontramos con las acciones principales relacionadas con temas de tiempo/timing, información/info, juego/game y recursos/resources.
- Activar alarma o Set Alarm. Ya hablamos en su momento del evento de alarma, que podíamos tener hasta 12 alarmas diferentes. Con esta acción podemos establecer estas alarmas, diciendo cual es la que nos interesa, y el número de steps o pasos en que se ejecutará el evento programado. También tenemos la casilla Relative para incrementar o disminuir los pasos que ya tenga asignados. Si no tenemos ningún evento asociado, la alarma no se ejecutará. Pero si tenemos el evento creado y no tenemos ninguna acción o código (lo habitual es poner algún comentario), la alarma hará la cuenta regresiva de los pasos igualmente (puede ser útil para controlar según que cosas). Si queremos desactivar la alarma para que no salte, podemos poner en número de pasos un valor igual o más pequeño que cero.
- Asignar Timeline o Set Time Line. Con esta acción establecemos un timeline a una instancia. Indicaremos el timeline que hemos creado, nos aparece una lista con los que detecta, la posición con la que queremos empezar (0 es la primera posición), si empieza inmediatamente o no, y si cuando llega al final vuelve al principio o no. Un ejemplo de timeline sería programar una oleada de enemigos para que aparezcan en cada momento que le digamos nosotros.
- Posición de Timeline o Time Line Position. Con esta acción cambiamos de posición a un timeline que ya hemos asignado. Esa posición puede ser Relativa o no. De esta manera podemos saltar a ciertas partes de la línea del tiempo, como también repetir algunas secuencias.
- Velocidad en Timeline o Time Line Speed. Al igual que con la posición, esta acción cambiaría la velocidad del timeline. Un valor de 1 es la velocidad normal, si queremos duplicarlo le pondremos una velocidad de 2. Podemos tener una velocidad negativa, en cuyo caso la línea del tiempo se ejecutará hacia atrás.
- Iniciar Timeline o Start Time Line. Iniciará el timeline desde su posición actual (al estar pausado o detenido).
- Pausar Timeline o Pause Time Line. Detendrá el timeline. Si iniciamos el timeline, lo hará desde la posición en que lo hemos pausado.
- Detener Timeline o Stop Time Line. Detiene el timeline y pondrá su posición a 0.
- Mostrar mensaje o Display Message. Eesta acción mostrará un cuadro de diálogo con el texto que le pongamos. Si el texto contiene un símbolo de # en el texto, se interpretará como si fuera una nueva línea. Si queremos mostrarlo pondremos \#. SI el texto empieza con una comilla simple o doble comillas, ‘ o “, interpretará que es una expresión, que veremos más uncionan.
- Abrir dirección web o Open URL. Especificando una URL completa, podemos salir de nuestro juego para abrir una página web.
- Reiniciar juego o Restart Game. Al añadir esta acción reiniciamos el juego desde el principio.
- Finalizar juego o End Game. Con esta acción terminaríamos nuestro juego. En algunas plataformas esta acción funcionará diferente. Por ejemplo, en HTML5 terminaría nuestro juego, pero no cerraría la pestaña de navegación. En iOS o Windows Phone los juegos no pueden finalizarse, se pausan, así que es mejor no ponerlo ya que pueden rechazar nuestro juego en el proceso de validación.
- Guardar partida o Save Game. Podemos guardar el estado del juego actual. Nos pide un nombre de fichero (así podemos tener diferentes y guardar varias partidas). En la siguiente acción veremos que podemos recuperar el juego. Al ser una acción que viene por sistema, es bastante básica. Por ejemplo, no guarda el sonido que se está reproduciendo actualmente, contenido de variables y estructuras, etc).
- Cargar Partida o Load Game. Carga el estado del juego desde un archivo. Tenemos que hacerlo con la misma versión de Game Maker que el mismo fichero que hemos guardado antes.
- Reemplazar sprite o Replace Sprite. Con esta acción podemos reemplazar un sprite con el contenido de un archivo. Indicamos el sprite de la lista que detecta Game Maker Studio, el nombre del fichero y el número de subimágenes que tiene. Como vemos, los ficheros son strip, tal y como comentamos en su momento. Los formatos son los mismos compatibles cuando estamos creando los sprites, como PNG, JPG, TIF o GIF. Para los ficheros GIF, el número de subimágenes se decide automáticamente. Los otros parámetros del sprite, como su transparencia, no se cambian. Esta acción se suele utilizar si no queremos almacenar todos los sprites en el propio proyecto, cargandolos al principio de la room, por ejemplo. No es recomendable cambiarlo en instancias que ya están creadas en la room, ya que pueden pasar cosas raras con las colisiones (ya que afecta a las máscaras).
- Reemplazar fondo o Replace Background. Al igual que la acción anterior, podemos cambiar un fondo por el contenido de un archivo. No es recomendable cambiar un fondo que ya es visible.
Pestaña de acciones de control
En esta pestaña nos encontramos con una lista de acciones relacionadas con las propiedades de un objeto. controlando casos más complejos del juego, como poder hacer preguntas, comprobar condiciones o añadir código GML. Los grupos que nos encontramos en esta pestaña son preguntas/questions, otras/others, código/code y variables.
Veamos un ejemplo
En la siguiente imagen, vemos un ejemplo del uso de estas acciones para controlar una situación.
En la primera línea, vemos que hace una pregunta de si encuentra una posición libre. Si eso es cierto, irá al primer bloque, líneas 1 a 4, y si no es cierto, irá a la acción else directamente para ejecutar el otro bloque (líneas 6 a 9). En cada bloque vemos que está agrupado, se hace de esta manera para juntar las dos acciones y que trabajen juntas, primero ejecutando una y luego otra. Lo mismo ocurre en el bloque del else. También nos ayuda a tener una mejor visualización de lo que estamos haciendo(lo que se dice “sangrar” o tabular el código.
En código GML, su equivalente sería el siguiente:
if place_free(x,y)
{
if irandom(2) == 0 instance_create(x, y, obj_Enemy);
}
else
{
part_emitter_burst(ps, 0, 0, 0, 0);
sound_play(snd_Explode);
}
Como vemos, las dos opciones hacen lo mismo. Podemos hacerlo de las dos maneras, lo importante es que nosotros nos veamos cómodos tanto de una como de otra. También habrá cosas más complejas que solo lo podemos hacer con código GML.
Por si alguien se lo pregunta, en el primer bloque, si encuentra una posición libre en la posición X/Y, crea un enemigo solo con una probabilidad de un 50%. Si no encuentra una posición libre, segundo bloque, estallará algunas partículas y reproducirá un sonido que hemos añadido al proyecto.
Las diferentes acciones
- Comprueba vacío o Check Empty. Empezamos con las preguntas. Al poner esta acción, pregunta si en la posición X/Y indicada no genera una colisión con un objeto. Podemos indicar si comprobamos solo los objetos sólidos o cualquier objeto que se halle en dicha posición. Esa posición se podemos indicarla Relativa a la posición del objeto que añadimos la acción o es una posición absoluta de la room. Recordemos que en la comprobación de esa posición necesita un objeto con una máscara válida. Un ejemplo para utilizar esta acción es cuando movemos un objeto y queremos comprobar que dónde nos movemos esté libre, que no nos encontremos un muro, un enemigo, etc.
- Comprueba colisión o Check Collision. Esto hace justo lo contrario que la acción anterior. Devuelve verdadero, entraría en el bloque que pusiéramos a continuación, si hay una colisión con un objeto, dependiendo del tipo de objeto que pongamos, sólido o no.
- Comprueba objeto o Check Object. Mirará si en la posición X/Y existe el objeto concreto que le digamos. Aunque es posible marcar cualquier posición, es posible que ese objeto esté bien lejos del objeto que le añadimos la acción, esta comprobación la hace como si fuese un evento de colisión. Por lo tanto, necesitamos que los dos objetos tengan una máscara válida. También influye como hemos configurado las máscaras, tal y como hablamos en su momento.
- Contar instancias o Test Intance Count. Con esta acción podemos averiguar el número de instancias que se encuentran actualmente en la room. Elegimos un objeto que tengamos definido, marcamos el número que nos pueda interesar y en la tercera opción elegimos si nos interesa marcar igual, más grande o más pequeño. Por ejemplo, podemos comprobar si no existe ningún enemigo más, object enemigo equal to 0. para cambiar de room o aumentar la puntuación. Si tenemos un objeto arma que no puede disparar más de una bomba a la vez, podemos detectar que object bomba greather than 0, etc.
- Probabilidad o Test Chance. Esta acción nos permite simular el lanzamiento de un dado, donde le indicamos el número de caras de ese dado. De esta manera, si marcamos en sides 20, generaría el siguiente bloque “1 de 20 veces”. Cuanto más grande sea el número más se reduce la probabilidad de que se ejecute el bloque. No funciona poner números con decimales, es decir, si ponemos 3.2, la probabilidad funcionará como “1 de 3 veces”, como si los decimales no existiesen. Lo comento porque poner un valor más pequeño que 1, por ejemplo 0.7, hará que se ejecute “0 de 1 vez”, es decir, NUNCA. Esta acción es muy utilizada en los juegos, ya que la probabilidad puede usarse en muchas situaciones dentro de las acciones de nuestro proyecto.
- Comprueba pregunta o Check Question. Con esta acción aparecerá una ventana con el texto que le hayamos puesto, con unos botones de SI y NO. Si se pulsa el primer botón ejecutará el bloque siguiente. Si pulsamos NO, no ejecutará ningún bloque, a no ser que contenga una acción ELSE.
- Comprueba expresión o Test Expression. Esta pregunta es la acción más utilizada para comprobaciones, ya que podemos poner cualquier expresión para testearla.
- Comprueba ratón o Check Mouse. Podemos comprobar que ratón se ha pulsado con el ratón, usando los valores left, right, middle (las tres posibles opciones de botones del ratón), o incluso el valor no, por si nos interesa saber que no se está pulsando ninguno. Es posible que nos interese saber dónde se ha pulsado el ratón, por lo que usaremos las variables globales
mouse_x
ymouse_y
.
- Comprueba cuadrícula o Check Grid. Si tenemos juegos que van alineados a una cuadrícula, un juego de tablero como el ajedrez o algún rpg que funcione con movimiento de casillas, debemos comprobar que los objetos están bien colocados. Esta acción nos ayuda a saber si los objetos están colocados dentro de la grid que nosotros digamos.
- Inicio de bloque o Start Block. Con esta acción agrupamos las siguientes acciones dentro de un bloque de inicio o fin. Aunque ya lo hemos comentado, la siguiente imagen extraída de la ayuda lo explica a la perfección:
Cuando ponemos una condición o pregunta, si se cumple solo se ejecuta la siguiente línea (la número 2 de la imagen). Pero si queremos que se ejecuten todas las acciones que vemos con la condición, debemos ponerlos en un bloque. Lo mostramos a continuación. - Fin de bloque o End block. Tal y como hemos indicado arriba, con esta acción podemos finalizar un bloque.
- Else (ésta no la traduzco ^_^). Cuando utilizamos una acción de pregunta, todas las que hemos comentado más arriba, siempre nos devolverá un resultado verdadero o un resultado falso. Las acciones que añadimos justo después de esa acción de pregunta son las del resultado verdadero. Pero es posible que también queramos controlar un resultado falso, para que haga una o más acciones. Se utiliza la acción else para poder controlar esta situación.
- Repetir o Repeat. Otra acción muy útil, repetir una serie de acciones un número de veces. Podemos especificar un número o una expresión para ejecutarlo, así no hace falta duplicar acciones. Por ejemplo, si queremos crear 6 enemigos aleatoriamente, o incrementar una serie de puntuaciones, etc.
- Salir de evento o Exit Event. Cuando se pone esta acción no se ejecutará las siguientes acciones en ese evento. Muy útil para hacer comprobaciones para ver si las acciones son correctas.
- Llamar a evento padre o Call Event Parent. Ya hablamos en su momento de la herencia de objetos. Comentamos que si un objeto padre tiene acciones en un evento, y un objeto hijo también tiene acciones en ese evento, SOLO se ejecutarán los eventos del hijo. SI queremos que también se ejecuten los del padre, usaremos esta acción. Por ejemplo, si en el evento Create del padre crea una serie de variables, y el mismo evento en el hijo crea otras cosas, con esta acción podemos hacer que se ejecute el evento padre también.
- Ejecutar código o Execute Code. Esta es la acción que utilizaremos para escribir con lenguaje GML. Al añadirla, nos aparecerá una ventana, como un editor de textos, que podemos escribir desde una función sencilla hasta las cosas más complicadas. Ya hablaremos extendidamente sobre el lenguaje GML y todo lo que podemos hacer con él.
- Ejecutar Script o Execute Script. Si queremos usar lenguaje GML muy extenso o que se pueda aprovechar entre diferentes objetos, es recomendable utilizar scripts. Hablaremos en detalle cuando llegue, de momento podemos ver que podemos llamar a un script creado y pasarle hasta 5 argumentos (también hablaremos de los argumentos, todo a su debido tiempo).
- Comentario o Comment. Podemos añadir comentarios en nuestra lista de acciones para hacer aclaraciones o usar frases cortas que podemos recordar que hacen las acciones a continuación. Poner comentarios no afecta a ningún rendimiento de nuestro juego, así que es aconsejable poner todos los que creemos necesario. También se utiliza para disparar eventos, aunque no haya ninguna acción dentro, como los eventos de colisión o de alarma.
- Asignar variable o Set Variable. Las variables es uno de los elementos esenciales a la hora de crear nuestros juegos. En una variable podemos crear y mantener valores para usar en nuestro objetos. Ya hemos hablado de algunas variables como pueden ser las vidas/lives, o la puntuación/score. Pero nosotros podemos crear todas las variables que queramos y usarlas sin límites. Esta acción cambia el valor de una variable concreta (si no existe la crea con ese valor). el valor puede ser un número, un texto o cosas más complejas. Recordemos que el check Relative lo utilizaremos al asignar ese valor, para que tenga en cuenta el valor o no ya almacenado.
- Comprobar variable o Test Variable. Con esta acción podemos comprobar el valor de una variable. Tenemos las opciones de igual, menor, mayor, menor o igual y mayor o igual. Si utilizamos símbolos, sería =, <, >, <= y >=.
- Dibujar variable o Draw Variable. Con esta acción podemos dibujar el valor de una variable en una posición particular en la pantalla. Recordemos que solo podemos dibujar en el evento Draw.
Pestaña de acciones de puntuación
En esta pestaña nos encontramos con las acciones relacionadas con la puntuación/score, la vida/lives y la salud/health.
En muchos juegos es habitual encontrarnos con un sistema de puntos, vida o energía, por eso Game Maker viene con acciones y variables del sistema para facilitarnos esta tarea. Por ejemplo, si usamos la acción comentada anteriormente de asignar variable y ponemos como valor score, esa variable ya existe en el sistema, no haría falta crearla, y le daría el valor correspondiente. Pero también podemos usar las acciones correspondientes que se detallan en esta sección.
- Asignar puntuación o Set Score. Esta acción establece una puntuación al valor elegido. Recordemos que se utiliza la variable global score y se puede colocar en cualquier objeto, modificando siempre en el mismo lugar. Por ejemplo, podemos poner en el evento Destroy de un enemigo una puntuación de 10 (o diferente dependiendo del enemigo). Para ello deberíamos marcar el check Relative para que siempre incremente su valor sobre la puntuación actual. También podemos poner un valor de 0 (¡quitando el check Relative!) al inicio del juego para reiniciar el marcador.
- Comprueba puntuación o Test score. Con esta acción podemos comprobar el valor de la puntuación comparando el valor de la acción con el acumulado. La condición puede ser igual, mayor o menor.
- Dibujar puntuación o Draw Score. Podemos dibujar la puntuación en el lugar de la pantalla que elegimos gracias a la posición X/Y, incluído un texto de título. Recordemos que esta acción sólo se utiliza en el evento Draw.
- Limpiar Tabla de puntuación o Clear Highscore. Acción para limpiar la tabla de puntuación.
- Asignar vidas o Set Lives. Aquí tenemos otra variable de sistema que podemos usar. Lo habitual es asignar un valor al principio del juego (por ejemplo 3) y luego disminuir o aumentar en función de lo que suceda (con el check Relative). También tenemos un evento que detecta si las vidas bajan a 0 o menos.
- Comprueba vidas o Test Lives. Con esta acción de pregunta podemos comprobar el número de vidas, al igual que con la puntuación. Se suele usar para cuando asignemos vidas que no superemos un tope máximo.
- Dibujar vidas o Draw Lives. Al igual que con la puntuación, podemos dibujar en una posición las vidas con un texto predeterminado en el evento Draw.
- Dibujar imágenes de vidas o Draw life Images. En este tipo de variables es muy habitual representar las vidas con alguna imagen en vez de un texto. En la acción indicamos un sprite y una posición X/Y inicial, y Game Maker dibujará tantas imágenes como vidas tengamos en ese momento. Recordemos que las acciones de dibujo sólo son válidas en el evento Draw.
- Asignar salud o Set Health. Game Maker también incluye una variable de sistema que podemos establecer y cambiar su valor con esta acción. Lo habitual es que esta variable se mueva en el rango entre 0 y 100, donde 100 es para indicar que está a tope de energía). Cuando la Salud llega a 0 o menos tenemos un evento que lo detecta. Es habitual combinar la Salud con las vidas, así que con el evento que detecta que no tenemos más energía restaríamos una vida, y si llegamos a 0 vidas generar un “Game over” con el evento apropiado.
- Puntuación en el título o Score caption. Si jugamos en juegos de Windows, Linux o Mac, tenemos la posibilidad de mostrar la puntuación, la vida y la energía en el título de la ventana con esta acción, incluído un texto para diferenciar cada uno de ellos.
Pestaña de acciones extra
En esta pestaña encontramos acciones para crear efectos en el juego, principalmente a la creación y uso de las partículas. Todo el tema de partículas lo hablaremos en detalle en un post propio, tanto las acciones que vemos en esta pestaña como el código GML. Comentamos la otra acción que vemos y está relacionada con el puntero del ratón.
- Asignar cursor de ratón o Set Mouse Cursor. Podemos cambiar el cursor del ratón a una imagen que elijamos de los sprites. También podemos elegir ocultar el cursor estándar. Esta acción sólo es compatible con Windows, Linux, Mac y HTML5.
Pestaña de acciones de dibujo
Todas las acciones que vemos aquí están relacionadas con las opciones dibujar cosas en la pantalla. Podemos dibujar texto, sprites, objetos, fondos, etc… Obviamente, no tenemos que decir ni programar nada si no queremos, ya que Game Maker dibuja todo lo que necesitemos. Pero si queremos detallar o cambiar algo, podemos usar estas acciones.
La mayoría de estas acciones sólo se ejecutarán en el evento Draw y teniendo la propiedad visible del objeto marcada, aunque veremos que existe alguna configuración de ajustes que podemos poner en cualquier evento.
La pestaña etá dividida en las tres seccione siguientes: dibujo/drawing, ajustes/settings y other/otros.
- Dibujar el propio sprite o Draw Self. Al añadir cualquier acción al evento Draw de un objeto, le estamos diciendo a Game Maker que en vez de pintar el sprite que tiene, que haga caso a nuestras acciones. Es posible que nos interese pintar un número encima del objeto, una barra de energía, etc… pero también queremos que pinte el sprite que tiene asignado. Para ello usamos esta acción. Es interesante poder combinar algunas opciones, como cambiar el sprite (sprite diferente, escalarlo o colorearlo mediante parámetros que veremos), o hacer combinaciones de profundidad a la hora de pintar (por ejemplo, pintar primero tu sprite y después su energía encima).
- Dibujar sprite o Draw sprite. Esta acción dibuja un sprite de la lista de recursos que tenemos, en una posición que le demos (recordemos que podemos usar el check Relative para que sea la referencia de la posición del objeto) y una subimagen del sprite( con un valor de 0 para la primera y un número superior para el resto). Si el sprite es una animación y queremos que la dibuje como siempre, el valor de subimagen será -1. Con esta acción no tendrá en cuenta los valores de transformación que le hayamos cambiado al sprite.
- Dibujar fondo o Draw Background. Podemos cambiar o dibujar un fondo que sea diferente al creado en el diseño de la room. Le marcamos una posición, absoluta o no, y si la imagen debe repetirse por toda la room o no (con la propiedad tiled).
- Dibujar texto o Draw Text. Con esta acción dibujamos texto en cualquier lugar de la habitación o room. Se debe indicar el texto y la posición. Recordemos una serie de cosas a la hora de poner texto:
- Para dibujar el texto en varias líneas, se utiliza el símbolo #. Por ejemplo, el texto Hola a todos#empezamos a aprender lo dibujaría en dos líneas diferentes.
- Si queremos pintar el símbolo #, debemos escribir \#, Por ejemplo: Este es el número \#3.
- Se puede mezclar texto y expresiones, como dibujar valores y variables. El texto que queremos mostrar debe ir entrecomillado. Por ejemplo, para pintar la velocidad usaríamos la variable de sistema speed y el texto sería algo parecido a ‘La velocidad del objeto es de ‘ + string(speed).
- Dibujar texto escalado o Draw Scaled Text. A igual que la acción anterior, pero con algunas propiedades más. Podemos cambiar el tamaño con las propiedades (xscale, yscale), y la propiedad angle para girar el texto con un ángulo.
- Dibujar rectángulo o Draw Rectangle. Se especifican la dos coordenadas que corresponden a las esquinas opuestas del rectángulo, y un parámetro más para indicar si dibuja solo la línea del contorno o el rectángulo entero como sólido. Para poder definir los colores veremos más adelante que existen acciones para ello.
- Gradiente horizontal o Horizontal Gradient. Dibuja un rectángulo como la acción anterior, pero dibujando un degradado de color que cambia de izquierda a derecha. Se puede especificar tamaño y posición, además de los dos colores del degradado.
- Gradiente vertical o Vertical Gradient. Igual que la anterior, pero el degradado es de arriba a abajo.
- Dibujar elipse o Draw Ellipse. Con esta acción dibujamos un círculo o una elipse. Se especifican igualmente dos coordenadas de posición, que sería el rectángulo desde dónde estaría la elipse por dentro y su posición. Podemos dibujar solo el contorno o rellenarla con el color predeterminado.
- Elipse con gradiente o Gradient Ellipse. Igual que el anterior, pero se puede elegir dos colores de degradado que va del centro hasta el borde.
- Dibujar línea o Draw Line. Dibuja una línea entre dos puntos que se especifican en la acción, teniendo en cuenta la opción de la casilla Relative.
- Dibujar flecha o Draw Arrow. Dibuja una flecha simple igual que la acción de dibujar línea, especificando dos puntos de posición. También se escribe el tamaño de la punta de flecha, con su tamaño en píxeles, aunque eso no añade longitud al tamaño total.
- Establecer color o Set color. Esta acción es donde ajustamos el color de todas las acciones de dibujo que hemos comentado anteriormente. Se puede poner en cualquier evento, y una vez asignado, será el color de referencia hasta que se cambie. Esto no afecta a ningún sprite o fondo del juego.
- Establecer fuente o Set Font. Establecemos la fuente para dibujar texto, asignando uno de los recursos de fuente que hayamos definido. Si no hay fuente elegida, cogerá el tipo de letra Arial de tamaño 12.
- Establecer pantalla completa o Set Full Screen. Con esta acción podemos cambiar de ventana a pantalla completa, y al revés. Es una opción que podemos incluir en cualquier menú de nuestro juego.
- Tomar captura de pantalla o Take Snapshot. Esta acción toma una imagen del juego mientras se está jugando y lo almacena en un archivo PNG que se especifica en la acción.
- Crear efecto o Create Effect. Sin entrar en el tema de partículas, podemos crear efectos basicos con esta acción, como una explosión o un fuego. Especificamos el tipo de efecto, tamaño, posición y color. Para los efectos de lluvia y nieve la posición no importa.
Y hasta aquí el listado de todas las acciones del programa (casi nada). Como vemos, tenemos muchas acciones donde se pueden hacer un montón de tipos de juegos sin escribir una línea de código. Iremos poniendo ejemplos de estos juegos, desde un shooter de aviones hasta un juego de plataformas.
Si ya has aprendido como funcionan todas las acciones, ahora puedes dar el salto al código GML. No te preocupes si no sabes como se escribe una acción que has arrastrado, tenemos una guía que explica la equivalencia de cada una de las acciones que has visto con su función a acciones en GML. Te dejo el enlace más abajo.