Como hacer un juego de naves
Volvemos con un nuevo tutorial para crear un shotter, el típico juego de naves que estamos acostumbrados a ver. Voy a basarme en la demo que ya viene en Game Maker Studio de Scrolling Shotter, porque las mecánicas son las mismas y es un juego completito.
La diferencia será que aquí lo tendréis paso a paso como hacer todas las acciones y objetos, y así vemos como funciona las acciones Drag & Drop. También veremos que es posible crear un juego completo sin escribir ni una línea de código.
El juego es de aviones y está ambientado en la II Guerra Mundial, se llama 1945. Nuestro juego será muy parecido a esto:
Creación del proyecto y primeras imágenes
Creamos un proyecto nuevo llamado 1945. Si abrimos el programa, en la ventana que aparece podemos ir a la Pestaña New. Si ya tenemos el programa abierto, vamos al menú File – New Project para que aparezca la misma ventana.
Aquí tenéis los recursos para este proyecto.
Añadimos un sprite nuevo, desde el menú Resources – Create New Sprite. Lo llamaremos spr_myplane. En vez de dar le al botón Load sprite, para cargar una imagen o varias para hacer la animación, le damos al botón Edit sprite. En la ventana de edición, le damos al menú File – Create from Strip y buscamos la imagen myplane_strip3.png. Se abrirá la siguiente ventana:
Le ponemos los valores indicados en la imagen, porque está imagen de tipo strip tiene en cuenta los márgenes. Le damos al botón OK i marcamos Show Preview para ver que la animación es corrects,
Aquí es importante que el sprite tenga los valores de origen X/Y a 32, para que se coloque en el centro de la imagen. También podemos hacerlo con el botón Center. Nuestro primer sprite está perfecto para nuestro juego, y hemos aprendido a añadir un recurso de otra manera diferente. Si quieres saber más sobre strips, pincha en el enlace.
Creamos el fondo en movimiento de nuestro juego
Ahora añadimos tres islas, que se moverán en el fondo. Añadimos los sprites spr_island1, spr_island2 y spr_island3, dónde las imágenes correspondientes son island1.png, island2.png y island3.png.
Ahora creamos un fondo llamado bck_water, se puede hacer en el menú Resources – Create Background. La imagen es el fichero water.png.
Vamos a ver el efecto de movimiento que hace el background en la room. Creamos una room, desde el menú correspondiente, y le llamamos room_main. En la pestaña Background añadimos el recurso anterior en el botón que vemos. Como tenemos marcadas las opciones Tile Hor. y Tile Vert. el fondo se repetirá por toda la ventana. ahora le damos a Vert. Speed un valor de 2. Así se moverá nuestro fondo.
Podemos darle a Run o la tecla <F5> para ejecutar como queda.
Ahora añadimos el movimiento de las islas, pero no serán un fondo. Lo haremos como si fueran objetos, y además, aprovecharemos la herencia de objetos para poner las mínimas acciones posibles.
Creamos un objeto nuevo llamado obj_island_parent. Añadimos un evento Create, y arrastramos la acción Vertical Speed con un valor de 2. Añadimos un evento Step, i en él pondremos varias acciones que serviran como condición. Vamos a la pestaña Control i usamos Test Variable. En variable le ponemos y, en value ponemos room_height y en operation greather than. Quedará así
Hemos usado una cuantas variables de sistema, y existen muchas más que podemos usar una gran lista que nos ofrece el sistema.
Ahora usaremos una función de sistema (las variables almacenan valores y las funciones ejecutan acciones). Añadimos al mismo evento una acción Jump Position con valor x random(room_width) y valor y -65. El evento Step quedará así:
La función de sistem usada es la función random()
, ya hablamos en su momento de la aleatoriedad en los juegos y como usarla.
Este objeto será el objeto padre de las tres islas. Ahora creamos los tres objetos islas con sus sprites correspondientes. Creamos un obj_island1, y le asociamos el sprite spr_island1. Le ponemos un depth, profundidad, muy grande, por ejemplo de 1000. Ahora elegimos el objeto obj_island_parent en el botón Parent. Hacemos dos objetos más con los sprites restantes.
Cuando tengamos los tres objetos de islas, los añadimos en la room. En la pestaña Objects de la room anterior, elegimos cada uno y hacemos click en la room que vemos (en cualquier lugar). Quedará más o menos así:
Ejecutamos para ver el resultado. Vemos el fondo en movimiento, las islas con la misma velocidad y cuando desaparecen de abajo vuelven a aparecer arriba, pero en una posición distinta, ¡Objetivo conseguido!
Objeto avión: como se mueve
Creamos el objeto obj_myplane, que es el que tendrá todo el control de movimiento. Le asignamoe el primer sprite que hemos creado, spr_myplane, i le ponemos un depth de -100, para controlar un poco la profundidad. Ahora creamos los eventos de movimiento.
Añadimos un evento keyboard, eligiendo la primera opción <Left>, i le asignamos una acción Test Variable, donde variable será x y value 40. Operation será greather than. Añadimos la acción Jump position, dónde x será -4, y será 0 y, muy importante para que funcione, marcamos el check Relative. Quedará de la siguiente manera:
Haremos lo mismo con el evento Keyboard, con la opción <Right>, añadimos un Test Variable, variable será x, value será room_width – 40 y operation smaller than. En Jump position pondremos x 4, y 0 i el check Relative marcado. Quedará así:
Ahora añadimos el evento Keyboard, con la opción <Up>. Las acciones serán éstas:
Y lo mismo con Keyboard, opción <Down>, En la imagen vemos como queda:
Añadimos el objeto obj_myplane en la room y vemos los resultados. Podemos probar el movimiento que hemos codificado (aunque no hemos escrito ninguna línia de código=).
Crear copia de seguridad de lo que hemos hecho hasta ahora
De vez en cuando es bueno hacer una copia de seguridad sobre los progresos que vamos haciendo. Se puede hacer rapidamente desde el menú File – Export Project. Le pondremos el nombre 1945_1.
Seguimos completando el juego.
Añadir más sprites
Una lista de todos los sprites que añadimos ahora:
- spr_life, del fichero life.png. Lo cargaremos con el botón Load sprite.
- spr_menu, de bottom.png.
- spr_enemy1, que será del strip enemy1_strip3.png. Recordemos como se cargan los strips más arriba. Su tamaño es de 32 píxeles y no tiene píxeles de sepapración. Le damos al botón Center para centrar los valores de X/Y.
- spr_bullet, de bullet.png. X/Y con valor 16.
- spr_explosion1, del fichero explosion1_strip6.png. Otra manera de cargar strips. Si hacemos Load Sprite y elegimos el fichero, cargará correctamente la animación. ¿Porqué? Porque el fichero ya contiene el número de imágenes (es el último número).
- spr_explosion2, del fichero explosion2_strip6.png.
Ahora creamos el objeto obj_bullet del sprite . Le añadimos el evento Create. Añadimos la acción Vertical Speed con valor -8. El número negativo indica que irá hacia arriba. Controlamos también que cuando esté fuera de la room se elimine. Lo hacemos con el evento Outside Room, y la acción Destroy the instance.
¿Cuando aparece este objeto? Cuando el objeto obj_myplane dispare, así que lo relacionamos con una tecla, la tecla <Space>. Pero tendremos que tener cuidado para que no dispare continuamente, así que le daremos un tiempo entre bala y bala, de unos dos segundos. Crearemos una variable para este control (yo lo llamo variables semáforos).
Volvemos al objeto del avión obj_myplane. Creamos la variable can_shoot en el evento Create, de tipo booleano.
Añadimos el evento Keyboard, con la opción Space, y quedará con las siguientes acciones:
En la acción de Create Object quedará así
añadimos el evento Alarm 0, dónde pondremos can_shoot = true
Podemos probar los resultados.
Creando enemigos
¡Empezamos a añadir enemigos! Creamos el objeto obj_enemy1, con el sprite spr_enemy1. En el evento Create añadimos un Vertical Speed de 4.
Usaremos la misma lógica que con las islas: aparecerá un avión en una zona aleatoria cuando salga de la room. Lo haremos de otra manera diferente, para ver que se puede llegar al mismo resultado por otro camino. En el evento Step, pondremos las siguientes acciones:
Crearemos un objeto controlador, que será el que crea estosa viones enemigos. El nuevo objeto obj_controller_enemy tendrá un evento Create, dónde añadimos un Create Instance con estos valores:
añadimos tambiñen una alarma de valor 200. Añadimos su evento Alarm, dónde hará lo mismo que el evento Create. Cambiamos el valor de la alarma a 500, para que no aparezcan tan rápido.
Si añadimos este último objeto a la room, veremos que aparecen los enemigos. Falta resolver que pasa con las balas que hemos creado, así que haremos explosiones en los aviones.
Creando explosiones
Añadimos dos recursos nuevos de sonido. Vamos a Resources – Create Sound y añadimos el sonido snd_explosion1, con si fichero snd_explosion1.wav. Haremos lo mismo con snd_explosion2.
Hacemos un objeto obj_explosion1, con su sprite asociado spr_explosion1. Añadimos el evento Animation End, y una acción de Destroy Instance.
Vamos al objeto obj_enemy1 que hemos creado y hacemos un nuevo evento Collision, que asociamos con obj_bullet.
- Añadimos la acción Play Sound, que está en la pestaña main1, y elegimos snd_explosion1 y loop false.
- Añadimos la acción Destroy Instance, pero marcamos Other (que es el objeto elegido en en el evento, en este caso obj_bullet).
- Añadimos Create Instance i elegimos obj_explosion1. En x/y ponemos 0 y marcamos la casilla Relative.
- Ahora necesitamos eliminar el avión. Se podría hacer con Destroy Instance, pero haremos lo mismo que cuando sale de la pantalla. Ponemos el mismo Jump Position del evento Outside Room.
- Como premio por destruir el avión enemigo, añadiremos 5 puntos a la puntuación global. Se hace desde la pestaña score, añadiendo Set Score, i como new score 5. Recuerda de marcar Relative para que se acumule.
Todas las acciones quedara de la siguiente manera:
Hemos hecho la colisión con una bala, ahora añadiremos algo parecido con el objeto obj_myplane, que destruirá el objeto del jugador. Antes creamos el objeto obj_explosion2 y le ponemos el sprite spr_explosion2. Volvemos al objeto obj_enemy1 y añadimos otra Collision, pero con obj_myplane.
- Añadimos la acción Change Instance de la pestaña main1, dónde change into elegimos obj_explosion2. Es importante especificar la acción como Other.
- Añadimos Play Sound con snd_explosion2.
- La última acción será Destroy Instance, para destruir el avión enemigo.
Ahora en el obj_explosion2 añadiremos un mensaje y volveremos a reiniciar el juego.
- Añadimos el evento Animation end i creamos la acción Display Message, dónde añadimos el textro GAME OVER.
- Añadimos Destroy Instance y Restart Game.
Podemos probar los resultados. Con todos los cambios hechos, toca exportar el proyecto como 1945_2.gmz.
Usar variables globales del sistema
Ahora utilizaremos unas variables globales que vienen en el programa. Estas variables controlan la puntuación, que lo acabamos de usar, las vidas y la energia.
Creamos un objeto que se dirá obj_controller_life, que tendrá un Depth de -10000, para que lo que dibujemos esté siempre por encima de todos los objetos. No utilizaremos ningún sprite, ya que usaremos el evento Draw para pintar todo lo necesario. Añadimos este evento y vamos a la pestaña draw para elegir Draw Sprite. Pondremos estos parámetros:
Ahora elegimos la puntuación Score. Pondremos el color de texto añadiendo la acción Set Color, eligiendo el color blanco para las letras. Vamos a la pestaña correspondiente y elegimos la acción Draw Score. Elegimos estos parámetros:
Haremos lo mismo con las vidas Life. Antes tenemos que asignarle un número, asi que creamos el evento Create, y añadimos Set Life, como valor le ponemos 3. Ahora volvemos a Draw y añadimos Draw life images con estos valores:
Ahora añadimos la energía, que corresponde con la variable Health. Añadimos la acción Draw Health con estos parámetros:
Añadimos el objeto obj_controller_life a la room y vemos los resultados.
Ahora vamos a usar la energía y las vidas en el juego. Cambiamos algunas acciones ya creadas, para que cuando el avión choque con el enemigo restará energía, y cuando no tenga pierda una vida. Vamos al objeto obj_enemy1 y en su evento Collision con obj_myplane cambiaremos sus acciones. Se parecerá mucho con el evento Collision de obj_bullet, ya que hará el sonido de la explosión, llamará al objeto correspondiente y haremos que vuelva a aparecer el avión.
Añadimos la acción Set Health, con un valor de -30 y marcando Relative para tener en cuenta el valor actual. Quedará así:
Ahora controlaremos que pasa cuando te quedas sin energía. Lo centralizaremos todo con el objeto de control obj_controller_life. Añadimos el evento No More Health y estas acciones:
¡La acción Change instance se tiene que relacionar con el objeto obj_myplane!
En el objeto obj_explosion2, en vez de reiniciar el juego, volveremos a crear obj_myplane.
Finalmente, volvemos al objeto obj_controller_life, añadimos el evento No More Lives, mostramos el mensaje GAME OVER y reiniciamos el juego.
Ejecutamos para ver los resultados. Exportamos también el proyecto como 1945_3.gmz.
Completamos el juego
En el proyecto 1945_4.gmz hemos añadido más enemigos que disparan y aparecen dependiendo de los tiempos que hemos puesto en obj_controller_enemy. Podéis echar un ojo a los eventos y acciones que hay creados.
Ahora añadimos una acción nueva a este objeto. Haremos que cuando hayamos superado los 400 puntos, obj_myplane pueda disparar dos balas, dónde sale una en cada ala. También pondremos que si supera los 1000 puntos, también dispare una tercera. Las acciones quedan de la siguiente manera:
Si quieres, puedes cambiar la manera en que salen los aviones. Aora mismo lo tenemos programados con alarmas i salen aleatoriamente. Pero también podemos usar timelines para controlar exactamente los tiempos y la manera en que saldrán. Añadimos un timeline nuevo, que llamaremos tml_enemies. Le damos al botón Add y dejamos el Step 0. Creamos un obj_enemy1 como siempre al azar. Creamos un Step 100, dónde creamos dos obj_enemy1, com x 200 y 400 respectivamente, y valor y -32. Ahora en el Step 200 añadimos 6 instancias del mismo objeto, pero variables la x: 200, 260, 320, 380, 440 i 500.
De esta manera podemos añadir todos los objetos que queremos, y en el Step que queramos. En el último Step que añadimos al timeline, podemos mostrar un mensaje que ponga Has sobrevivido a todos los ataques y un Restart Game. Para poder ejecutar el timeline, iremos al obj_controller_enemy, eliminamos las acciones y los eventos de alarma y añadimos la acción Set timeline de la pestaña main2. Los parámetros son:
También hay que tener en cuenta de dejar el evento Step de cada obj_enemy, para que no aparezca otra vez cuando salga de la room. Lo que se puede hacer es sustituir el Jump Position por un Destroy Instance.
El proyecto con timelines podéis exportarlo como 1945_5.gmz.
Muy buen tutorial!
Porfavor podrias hacer un tutorial de como hacer un rpg, me ayudarias mucho.
Gracias
Buenas!
Podría hacer un tutorial, pero creo que va a ser dificil de superar el que hace Héctor.
Videos de como hacerun juego RPG
¡Ya me dirás si te gusta!
Oye, que no me sale. Que en cuanto el avion enemigo sale de la room, me dice que he sobrevivido a todos los ataques. PERO AQUI QUE PASA!?. Gracias
Este mensaje lo ponemos al final del TimeLine. Dependiendo de lo largo que sea tu timeline y de cuantos enemigos hayas puesto, te aparecerá antes o después.
No puedo hacer dispare el aeroplano. Hice lo que menciionas pero no funciona, te dejo una captura de pantalla, que sería lo más adecuado,
http://i1138.photobucket.com/albums/n526/phurya425/01_zpsjkcruv8a.png
http://i1138.photobucket.com/albums/n526/phurya425/02_zpsoog8pyuf.png
http://i1138.photobucket.com/albums/n526/phurya425/03_zpsietwzglg.png
http://i1138.photobucket.com/albums/n526/phurya425/04_zpsbmqjjcmj.png
Revise varias veces, pero algo se me está pasando por alto.
Espero que puedas ayudarme.
Hola Syru.
Todos esos eventos y acciones tienen que ir al objeto obj_myplane, no al de obj_bullet. Lo relacionado con la variable can_shoot es del avión, no de la bala.
He modificado un poco el texto para que quede más claro.
como hago que no dispare continuamente? no sale
Tienes que mirar la parte de alarmas del avión.
¿como hacemos para que el avion no se vaya del room?
En principio, si ponemos lo que pone en la sección Objeto avión: como se mueve no se va de la room, porque controlamos el ancho y el alto de la room.
Tengo problemas para lo de disparar. Al crear el evento can_shoot siempre me da fallos. Cuando no meto ninguna variable (y por tanto, no hay espera entre bala y bala) no tengo problema
Arreglado. Tenía marcado “relative”. A todo esto, ¿para qué sirve esa opción?
Relative
sirve para acumular su valor.Hola no me aparece la accion “Jump To position” me aparce esta “Move Towards” que tiene el mismo Icono que el Jump To position
ayuda plox
Creo que el nombre se ha cambiado a Jump to point.
hola tengo un problema y es que los enemigos no se repiten es decir pasa los primeros que pongo pero no salen mas
Si no se repiten es que no has puesto la alarma en el objeto obj_controller_enemy. Mira que lo tengas bien.
Podrias hacer este ejemplo en GML?
q empece a usar el GameMaker con GML y quiero seguir comprendiendo
Gracias
Estoy usando la version de Game Maker Studio 2
Algunos acciones y eventos, estan cambiados el nombre o hay que hacerlo de otra manera, fui encontrando la manera de hacerlo
hasta que llegue a la parte del tutorial con los eventos:
evento No More Health
evento No More Lives
que al parecer, no estan en el DnD del Game Maker Studio 2
Hay manera de utilizar estas de alguna manera o emularlas en la nueva version?, ya que no puedo usar esos eventos, ni hacer que se actualize el panel de vidas y health
Deberías controlarlo desde el evento Step, con la variable que utilices para las vidas o el Health.