CREACIÓN DE VIDEOJUEGOS CON CONSTRUCT 2

PREPARANDO LA DEFENSA CONTRA LOS INVASORES EXTRATERRESTRES

Fernando Paniagua Martín

CREACIÓN DE VIDEOJUEGOS CON CONSTRUCT 2

Preparando la defensa contra los invasores extraterrestres

© 2015, Fernando Paniagua Martín.

http://www.fernandopaniagua.com

info@fernandopaniagua.com

Diseño de la portada, Roberto Paniagua Martín.

"My name’s Guybrush Threepwood,
and I want to be a pirate!"
Guybrush Threepwood

Notas del autor sobre la edición

Esta primera edición de “Creación de Videojuegos con Construct 2, preparando la  defensa contra los invasores extraterrestres”, puede contener (afirmo que las contiene) erratas y estas serán responsabilidad exclusiva del autor (yo). Si las encuentras, y te apetece, me las haces llegar para que las subsane y crear una segunda edición mejorada. También puedes ponerte en contacto conmigo para hacer sugerencias o decirme qué te ha parecido este libro.

He decidido sacar una edición digital y otra en papel. La edición en papel costará lo que cueste la impresión, no hay beneficio por mi parte. La edición digital será gratuita. ¿Por qué gratuita? Porque considero que el libro no tiene suficiente empaque como para cobrar por él. Y porque la motivación para escribirlo no fue económica, sino de otra naturaleza más personal. Si tengo muchísimo éxito y recibo millones de peticiones solicitando una edición más completa, entonces quizás sí ponga a la venta esa edición. Pero esta que estás leyendo es y será gratuita.

Para la realización del libro he utilizado material propio y algún otro rescatado de Internet. No creo estar haciendo mal uso de nada que tenga derechos de terceros (no me lucro y los juegos ya no están a la venta). No obstante, si los legítimos propietarios de estos materiales consideran que no es oportuna su utilización que me lo hagan saber.

Este libro fue terminado de escribir en Alcorcón (Madrid, España) a finales de julio de 2015. El verano estaba resultando absolutamente bochornoso, en el cine proyectaban la película “Pixels” y yo comenzaba mis merecidas vacaciones estivales.

Espero que te guste.

El autor

Fernando Paniagua es ingeniero informático, profesor de informática, estudiante de informática y aficionado a la informática… Pero también, cuando tiene tiempo, lee casi cualquier cosa que tenga a mano, escribe libros, viaja, cocina, monta en bicicleta, juega a algún videojuego, sale al campo a hacer fotografías o se dedica a disfrutar de la vida, que es lo que más le gusta y lo realmente importante.

Agradecimientos

Estoy medio agradecido, agradecido o muy agradecido…

A todos los que habéis colaborado (o lo haréis en el futuro) aportando apoyo, sugerencias, pizzas, ideas locas, críticas o detectando erratas.

A Roberto Paniagua, por diseñar la portada y no querer cobrar por ello.

A todos los programadores y diseñadores de videojuegos. El mundo es un lugar más divertido gracias a vosotros.

A Jon Ritman por hacer unos juegos tan, tan, tan, tan buenos.

Y, por último, a Guybrush Threepwood por tener tanta guasa.

Contenido

Notas del autor sobre la edición

El autor

Agradecimientos

Introducción

El libro

Pong

El proyecto

Las capas

Los objetos del juego

El controlador

Los eventos

Moviendo la pelota (añadiendo comportamiento)

Las colisiones

Los puntos de imagen

Space Invaders

Alineación y espaciado de objetos

Agregando proyectiles

Disparando con el teclado

Los puntos de la imagen (otra vez)

Destruyendo objetos inútiles

Usando el teclado para controlar un personaje

Agregando sonido

Las animaciones

Los tick

Las variables globales

Cambiando de layout

Super Mario Land

La clonación objetos

El comportamiento “Jumpthru”

Animando al fontanero

Animando al enemigo

¡Música, maestro!

Exportar el proyecto

Game Over

Otras obras del autor

Introducción

Con el paso del tiempo uno tiende a confundir, mezclar y distorsionar los recuerdos, por lo que la fiabilidad de lo que voy a decir a continuación es relativa. En mi relación con los videojuegos puedo enumerar los tres sucesos que me dejaron “ojiplático” y me hicieron pensar eso de “yo quiero dedicarme a hacer eso”. No puedo ordenar cronológicamente dichos recuerdos, pero sí puedo poner un ranking que tiene que ver con la impresión que me produjeron:

Suceso 1. Contacto con la consola Atari 2600. Ahí es nada. En casa de un compañero del colegio. Creo que jugamos al Pong, pero eran los 80 y han pasado demasiados veranos. Quizás fue otro juego, uno de vaqueros. No lo sé. La impresión fue interesante, pero no definitiva. Aquel chisme conectado a la televisión estaba tan lejos de mi alcance económico que no lo contemplé como una opción. Además, los juegos eran un poco sosos.

Suceso2. Contacto con el Space Invaders. ¡Aún recuerdo como me gasté toda la paga en aquella máquina incomprensible! Una nave verde, unos extraterrestres furiosos que atacaron sin provocación por mi parte y una sensación desconocida para mí. ¿Qué era aquello? ¿Cómo un bar de mi barrio albergaba tamaña maravilla? Había llegado el futuro. El nivel de impresión fue elevado. Muy elevado. Desde entonces odio a los extraterrestres. Es un odio que no soy capaz de controlar. Espero no encontrarme nunca con uno. Lamentará haber intentado invadir mi planeta.

Suceso 3. Contacto con el Amstrad CPC 464. En el colegio hicieron una demostración de funcionamiento de estos aparatos maravillosos con el fin de captar alumnos para unas clases de programación en Basic. 8 bits, pantalla de fósforo verde, tres canales de sonido, monitor y lector de cintas integrado. Contemplar la ejecución de Oh Mummy supuso el punto y final a mis aspiraciones de astronauta, buceador, futbolista, cirujano plástico y vendedor de televisores tridimensionales. Ante mis ojos se había manifestado mi destino. Quería programar. Nivel de impresión: irreversible.

Y vaya si programé. Programé de todo menos videojuegos. Me harté de programar y poco a poco me fui olvidando del Oh Mummy y de mis sueños juveniles. Hasta que, pilotando un F1 a 310km/hora (en una consola) tuve una especie de flashback y me vi, adolescente, peleando con el ordenador, tratando de crear algo parecido a un videojuego en Basic, sin conocimientos, sin recursos, sin ayuda y sin Internet (sí, hubo un tiempo en el que no existía Google, puede que alguien aún lo recuerde). Volví del flashback y pensé “vaya, cómo ha cambiado el mundo en estos 30 años”.

Por no armar de razones a aquellos que susurran cobardemente acusándome de rollista, no profundizaré en la sucesión de casualidades que me llevaron hasta donde me encuentro ahora, pero el hecho es que estoy aquí, ajustando cuentas y haciendo algo que, si alguien hubiese hecho antes por mí, quién sabe si no estaríamos ante un Miyamoto de habla castellana. ¿Cómo dices? ¿No sabes quién es Miyamoto? Puedes buscar en la Web, ya no estamos en los 80.

El caso es que, actualmente, existen un buen puñado de frameworks (si encuentras una buena definición de esta palabra me la envías por email) que facilitan la vida al desarrollador de videojuegos mucho más de lo que cabría pensar. Tanto que hasta se pueden programar videojuegos sin programar... ¿Cómooooooo? ¿Qué me he dejado la piel aprendiendo C++ y resulta que no hace falta saber nada de punteros? Efectivamente, amigo programador. Pero antes de que hagas ninguna tontería, déjame advertirte que saber C++ te servirá de mucho en otras actividades. Incluso para programar juegos. No tires tus libros ni formatees el disco duro. Que se puedan crear juegos sin programar no quiere decir que ese sea el único camino. Tampoco siempre es el mejor. A veces ni siquiera es una opción.

Pero es una opción. Una opción interesante, divertida y razonablemente sencilla para crear videojuegos. Una opción que llevaremos a cabo utilizando Construct 2, un framework creado por la empresa Scirra que dispone de una versión gratuita que es la que utilizaremos en este libro. Construct 2 nos proporciona toda la infraestructura para la creación de videojuegos sin la necesidad de saber nada de programación. Sólo hay que saber qué es un videojuego y haber pasado unas cuantas horas jugando, tener una buena idea (lo más difícil), tiempo y ganas de aprender. Vamos, te invito a que me acompañes en este fascinante viaje que comienzo 30 años después de soñarlo.

En ocasiones, estimado lector, los sueños se hacen realidad.

El libro

¿Todo esto te parece un rollo? Espero que no. Creo que hay que estar motivado y con ganas para afrontar cualquier tarea con garantías. Ésta va a ser larga y quiero estar enchufado. Tú también deberás estar enchufado para llegar hasta el final. Mi objetivo es que la lectura de este “manual del creador de videojuegos” sea útil y entretenida. Si es así, habrá merecido la pena. Yo ya estoy motivado. Al 100%. Vamos.

Llegado a este punto, el lector ávido de conocimiento se estará preguntando ¿cuándo y cómo vamos a comenzar a trabajar? ¡Buena pregunta! He aquí la respuesta a la primera cuestión: ¡ahora!. La respuesta a la segunda cuestión es un poco más  larga aunque espero que igual de satisfactoria.

Este libro no es un manual de referencia. Un manual de referencia sirve para muchas cosas pero no para aprender. Entra en demasiados detalles y para que llegue a ser útil antes hay que saber bastante del tema que trata.

La mejor manera de aprender ha sido, desde siempre, la experimentación. Uno puede leer mil veces la receta de la tortilla de patatas, aprenderse de memoria los ingredientes, las cantidades, la manera de mezclarlos y de cocinarlos. Todo eso está muy bien, pero cuando se ponga a hacer la tortilla saldrá algo parecido a un filete ruso de color amarillo. O algo parecido a un puré de patata amarillo. O algo amarillo que no se parezca a nada de este mundo. Hasta la décima intentona no se obtendrá una tortilla razonablemente parecida a una tortilla.

Experimentemos pues. ¿De cualquier manera? No, hombre, no. Experimentemos de manera ordenada, porque hace falta algo de orden para que el aprendizaje basado en la experimentación sea posible. En este caso se me ha ocurrido que llevaremos a cabo un orden cronológico: elegiremos unos cuantos juegos legendarios, empezando por los más antiguos y haremos una versión incompleta[1] utilizando Construct 2. Cuando hayamos acabado el libro estaremos en disposición de crear juegos nuevos, que es donde debemos concentrar nuestros esfuerzos. Que comience el viaje.

Pong

Este videojuego fue lanzado en 1972, durante la prehistoria de los videojuegos. Fue creado por Ralph H. Baer o por Nolan Bushnell (aquí hubo lío de reconocimiento de autoría) y publicado por Atari. Pong es un juego muy sencillo[2]. El jugador humano maneja una raqueta y debe golpear una pelota para devolverla al jugador manejado por el ordenador (o por otro humano), intentado que éste no sea capaz de devolverla. Puede parecer una tontería, pero este videojuego fue uno de los pioneros –el pionero- y un gran éxito en su tiempo.

No obstante, seamos realistas y hablemos claro: este juego es un poco aburrido para lo que se estila en la actualidad. Y aunque Construct 2 facilita mucho las tareas de desarrollo de los videojuegos, éstos no se hacen solos y si quisiésemos hacer una versión completa de Pong tardaríamos bastante tiempo. Por lo tanto, en esta primera toma de contacto, vamos a desarrollar sólo una parte del juego. Así vamos calentando. En marcha.

Lo primero, como siempre, es descargar, instalar y abrir Construct 2. Esta parte no debería presentarte dificultades. Prueba a ver. Cuando lo tengas ejecutándose puedes seguir.

El proyecto

El siguiente paso es crear el proyecto. Es bien fácil: menú “File”, opción “New”, seleccionar “New empty Project” (nuevo proyecto vacío) e indicas 1024x768 como tamaño de la ventana del juego.

Las propiedades del proyecto (por ejemplo el tamaño de la ventana) se pueden modificar en cualquier momento. Aunque es fácil volver a las propiedades, hay que saber cómo y esto puede resultar lioso (a mí me lo pareció). Pues bien, basta con pinchar fuera de la pantalla (para que no haya ningún objeto seleccionado) y pulsar sobre el texto “View” de la opción “Project Properties”. Accederemos a un panel de propiedades del proyecto, donde se puede indicar el nombre del juego, la versión, el autor (¡¡al fin!!),… y el tamaño de la pantalla de juego.

Disponemos de un proyecto nuevo, vacío, con fondo blanco. ¿Conoces algún juego que tenga el fondo blanco? No muchos. Ahora mismo no me recuerdo ninguno, pero da igual si los hay o no, porque Pong tiene el fondo negro. Así que lo siguiente que vamos a hacer es indicar que el fondo de la pantalla es negro. Y aquí vamos a hablar de las capas (“Layers”).

Las capas

El panel de manejo de “layers” se encuentra en la parte superior derecha. Al crear un proyecto nuevo, Construct 2 crea una capa identificada como Layer 0. ¿La ves? Es una de las muchas capas que podemos tener en el juego. Nosotros vamos a utilizar esta primera capa como capa de fondo. Por lo tanto lo primero que vamos a hacer es seleccionarla pulsando sobre ella en el panel de capas.

El panel que se encuentra en la parte superior izquierda pasa a ser ahora el panel de control de la capa. Ponle el valor “Fondo” la propiedad “Name”. Así sabremos con qué capa estamos trabajando en cada momento. Selecciona también el color negro como de fondo (propiedad Background color), indica que el fondo no es transparente y que la opacidad es del 100% (prueba con otros valores menores de 100 para que veas qué ocurre).

El resultado será algo parecido a la pantalla que se muestra a continuación. El mismo proyecto que antes, pero sobre fondo negro. Fácil.

Los objetos del juego

Vamos ahora a insertar los elementos del juego. En Construct 2, los distintos elementos se conocen como “objetos” (object). Existen distintas categorías de objetos, como por ejemplo los elementos gráficos (categoría General), los objetos que permiten al usuario interactuar con el juego (categoría Juego), o la que contiene elementos multimedia (categoría Media) tales como ficheros de sonido o vídeos que podremos incluir en nuestro juego.

Para insertar un objeto primero hay que seleccionar la capa donde se desea insertar y pulsar botón derecho sobre el panel de objetos situado en la parte inferior derecha de la zona de trabajo de Construct 2.

Otra alternativa es haciendo doble clic directamente sobre la pantalla de trabajo (con la capa correspondiente seleccionada). En ambos casos aparece un panel en el que tendremos que seleccionar “Sprite” (el que viene identificado con un detestable extraterrestre  invasor) dentro de la categoría “General” y pulsar el botón “Insert”.

Lo que viene a continuación es fácil, pero pon atención porque lo vamos a repetir muuuuuchas veces cuando utilicemos Constructs 2:

Pulsamos con el ratón sobre el lugar en el que deseemos insertar el elemento.

Seleccionamos el fichero gráfico que queremos incluir. En este caso vamos a incluir la red del juego. Pulsamos sobre el icono de apertura de ficheros y seleccionamos el fichero con la imagen de la red.

Para guardar sólo hace falta cerrar la ventana de edición de imágenes. La red aparecerá en la pantalla de edición. La colocamos ajustando el tamaño y posición, pinchando y arrastrando los manejadores. Deberíamos llegar a tener algo así.

Esto va tomando forma. Vamos a ver qué tal. Guarda el proyecto (ponle nombre y recuerda dónde lo has guardado) y pulsa sobre el botón de ejecución (“Run Layout”).

Se debería abrir tu navegador por defecto y mostrar una página html con fondo negro y con una red de puntos en el centro (más o menos). ¿Está todo controlado?

Una vez que tenemos el fondo listo, cambiamos el nombre a la capa (yo la he llamado Fondo) y lo bloqueamos. ¿Por qué? Sencillamente porque así no puedo modificarla por error.

Ahora creamos una nueva capa y la llamamos Juego. Deberíamos tener dos capas, una de ellas bloqueada (Fondo, el candado se muestra cerrado) y otra no bloqueada y seleccionada (Juego).

Sobre la capa “Juega” vamos a insertar un nuevo sprite, el correspondiente a la raqueta. Una vez insertado, lo renombramos. Debemos acostumbrarnos a renombrar en el mismo momento en el que insertamos los elementos al juego. Así no se nos olvida y nos evitamos líos posteriores.

Colocamos la raqueta donde queramos (en el juego original se posiciona en el lado izquierdo) y le agregamos un controlador. Veamos cómo.

El controlador

En Construct 2 casi todo es un objeto, y los controladores no son una excepción.

Sobre la pantalla del juego pulsamos una vez el botón derecho del ratón y seleccionamos la opción “Insert New Object”. La sección “Input” es la correspondiente a las alternativas disponibles para el manejo del juego. Como se puede ver en la imagen, Construct 2 nos proporciona cuatro opciones: el pad de juegos (gamepad), el teclado (keyboard), el ratón (mouse) y la entrada táctil (Touch).

En este caso vamos a hacer el manejo con el ratón. Puede que resulte un poco raro, pero como estamos aprendiendo es mejor que empecemos por algo sencillo.

Seleccionamos el ratón y pulsamos “Insert”. La ventana de inserción de objetos se cierra y aparentemente no ocurre nada. Pero sí que ha ocurrido, sí. A partir de ahora disponemos del ratón como mecanismo de interacción con el juego.

Los eventos

Una vez hemos agregado el ratón como controlador del juego debemos indicar a Construct 2 qué hacer con él. Esto se hace mediante los eventos.

Un evento es un suceso que ha ocurrido en el juego. Que el usuario haga clic sobre un objeto es un evento. Que el usuario pulse una tecla es un evento. Que un rayo gamma cósmico lanzado desde el espacio exterior por alienígenas hostiles impacte sobre uno de los tanques con artillería antiaérea con los que los humanos nos estamos defendiendo de la invasión es un evento (prueba a leer esta última frase en alto y cuando comiences a quedarte sin aliento sabrás por qué es importante utilizar frases cortas o comas en los textos).

Los eventos se deben capturar y tratar. Imaginemos que queremos capturar el evento del impacto del rayo sobre el tanque. Nuestro tanque es muy endeble y el rayo gamma tiene mucha potencia destructiva, por lo que un único impacto acabará con él. Más o menos tendremos que decir a Construct 2 algo así:

Objecto

Suceso

Acción

Rayo gamma

Impacta con Tanque con artillería antiaérea con el que los humanos nos estamos defendiendo de la invasión

Destruye Tanque con artillería antiaérea con el que los humanos nos estamos defendiendo de la invasión

En la tabla se están relacionando objetos (en negrita) y verbos o acciones (en cursiva) y lo que pretendo decir al sistema es: “Cuando el rayo impacte con el tanque destruye al tanque”.

Los objetos pueden ser un montón de elementos: sprites, dispositivos de entrada (el ratón) o cosas que ocurren en el sistema (tics, valores que toman determinadas variables, y cosas así de extrañas que iremos viendo poco a poco). Las acciones por su parte se realizarán sobre los objetos del juego (la raqueta, la pelota, el tanque) o sobre objetos del sistema.

Fácil ¿verdad? Pues Construct 2 gestiona los eventos de este modo. Incluyamos la “programación” del evento que va a mover la raqueta.

La pestaña “Event sheet 1” es el lugar en el que vamos a indicar qué eventos queremos recoger y qué efecto deseamos que genere en el juego.

Podemos pulsar sobre “Add event” o pulsar el botón derecho y seleccionar “Add event” del menú desplegable que aparezca[3].

Lo primero que nos va a pedir Construct2 es que seleccionemos el objeto que genera el evento. En este caso seleccionamos el ratón y pulsamos el botón “Next”.

Lo siguiente que debemos de indicar es el evento en sí. Construct 2 nos proporciona una lista de opciones y debemos coger la que se ajuste a nuestro deseo. Puede que no nos ofrezca todo lo que queramos, pero la lista de opciones es más que suficiente.

En nuestro caso seleccionamos “Mouse button is down”, que significa algo así como que el botón del ratón esté pulsado en cualquier lugar de la pantalla de juego.

Después nos pedirá qué botón del ratón queremos que capture. Elegimos “Left” (que se corresponde con el botón izquierdo) y pulsamos el botón “Done”.

En la hoja de eventos “Event sheet 1” deberíamos tener algo parecido a lo que se muestra en la imagen siguiente. Si no es así borra el evento y repite los pasos (para borrar haz clic con el botón derecho sobre el evento y selecciona “Delete” las veces que sean necesarias hasta que el evento haya desparecido de la lista).

Ya tenemos el 50% del trabajo hecho: hemos indicado qué evento queremos capturar. Nos queda indicar qué queremos que ocurre cuando el “Cursor (del Mouse) is over MiRaqueta”.

También es muy sencillo. Pulsa sobre el texto “Add action” del evento y selecciona el objeto sobre el que quieres actuar. Como lo que queremos hacer es mover la raqueta volvemos a seleccionar el objeto correspondiente (MiRaqueta en ejemplo).

Pulsa el botón “Next” e indica qué quieres hacer. Como verás salen un montón de acciones posibles. No vamos a explicarlas todas, sino sólo aquellas que vayamos a usar. En este caso lo que vamos a hacer es modificar la coordenada Y de la raqueta. La coordenada Y indica la posición de la raqueta en el eje vertical (es decir, si se muestra más arriba o más abajo)

Y por último debemos indicar el nuevo valor de la Y de la raqueta. Como queremos que la raqueta se mueva en el eje de la Y hasta la posición del ratón utilizaremos uno de los objetos del sistema llamado Mouse. El objeto Mouse tiene, entre otras cosas, las coordenadas X e Y del cursor del ratón.

Ya tenemos nuestro evento completo. La imagen siguiente muestra el resultado en la hoja de eventos.

Podríamos leerlo de la siguiente manera “Cuando el botón izquierdo del ratón esté pulsado asigna el valor de la coordenada Y del ratón a la coordenada Y de MiRaqueta”. Ejecutemos a ver qué tal (recuerda que hay que tener pulsado el botón izquierdo del ratón para mover la raqueta).

Mola ¿verdad? Si no funciona tendremos que volver a empezar siguiendo los pasos con cuidado hasta que funcione. Hacer videojuegos no siempre es fácil, aunque utilicemos Construct 2. No se admiten desánimos.

Moviendo la pelota (añadiendo comportamiento)

Si funciona nos ponemos con la pelota, que es la verdadera protagonista del juego y hasta ahora no le hemos mucho caso.

Como no la hemos agregado aún al juego hagámoslo. Añadimos un nuevo sprite con la imagen de pelota (en Pong es un pequeño cuadrado blanco) y le ponemos “Pelota” de nombre. La situamos junto a nuestra raqueta, inmediatamente a la derecha de la misma. Así podremos ver mejor cómo se mueve. ¡Démosle movimiento pues!

Los elementos de un videojuego pueden ser estáticos o tener movimiento. Hemos visto como configurar el movimiento de la raqueta en función de un evento del ratón. Pero ¿cómo hacer para que un elemento, por ejemplo la pelota de Pong, se mueva por sí mismo? La respuesta es asignándole comportamiento[4].

Seleccionemos la pelota en la pantalla de edición. Pulsa una única vez sobre ella y comprueba que queda sombreada en azul y rodeada de pequeños puntos, como se puede ver en la imagen siguiente.

Una vez seleccionada la pelota pulsa sobre el texto “Behaviors” que se encuentra en el panel izquierdo. Con esto pasamos a asociar comportamiento al objeto seleccionado (en este caso la pelota).

En la ventana de edición de comportamientos pulsa sobre el símbolo + y selecciona la opción “Bullet” de la sección “Movements”. Con esto lo que vamos a decir es que queremos que la pelota se comporte como una bala. No te asustes, que no vamos a dañar a nadie. Sencillamente estamos indicando que el movimiento de la pelota es lineal.

Ejecuta el proyecto y verás cómo la pelota sale disparada en línea recta desde su posición inicial hacia la derecha, desapareciendo cuando llega al final de la zona de juego.

Está bien pero eso de que la pelota salga disparada nada más empezar es un poco estresante y lo que queremos es divertirnos, así que hagamos algunos cambios en el comportamiento (behavior) de la pelota para que se quede esperando a que hagamos algo antes de comenzar a moverse.

Volvamos a la pantalla de edición, seleccionamos la pelota y le indicamos que el estado inicial es desactivado (“Initial state”, “Disabled”). Ahora la pelota no se moverá cuando ejecutemos el juego.

¿Y cómo se mueve? Es bien sencillo: agregando un nuevo evento. Diciéndole a Construct 2 que cuando se pulse el botón izquierdo del ratón (o el derecho, o del centro, el que queramos) modifique el objeto Pelota cambiando el estado de “Bullet” a “Enabled” (activado).

Los eventos de la hoja de eventos deberían tener esta pinta:

Si ejecutamos ahora el proyecto deberíamos ver la pelota en su posición inicial, quieta. Al pulsar el botón izquierdo del ratón, la pelota se pondrá en movimiento, avanzando de izquierda a derecha hasta, maldición, desaparecer por el lado derecho de la pantalla.

Necesitamos un rival.

Las colisiones

Añadimos la raqueta del rival y la llamamos CompRaqueta. Probamos y vemos que se sigue saliendo por la derecha.

Agregamos un evento de impacto y hacemos que rote 180 grados, así dará la vuelta.

Probamos y vemos que la pelota rebota y vuelve, pero ahora se sale por la izquierda. Hacemos lo mismo para la raqueta del jugador humano (la nuestra).

Sólo nos falta indicar a la pelota qué hacer cuando abandona la zona de juego (el layout). En nuestro caso le vamos a decir a Construct que cuando la pelota salga de la zona de juego se detenga. Esto lo conseguimos agregando un nuevo evento en el que diremos a Construct que cuando el objeto pelota abandone el layout ponga el estado del proyectil a “disabled” (desactivado).

Los puntos de imagen

Ahora ya podemos jugar un rato. La pelota va de izquierda a derecha y de derecha a izquierda en línea recta. La única manera que tenemos de perder el punto es quitando la raqueta del camino de la pelota. Entonces la pelota se detiene y fin de la partida. ¿Game over? ¿Así sin más? ¿Y si queremos una nueva oportunidad?

Si es así, podemos agregar una nueva acción al caso de que la pelota salga de la zona de juego. Haremos que la pelota se sitúe justo a la derecha de la raqueta, pero para eso necesitamos fijar un punto de imagen (“image point”).

Los puntos de imagen son posiciones fijas en relación a un objeto. Por ejemplo, si quiero dirigir un balón a la cabeza de un futbolista en un juego de fútbol, deberé saber dónde está la cabeza. Para ello fijaré un punto de imagen en la cabeza del sprite del futbolista y ya tendré a dónde apuntar.

Para agregar un punto de imagen se debe hacer doble clic sobre el sprite para que aparezca la ventana de edición de imágenes. Entonces se debe seleccionar la herramienta de gestión de puntos (“Set origin and image points”), como se puede ver en la imagen siguiente. Se mostrará una ventana con los puntos de imagen disponibles.

Pulsando sobre el símbolo + podremos agregar nuevos puntos de imagen. Agregaremos uno, lo pondremos a la derecha de la raqueta del jugador y lo llamaremos “OrigenPelota”. Este será el lugar en el que ubicaremos la pelota cuando se haya salido de la zona de juego.

Agregamos, ahora sí, la nueva acción al evento “Is outside layout” del objeto Pelota. Esta nueva acción se realizará sobre la propia pelota, modificando su posición al punto 1 del objeto “MiRaqueta”, tal y como se puede ver en la imagen.

Ya podemos probar nuestra “versión” de Pong. Pulsando el botón izquierdo la pelota sale disparada en línea recta hacia la derecha. Rebotará sobre la raqueta del rival y volverá hacia la izquierda. Si mantenemos pulsado el botón izquierdo del ratón podemos mover nuestra raqueta, devolviendo la pelota de nuevo (o fallando). Faltan bastantes cosas por hacer, como los ángulos de rebote o el marcador, pero lo vamos a dejar así. El juego no es muy entretenido pero nos ha servido para aprender algunos conceptos nuevos que nos van a permitir continuar aprendiendo.

Space Invaders

En mi universo infantil, este fue el primer video juego apasionante de verdad. Una máquina recreativa en un bar de mi barrio. Recuerdo que introduje la moneda y ante mi sorpresa los alienígenas comenzaron a moverse, hacer ruidos extraños y ¡a atacar sin provocación por mi parte! Entre ambos, unos muros verdes hacían proporcionaban protección temporal. Pero los alienígenas no se conformaban con disparar: descendían a gran velocidad. Comprendí de inmediato la motivación del juego, la idea subyacente, la metáfora, la misión: eran ellos o yo.

Alineación y espaciado de objetos

Creamos un proyecto vacío y le asignamos un tamaño de 800x600 tanto a la ventana como al Layout. Además, al Layout damos el valor 0,0 al margen y a la capa (layer) le damos el negro como color de fondo.

Ponemos nombre a la capa del fondo y la bloqueamos. Creamos otra capa que va a ser en la que se desarrolle la acción. La renombramos (como siempre).

Ahora agregamos cuatro sprites correspondientes a los muros defensivos y otro más correspondiente a la nave/tanqueta defensiva dentro de la zona de juego, colocándolos en su sitio. Las torretas se pueden copiar y pegar: después de pegar debemos “arrastrar” el objeto porque de lo contrario se quedarán solapados original y copia y puede que nos den algún problema.

Para alinear o distribuir los espacios de un grupo de elementos, los seleccionamos y pulsamos botón derecho. A través de la opción “Align” podemos alinearlos como queramos. En nuestro caso vamos a seleccionar la opción “Align->Edges->Top” que alienará los bordes superiores de los objetos. Después seleccionamos “Align->Space->Horizontally” para que se distribuyan horizontalmente de manera proporcional.

Debemos tener dos objetos en el proyecto: uno correspondiente al muro y otro a la nave/tanqueta. Recuerda dar nombre a cada uno de ellos (Muro y Tanqueta por ejemplo) que después nos va a hacer falta.

Ya tenemos nuestro sistema defensivo casi al completo, pero aún nos falta lo más importante: el rayo láser.

Agregando proyectiles

Lo primero que hay que saber es que el proyectil es un objeto que no va a estar visible hasta que no lo pongamos en marcha. Por eso lo ubicaremos fuera de la pantalla de juego, concretamente en el lado izquierdo. Le ponemos de nombre Laser.

Una vez creado y renombrado, le agregamos comportamiento (seleccionamos el láser y pulsamos sobre la opción “Behaviors” y después sobre la opción agregar). Elegimos la opción “Bullet”, identificada con la imagen de una bala.

Ejecutamos y vemos como la bala aparece por la izquierda y desaparece por la derecha sin que nosotros hagamos nada. A esto le podemos poner remedio de manera sencilla: seleccionamos la bala y ponemos el estado inicial del comportamiento en desactivado.

Disparando con el teclado

Si probamos ahora ya no veremos la bala por ningún sitio. Hagamos que cuando el jugador pulse el espacio la bala salga desde la nave/tanqueta hacia arriba. Para ello lo primero es añadir el controlador de teclado al juego: insertamos un nuevo objeto y seleccionamos la opción “Keyboard” de la sección “Input”.

Y ahora nos vamos a la hoja de eventos y agregamos un nuevo evento de tipo teclado, subtipo “On key pressed”, elegimos el espacio como tecla a tratar, seleccionamos la nave como origen de la acción y como acción “Spawn another object” (crear un nuevo objeto), seleccionando el láser como objeto a crear. Con todo esto le hemos dicho a Construct 2 que cuando se pulse el espacio se cree un nuevo láser.

El evento debería quedar de la siguiente manera.

Si ejecutamos ahora el resultado no será el esperado. Al pulsar el espacio “aparece” el rayo láser en el centro de la tanqueta, pero está detrás y no se ve. Ni se mueve.

Tenemos, por lo tanto dos desafíos: hacer que el láser aparezca en el cañón de la tanqueta y que salga disparado. De lo contrario estamos en manos de los alienígenas y eso no puede ser. Jamás lo consentiremos.

Los puntos de la imagen (otra vez)

Si nos fijamos en el evento, cuando dice “Laser on layer 0 (image point 0)”, está ubicando el láser en el punto 0 de la nave/tanqueta. El punto 0 es el centro (salvo que lo cambiemos). Como no lo queremos cambiar lo que vamos a hacer es crear otro punto, (al que llamaremos Canyon), que posicionaremos justo en el extremo del cañón de la nave/tanqueta.

Para ello hacemos doble clic sobre la nave/tanqueta, pulsamos sobre la acción “Set origin and image point” y después sobre el símbolo de agregar (más).

Creamos un nuevo punto en el extremo del cañón y le llamamos “Canyon”.

Modificamos la acción del evento, haciendo doble clic sobre ella, y cambiamos el valor 0 por 1 en el campo “Image point”.

Si ejecutamos el juego ahora y pulsamos el espacio, nos aparece el láser en el extremo de la nave tanque.

Pero sigue sin moverse. ¿Por qué? Es fácil: le dijimos al proyectil que el estado era “desactivado” por lo que ahí está, quieto, acatando nuestras instrucciones. Para cambiar esto vamos a agregar una nueva acción al evento que tenemos creado para que además de mostrar el rayo láser lo ponga en marcha.

Vamos a la hoja de eventos, hacemos clic sobre “Add action”, seleccionamos el rayo láser, la acción “Set enabled” de la categoría “Bullet” y seleccionamos el valor “Enabled” al desplegable “State”. Pulsamos “Done” y probamos.

¿Se mueve? Horizontalmente, pero se mueve. No está mal, pero así vamos a destruir pocos alienígenas.

Volvemos a seleccionar el rayo láser y cambiamos el valor del ángulo (“Angle”) a 270 grados y el valor de “Set angle” a No para que el proyectil no cambie de posición.

Probamos y ahora deberíamos poder disparar sin fin. Las balas saldrán desde el extremo del cañón y subirán hasta el espacio exterior, en línea recta y a la velocidad indicada en la propiedad “Speed”, que podremos modificar para que los rayos vayan más despacio o más rápido.

Destruyendo objetos inútiles

Sólo nos falta decir a los proyectiles que cuando salgan de la zona de juego desaparezcan y no destruyan lo que no deben. Esto se consigue agregando un nuevo comportamiento al rayo láser. Se llama “Destroy outside layout”, que significa que se destruya cuando salga de la zona de juego y es muy útil para ahorrar recursos del dispositivo en el que finalmente juguemos.

 Una vez hecho esto nos ponemos manos a la obra de hacer que la nave se mueva con las teclas del cursor. Veremos lo sencillo que es.

Usando el teclado para controlar un personaje

Construct 2 automatiza mucho el control de personajes. El mecanismo más sencillo es agregando un comportamiento de la sección “Movements” (movimientos). Existen unos cuantos tipos y todos son útiles y divertidos: el tipo “Car” que hará que el personaje se mueva como un coche o el tipo “Platform” que hará que hará que se comporte como Mario (el de Super Mario Bros.) o Sir Arthur (el de Ghosts'n Goblins). Son sólo dos ejemplos.

Nosotros elegiremos “8 Direction”. Este tipo de movimiento nos permite mover el personaje en todas las direcciones. Si probamos el juego podemos mover la nave con las teclas del cursor[5]. Nos permite movernos por toda la zona de juego, lo cual es muy interesante pero no para este juego, ya que en Space Invaders la nave/tanqueta sólo se podría mover de derecha a izquierda y viceversa. Corrijamos esto.

Seleccionamos la nave y nos fijamos en la pestaña de propiedades, concretamente en la sección “Behaviours” y dentro de ella en la sección “8Direction”.

Vemos que podemos modificar unos cuantos parámetros que definen como se va a comportar el movimiento del personaje. Nosotros indicaremos que la dirección del movimiento va a ser en horizontal (“Directions”-“Left&right”) y que el ángulo de posición del nave/tanqueta no se va a modificar (“Set angle” – “No”) mientras nos movemos, ya que de lo contrario la nave/tanqueta a veces estará boca abajo y eso no es muy útil.

Probemos ahora. Ya tenemos una nave que se mueve en horizontal con las teclas del cursor y que es capaz de disparar poderosos rayos láser. Rayos láser que son capaces de atravesar como si nada los muros de defensa… Corrijamos esto antes de continuar.

Agregamos un nuevo evento en la hoja de eventos. Este evento, en resumen, dirá lo siguiente: cuando el láser choque contra un muro haremos que el láser desaparezca. No lo va a destruir, sólo desaparecerá. Esto aporta dificultad al juego, ya que para disparar a los alienígenas tendremos que estar a descubierto, exponiendo la integridad de nuestra nave/tanqueta. Los juegos fáciles son aburridos.

La hoja de eventos ahora estará así:

La tanqueta se mueve con las teclas del cursor, la barra de espacio permite disparar rayos láser y estos no atraviesan los muros… en completo silencio. Vale, sí, es cierto. En el espacio el sonido no tiene un medio físico para transmitirse y no se escuchan los rayos láser, pero esto es un videojuego y el sonido es muy importante.

Agregando sonido

Construct 2 nos sugiere que utilicemos los siguientes formatos: wav, flac, ogg y mp4. Admite más, pero estos son sus favoritos. En este caso vamos a utilizar un fichero con la extensión ogg que reproduce un sonido que bien podría ser el que emiten los rayos láser.

En la carpeta de proyecto, pulsamos el botón derecho sobre la carpeta “Sounds” y seleccionamos “Import sounds”. Con esto agregaremos el fichero de sonido al proyecto. Seleccionamos ahora el fichero y si aparece una ventana de importación pulsamos sobre el botón “Import” sin más (no vamos a entrar en detalles, para eso está el manual de referencia). Pulsamos ahora sobre el botón “Ok” y aparecerá el fichero seleccionado en la carpeta “Sounds” del proyecto.

Ahora tenemos que agregar el manejador de sonido al proyecto. Lo hacemos pulsando con el botón derecho sobre el layout y ejecutando la acción “Insert New Object”. Elegiremos el objeto “Sound” de la sección “Media”. En la carpeta “Object types” del proyecto deberá aparecer ahora un nuevo elemento con el nombre “Audio”.

Y por último agregar una nueva acción al evento que captura la pulsación del botón de espacio para que, además de lanzar el rayo láser haga que este suene.

Vamos a la hoja de eventos y agregamos una nueva acción al evento “On Barra Espaciadora pressed” que diga  a Construct 2 que reproduzca sonido del láser: pulsamos “Add action” para agregar la acción, seleccionamos el objeto “Sound” como fuente de la acción y pulsamos “Next”, seleccionamos la acción “Play” de la sección “General” y seleccionamos el fichero de sonido que agregamos anteriormente en la lista desplegable “Audio file”. El resto de las opciones las dejamos como están (hacen referencia a si queremos que el sonido se reproduzca una vez tras otra y al volumen del mismo).

Cuando pulsemos el botón “Done” (quiere decir que hemos terminado) la hoja de eventos debe quedar de la siguiente manera:

Probamos ahora y vemos como nuestro sistema de defensa está a pleno rendimiento y que los rayos láser suenan a… victoria. Necesitamos unos enemigos de manera urgente. Vamos a crearlos.

Las animaciones

Existe un supuesto “defecto” en el ojo humano denominado “persistencia retiniana” que hace que cuando miramos una imagen durante una pequeña fracción de segundo seamos capaces de ver la imagen durante un instante más del que estuvo visible. Muy poco tiempo, eso sí, pero suficiente para sacar partido a esa memoria visual. Basándose en esta característica del ojo los hermanos Lumière crearon el cine: la rápida exposición de fotografías estáticas hace que el espectador vea una imagen en movimiento. La ciencia, al parecer, ha desmontado esta teoría y ha achacado el efecto al cerebro. En cualquier caso la realidad es que si mostramos una secuencia de imágenes a la velocidad adecuada podemos conseguir un efecto visual que permita al espectador ver imagen en movimiento. Algo que en los juegos llamamos animación.

En Space Invaders la animación más vistosa se encuentra en los alienígenas. Estos se desplazan lateral y verticalmente, pero además mueven sus patitas a cada paso que dan. Nuestra versión de Space Invaders no será completa, pero los alienígenas van a moverse como deben.

Si nos fijamos en la imagen siguiente, veremos (separados por una raya vertical) los dos frames (las dos imágenes) que van a formar la animación. Están en un único fichero png (y no tienen raya vertical) y el fondo es transparente[6].

Lo que vamos a hacer es insertar en el juego un nuevo objeto de tipo “Sprite”. Una vez hecho, y antes de abandonar el editor de la imagen, pulsar el botón derecho sobre la ventana “Animation frames”, importar los frames con la opción “From sprite strip…” y seleccionamos el fichero png que tiene los frames.

Ahora hay que indicar la distribución de los frames en la imagen. En este caso tenemos dos celdas horizontales y una vertical.

Pulsamos el botón OK y en la ventana “Animation frames” deberán aparecer tres frames. El primero está vacío. Pulsando con el botón derecho lo podemos eliminar, para que la animación no haga después cosas raras.

Por último, modificamos las propiedades de la animación para que esta se desarrolle sin fin. En la ventana de propiedades, modificamos el valor de la propiedad “Loop” y le asignamos el valor “Yes”.

Cerramos el editor de imagen y cambiamos el nombre al nuevo objeto (le ponemos “Alien” por nombre).

Si ejecutamos ahora veremos como el alienígena mueve las patitas. La velocidad de la animación se puede cambiar modificando el valor de la propiedad “Speed”.

Lo siguiente que vamos a hacer es crear más bichos invasores. Esto es muy, muy, muy fácil. En la ventana de edición copiamos y pegamos el objeto que queremos copiar y colocamos cada  uno más o menos en su posición. Utilizaremos las ayudas que proporciona Construct 2 para colocarlos correctamente como hicimos con los muros defensivos.

Hagamos una fila de 6 alienígenas. Los seleccionamos todos, pulsamos el botón derecho sobre uno de los invasores y seleccionamos la opción “Align-Edges-Top” para alinearlos todos por la parte superior y después la opción “Align-Space-Horizontally” para que se distribuyan horizontalmente de tal manera que dejen el mismo espacio entre todos.

Ahora tenemos seis extraterrestres con bastante mal aspecto moviendo sus patitas en la pantalla, pero están muy estáticos y así no va a ser difícil acabar con ellos. Hagamos ahora que se muevan horizontalmente. Para ello tendremos que utilizar los ticks del juego. ¿Los ticks?

Los tick

Los videojuegos tienen corazón. ¿Lo sabías? Hay algo dentro que marca el ritmo al cual se mueven los extraterrestres invasores. Un diapasón que va repitiendo una vez tras otra un pulso constante (tick, tick, tick, tick…) y que consigue que los objetos del juego no se detengan aunque nosotros dejemos de jugar.

Construct 2 nos permite crear acciones asociadas al evento tick. Esto es perfecto para hacer que elementos del juego que no van a ser manejados por el jugador tengan vida propia. En nuestro caso, los alienígenas son unos candidatos perfectos. Vamos a decir a Construct 2 que cada vez que haya un tick los alienígenas se muevan de izquierda a derecha o de derecha a izquierda, según sea necesario.

Tenemos que tener en cuenta que cuando los invasores lleguen al extremo de la pantalla deben comenzar a desplazarse hacia el lado contrario, para que no desaparezcan del juego. Esto se puede hacer así.

Agregamos un evento de la categoría “System” llamado “Every tick”. Como acción vamos a modificar el objeto Alien, en concreto el valor de la propiedad X, indicando que el nuevo valor es Alien.X+1. Esto quiere decir que cada tick, la nueva posición horizontal del invasor será la posición que tenía anteriormente desplazado un pixel hacia la derecha. Algo así:

Una ejecución rápida nos permite ver cómo los alienígenas se desplazan de izquierda a derecha, pero se van del juego y no vuelven. Tiene solución, aunque esto puede no ser tan sencillo. Nos vamos a ayudar de las variables globales, para saber hacia dónde tenemos que mover a los invasores.

Las variables globales

Una variable global es, en programación, un papel en el que podemos anotar cualquier información que se puede consultar en cualquier momento. Algo así como una agenda para los desmemoriados.

Los programas de ordenador utilizan variables todo el rato, porque es así cómo son capaces de recordar cosas. Construct 2 es un programa de ordenador que nos evita la tarea de escribir nuevos programas para hacer juegos… pero sigue siendo un programa. Y a veces necesita variables para tener memoria.

Las variables globales se crean en la hoja de eventos, haciendo clic en el botón derecho del ratón sobre la hoja.

Vamos a crear una variable global con nombre “direccion”, tipo “Numbre” y valor inicial 1. Este valor será 1 si los alienígenas se desplazan de izquierda a derecha y -1 si van de derecha a izquierda.

Y ahora lo que vamos a decir a Construct 2 es en qué momento debe cambiar la dirección. Agregamos un nuevo evento en la hoja de eventos. Lo asociamos con el objeto “Alien”, seleccionamos “Compare X” de la sección “Size & Position” y en la ventana de la condición indicamos “> Greater than” y “LayoutWidth-50”.

Como acción seleccionaremos “System” como elemento sobre el que actuar, y después la opción “Set Value” de la sección “Global & local variables”. En la ventana de asignación del valor seleccionamos la variable global “dirección” y le indicamos el valor “-1”.

Con esto estamos diciendo a Construct 2 que cuando el objeto “Alien” (cualquiera de las copias) esté a menos de 50 píxeles del extremo derecho de la zona de juego se cambie el valor de la variable “dirección” a -1.

Ahora modificamos la acción que asociamos al tick del juego, la que incrementaba en 1 el valor de la posición X del objeto “Alien”. En lugar de sumar 1, vamos a sumar el valor de la variable “dirección”. Así cambiará de valor y en lugar de sumar, restará cuando llegue al extremo derecho.

Incluimos un nuevo evento, el correspondiente al cambio de sentido cuando los invasores se están dirigiendo hacia la izquierda. En este caso le decimos que cuando la posición de los invasores sea menor que 50 la dirección pase a tomar un valor 1 (que vuelvan hacia la derecha).

Nuestra hoja de eventos debe quedar así:

Si ejecutamos ahora el juego, los extraterrestres deben moverse lateralmente sin llegar a salir de la zona de juego. También mueven sus patitas, los muy invasores. Por supuesto, con las teclas del cursor podemos mover horizontalmente la nave/tanqueta y disparar, provocando el relajante sonido del rayo láser. Rayo láser que no atraviesa los muros de defensa pero sí los invasores…

Agregamos un nuevo evento. Dirá a Construct 2 que cuando el láser colisione con el Alien lo destruya. También le vamos a decir que destruya el láser, porque de lo contrario quedará raro ver cómo el rayo destruye al invasor y sigue su camino destruyendo todo a su paso. Demasiado poder destructor para una nave/tanqueta tan sencilla.

Este nuevo evento debe tener este aspecto:

Si queremos agregar un sonido de explosión ya sabemos cómo hacerlo: agregamos un nuevo sonido al proyecto y una nueva acción al evento de la colisión anterior.

Esto ya tiene pinta de video juego. Vamos a hacer una última mejora. Incluiremos una pantalla de fin de juego que se mostrará cuando hayamos terminado con los invasores.

Cambiando de layout

Lo primero que hemos de hacer es crear otra pantalla (layout). Esto se hace desde la carpeta de proyecto, pulsando con el botón derecho sobre la carpeta “Layout” y seleccionando la acción “Add layout”. Le damos un nombre (GameOver), un tamaño (800,800) y modificamos el margen (0,0).

Agregamos un objeto de tipo texto con el mensaje “Game Over”. Le damos la posición, tamaño, color, tipo de letra, etc., que más nos guste y vamos otra vez a la hoja de eventos.

En la hoja de eventos creamos una nueva variable global. Esta se va a llamar “enemigos” y llevará la cuenta del número de enemigos que aún nos queda por destruir. Inicialmente le damos el valor de 6.

Agregamos una nueva acción al evento de la colisión. Será una acción de sistema que reste 1 a la variable “enemigos”. Así decimos a Construct 2 que cada vez que un rayo láser impacte con un objeto “Alien” reste 1 a la variable “enemigos”. Cuando “enemigos” llegue a 0 es cuando mostraremos la pantalla de fin de juego.

Agregamos, por lo tanto, un nuevo evento que diga a Construct 2 que cuando “enemigos” tenga valor 0 cambie el “layout” visible.

Si ejecutamos ahora el juego veremos lo siguiente:

-          Unos muros de defensa capaces de detener los disparos de los rayos láser.

-          Alienígenas invasores que se desplazan de derecha a izquierda (y viceversa) mientras mueven las patitas.

-          Una nave/tanqueta que podemos mover de derecha a izquierda con las teclas del cursor.

-          Una nave/tanqueta con la que podemos disparar rayos láser con el espacio. Este rayo láser:

Suena como un rayo láser, desafiando las leyes de la física del espacio.

No atraviesa los muros.

Destruye alienígenas invasores.

-          Además, nuestro juego muestra una pantalla de fin de juego cuando acabamos con todos los malvamos invasores.

Según el original nos faltaría por añadir al juego:

-          Puntuación.

-          Más invasores. Varias filas de ellos.

-          Hacer que los invasores disparen.

-          Hacer que los invasores desciendan poco a poco, con el objetivo de invadir el planeta.

-          Hacer que los muros de defensa se destruyan cuando reciben impactos de los rayos láser.

Lo vamos a dejar aquí. Hemos aprendido un buen montón de cosas pero no nos vamos a entretener más en un juego tan sencillo. Si te apetece puedes intentar terminarlo por tu cuenta. Algunas cosas son más fáciles que otras, pero todo lo que hagas te servirá para aprender más aún.

Divertido ¿verdad?

Super Mario Land

Aunque parezca increíble, no tengo ningún vínculo infantil con Mario, el popular personaje de Shigeru Miyamoto (creador de sagas tan célebres como las de Donkey Kong, The Legend of Zelda o la del propio Mario). En la época en la que aparecieron los juegos protagonizados por Mario yo me divertía con un Amstrad CPC 464 con monitor de fósforo verde y, aunque había una versión del Mario Bros. para este ordenador, nunca jugué a ella. Después me pasé al PC y durante unos cuantos años las consolas y sus juegos me interesaron más bien poco.

A Super Mario Land jugué de mayor (de muy mayor, y sigo haciéndolo en la Game Boy Color) y me parece el ejemplo perfecto de lo que debe ser un juego de plataformas. Por eso lo he incluido en este libro. Además, la historia comienza con la llegada de un extraterrestre de nombre Tatanga que tiene bastantes malas intenciones (como todos los extraterrestres). Así que no tenemos excusa. Defendamos nuestro planeta.

Como en las anteriores versiones, sólo vamos a realizar un pequeño conjunto de las muchas funciones que tiene el juego. Contamos con un pequeño segmento del mapa del reino conocido como Birabuto (el primer mundo que aparece en el juego, representación de un desierto sospechosamente parecido al egipcio).

También contamos con el sprite de Mario (no es el de la versión de Game Boy, sino el de Super Mario Bros. de la NES de Nintendo, pero supongo que a nadie le importará mucho).

Por supuesto disponemos de un enemigo. En este caso es un champiñón conocido como Goombo (Chibibo en Japón). No lo vamos a animar, pero sí queremos que se dé un paseo por el mapa y que Mario lo tenga que saltar para no perder una vida.

Con estos elementos (y con la melodía del “Birabuto Kingdom”) vamos a trabajar en hacer una pequeña versión de este enorme juego.

Lo primero que haremos será, como siempre, crear el proyecto. El “Window Size" lo vamos a fijar en 500,400, y el único layout de 2135 de ancho (es el ancho del mapa) y 400 de alto (es el alto de mapa).

A continuación, insertamos el sprite con la imagen de fondo y bloqueamos la capa. Lo habitual.

Lo siguiente que hay que hacer es determinar las zonas físicas de la escena del juego: el suelo y los objetos sólidos. Para ello utilizaremos sprites vacíos a los que daremos la misma dimensión que aquello que queremos convertir en elementos sólidos del juego.

Las tuberías:

El suelo:

Un muro:

Una plataforma:

En definitiva, cualquier elemento del juego contra el que podamos impactar y provocar algún efecto:

Pero estos elementos no son todos iguales, por lo que tendremos que asignar a cada uno de ellos el comportamiento adecuado. Veamos qué comportamiento (“behavior”) conviene en cada caso y cómo conseguir ahorrar esfuerzos en esta fase del trabajo.

En esta pequeña y sencilla versión de Super Mario Land, el suelo, las tuberías o los muros no se van a poder atravesar. Mario deberá saltarlos para poder seguir avanzando. Con crear un sprite vacío que ocupe el espacio del objeto (una tubería, por ejemplo) e indicar que el comportamiento es sólido (Solid) será suficiente.

La clonación objetos

¿Y cómo ahorrar esfuerzos? Es sencillo: una vez hemos creado el primer sprite y le hemos dado un nombre, hacemos copiar y pegar y modificamos el tamaño y la posición del sprite clonado para que ocupe el área del siguiente elemento al que queremos dotar de estado sólido.

Repetimos esta operación tantas veces como sea necesario (para el suelo, para los muros y las tuberías, pero no para las plataformas). De esta manera tendremos un único objeto en la sección de “Object Types” (en el ejemplo está identificado como “Transparente”) que representará a todos los sprites transparentes sólidos sobre los que Mario podrá sostenerse y a los que no podrá atravesar.

En este punto disponemos de un suelo firme sobre el que caminar y unos obstáculos que saltar. Pero ¿y qué hacemos con las plataformas?

El comportamiento “Jumpthru”

En un juego típico de plataformas, hay un suelo, unos objetos sólidos que habrá que superar de alguna manera y unas plataformas que se encuentran suspendidas de no se sabe dónde y sobre las que el personaje deberá de saltar para poder avanzar por el escenario.

Estas plataformas pueden tener un comportamiento específico que no se da en el mundo real: si se cae encima la plataforma es sólida y sostendrá al personaje; si se salta desde abajo se puede atravesar. Esto es lo que se conoce como Jumpthru, y Construct 2 tiene un comportamiento específico para conseguir este efecto.

Sólo debemos crear un sprite vacío, darle la posición y el tamaño de la plataforma y dotarlo del “behavior” “Jumpthru”. Construct 2 hará el resto. Además, podemos clonar el objeto para ahorrar trabajo, como hicimos en los objetos sólidos.

¿Y de Mario no hablamos? Por supuesto que sí. Mario es el personaje principal de nuestro juego y le tenemos que dedicar un buen rato para conseguir animarlo y que se comporte como el fontanero saltarín que es.

Animando al fontanero

Como vimos anteriormente, el sprite que vamos a utilizar para Mario está compuesto por cuatro imágenes que se agrupan en tres estados: en reposo (imagen 1), caminando (imagen 2 y 3) y saltando (imagen 4). Veamos el modo en el que crear las animaciones.

Agregamos un sprite vacío y hacemos doble click sobre él para abrir el editor de imágenes. En la ventana “Animations” aparecerá una animación identificada como “Default”. Pulsando con el botón derecho sobre dicha animación, seleccionamos “Rename” y le damos como nombre “Quieto”. Después pulsamos con el botón derecho debajo del nombre de la animación y pulsamos “Add animation” para crear una nueva animación, que llamaremos “Anda”. Creamos una tercera animación y le ponemos por nombre “Salta”.

Una vez creadas las animaciones vamos a indicar qué imágenes las componen.

Seleccionamos la animación “Quieto” y pulsamos con el botón derecho sobre el espacio en blanco de la ventana “Animation frames” y seleccionamos la opción “From sprite strip…” del menú “Import frames”.

Seleccionamos la imagen de Mario con los cuatro estados e indicamos que está compuesta por cuatro celdas horizontales y una celda vertical. Además, marcamos la opción “Replace entire existing animation” para crear la animación desde cero.

En la ventana “Animation frames” aparecerán los cuatro estados de Mario en los cuatro frames que hemos indicado durante la importación.

Dado que estamos creando la animación en la que Mario aparece en reposo (“Quieto”) debemos eliminar los frames que no queremos. Pulsamos con el botón derecho y seleccionamos la opción “Delete” sobre los frames 1, 2 y 3.

Ahora hacemos lo mismo con las otras animaciones: la seleccionamos, importamos la imagen con los cuatro estados, indicamos que tiene cuatro celdas horizontales y una vertical y eliminamos los frames que sobran (en la animación “Anda” nos quedaremos con los frames 1 y 2; en la animación “Salta” nos quedaremos con el frame 3).

Cerramos el editor de sprites y proporcionamos a Mario el comportamiento “Platform”.

Este comportamiento provoca que el personaje se mueva con las teclas derecha e izquierda del cursor y que salte según las leyes de la física de los juegos de plataforma al pulsar la tecla superior del cursor.

Si ejecutamos en este momento veremos a Mario en reposo (porque la animación “Quieto” está en primer lugar). También podremos comprobar que si pulsamos las teclas derecha e izquierda del cursor, Mario se desplaza por la pantalla, pero no cambia la animación. También podremos observar que si lo desplazamos hacia la derecha desaparece de la zona de juego.

Esto último lo podemos resolver fácilmente: agregando a Mario el comportamiento “ScrollTo”, que hace que la pantalla se desplace junto con el personaje.

Si probamos el juego ahora comprobaremos que Mario se desplaza con las teclas del cursor, hace que se mueva la pantalla según avanza o retrocede y, llegado el caso, se choca con los objetos sólidos que indicamos anteriormente.

Nos falta hacer que se ejecute la animación correcta cuando camina y cuando salta. Para ello, Construct 2 nos proporciona un buen conjunto de eventos relacionados con el comportamiento de tipo “Platform”, y que hacen referencia a si el personaje está en movimiento, salta o toca el suelo.

Vamos a indicar cada uno de los eventos a agregar y a explicar qué consecuencias tendrá.

El primero de los eventos es un evento compuesto: Mario está en movimiento (“Platform is moving”) y está en el suelo (“Platform i son floor”). La acción consistirá en asignar a Mario la animación “Anda” desde el principio (“Set animation to “Anda” (play from beggining)).

El segundo de los eventos consiste en indicar que cuando Mario esté en un salto (“Platform is jumping”) la animación que corresponde activar es “Salto”.

En tercer lugar hay que indicar que cuando Mario se detenga (“Platform On stopped) la animación a activar es “Quieto”.

En cuarto lugar, y para evitar que la animación del salto se quede fija, hay que indicar que cuando Mario “aterrice” tras un salto (“Platform On landed”) la animación a activar sea “Quieto”.

Por último, tenemos que resolver un pequeño problema, y es que el sprite de Mario mira hacia la derecha pero queremos que cambie de sentido cuando nos desplazamos hacia la izquierda. Tiene fácil solución.

Agregamos al juego el objeto “Keyboard” y añadimos dos eventos a la hoja de eventos. En el primero de ellos, indicamos que cuando se pulsa la flecha izquierda se modifique Mario para que lo que vemos sea su reflejo (“Set Mirrored”). En el segundo evento indicamos que cuando se pulse la tecla derecha no veamos el reflejo sino el original (“Set Not mirrored”). Estos dos eventos harán que las animaciones vayan en el mismo sentido en el que se desplaza Mario.

Prueba ahora el juego. Tiene un parecido asombroso con los juegos de verdad… porque casi es un juego de verdad. Sólo le falta un enemigo y algo de música.

Animando al enemigo

El primer enemigo que aparece en Super Mario Land es el champiñón conocido como Goombo. Si alguien me dijese que un champiñón es violento y peligroso me echaría a reír. En cambio, si  me dicen que el champiñón tiene origen extraterrestre la cosa cambia. Goombo es peligroso y su contacto es letal. En el juego original, Mario debe esquivarlo o saltar sobre él para destruirlo. En nuestra versión no será peligroso, simplemente se desplazará por la pantalla.

En primer lugar agregamos un sprite con nombre “Enemigo” y con la imagen de Goombo en la zona elevada del juego, tal y como se ve en la captura siguiente.

Le proporcionamos un comportamiento de tipo “Platform” (para que le afecten las mismas reglas que a Mario) y le programamos el siguiente evento.

En dicho evento estamos indicando que cuando Mario sobrepase la unidad 1000 de la zona de juego el enemigo se desplace hacia la izquierda 1 unidad por cada tick del juego. ¿Recuerdas los tick?

Ejecuta el juego y verás como a partir de cierto punto aparece Goombo. No está animado ni es peligroso. Te dejo a ti darle más funcionalidad si quieres. Ya deberías saber cómo.

¡Música, maestro!

La melodía del “Birabuto Kingdom” es una de mis favoritas y no quería terminar esta versión reducida de Super Mario Land sin explicar cómo agregar música a un juego.

La música y los sonidos se tratan de manera distinta por parte de Construct 2. La música se reproduce en streaming. Los sonidos en cambio se cargan en memoria para que se ejecuten en el preciso instante en el que se necesitan. Por lo tanto no tienen el mismo tratamiento. Ya vimos cómo se agregan sonidos en los ejemplos anteriores. Veamos ahora cómo agregar música.

Debemos, en primer lugar, insertar el objeto “Audio” en el juego si no lo hemos hecho anteriormente. A continuación, tenemos que pulsar con el botón derecho sobre la carpeta “Music” del proyecto, seleccionar la opción “Import music” y elegir el archivo de audio que queremos incluir en nuestro juego. En este ejemplo hemos utilizado un archivo con la extensión “ogg” que es la preferida por Construct 2.

Por último debemos agregar un evento para que la melodía comience a sonar cuando comienza el juego. El evento elegido en este caso se llama “On start of layout” de la categoría “System” y la acción es “Play birabuto_kingdom not looping at volumen 0 dB”.

Con “Not looping” indicamos que queremos que la canción suene una única vez, aunque podríamos decir a Construct 2 que la reproduzca una vez tras otra.

El volumen a “0 dB” no quiere decir que no suene, sino que se reproducirá sin amplificar, con el volumen que tenga el propio fichero de audio.

¡Lo conseguimos! Es una pequeña versión de un gran juego, pero no nos llevado mucho tiempo. Esto nos da una idea del potencial de este gran programa de creación de videojuegos que es Construct 2. Sólo nos queda practicar y trabajar duro. Podemos conseguir resultados asombrosos.

Exportar el proyecto

¿De qué sirve hacer un videojuego si no lo juega nadie? Construct 2 nos da varias alternativas para publicar el juego: para móviles, para Windows, para Chrome,… Nosotros vamos a hacer la que considero más sencilla para compartir nuestros juegos con los demás: generar un proyecto web.

Para exportar a HTML5 hay que seleccionar la opción “Export Project” del menú “File” e indicar que queremos exportar a Web como “HTML5 website”.

Seleccionamos la carpeta de destino y dejamos el resto de opciones tal y como vienen. Seguro que en un manual de referencia explican para qué sirve cada una de ellas.

Una vez exportado el proyecto sólo tenemos que subirlo a un servidor web y compartir el enlace a la página principal.

Y habremos creado y publicado nuestro videojuego. Casi nada.

Game Over

Mi anhelo adolescente, como el de tantos otros jóvenes de mi generación,  era crear videojuegos, pero en su momento no pude disponer de los medios para ello. Eran otros tiempos: los ordenadores eran caros y la información poca y difícil de conseguir. Por suerte todo eso ha cambiado y vivimos una época en la que el aprendizaje es sólo una cuestión de voluntad y tiempo.

Cuando descubrí Construct 2 experimenté sentimientos contradictorios. Por una parte, cierta decepción al ver lo que sencillo que podría resultar crear un videojuego, lo que equivale a eliminar la magia que conlleva hacer algo realmente difícil. Pero otro parte comprendí que los chavales (incluyo las edades  comprendidas entre los 8 y los 88 años) que actualmente sueñan con crear videojuegos van a poder llevar a cabo sus proyectos.

El volumen de negocio que mueve la industria de los videojuegos es enorme y no para de crecer. La competencia, por lo tanto, es dura. Pero no toda actividad humana debe ser rentable en términos económicos. Jugar con videojuegos es muy divertido, pero hay un grupo de personas que disfrutan tanto o más creándolos: músicos, diseñadores de niveles, artistas gráficos, programadores,… Mis objetivos al escribir este libro han sido aprender, divertirme y tratar de empujar a otros a pasarlo bien creando. Los dos primeros ya los he logrado. El tercero depende de ti.

Fernando Paniagua
Alcorcón, 27 de julio de 2015

Otras obras del autor

“La Red del Mal”. Un apasionante thriller sobre los peligros de Internet.

“La Reina de los Muertos”. Misterios, historia, enigmas ancestrales…

Puedes obtener más información sobre estas novela en la web del autor:

http://www.fernandopaniagua.com

[1] Puedes encontrar los proyectos, las versiones realizadas y los recursos utilizados en la web del autor (www.fernandopaniagua.com).

[2] Puedes jugar a Pong en la web de Atari (www.atari.com)

[3] Si te equivocas y creas mal el evento no te preocupes: haz clic con el botón derecho sobre dicho evento, selecciona la opción de borrado (“delete”) y vuelve a empezar. Equivocarse en el proceso de aprendizaje es normal (e incluso necesario).

[4] La traducción al inglés de la palabra comportamiento es behavior.

[5] Haz clic sobre la zona de juego del navegador si la nave/tanqueta no se mueve. A veces es necesario.

[6] En realidad los alienígenas son de color blanco. En la imagen se muestran así para que se puedan ver con claridad.