Game Maker #2: Movimientos Básicos y Colisión
Cuando se empieza con Game Maker, generalmente el primer objetivo es hacer mover algo. Hay muchísimos tutoriales por ahí, y hay muchísimas formas de hacer mover a un personaje.
Pero según mi experiencia, muchos de los tutoriales no solo nos enseñan a darle movimiento a un objeto, sino que también nos deja algunos bugs, que en muchos casos, son motivos de dolores de cabeza.
Así que en el siguiente tutorial, no solo enseñaré a dar los movimientos básicos de un juego en 2D, sino que también daré solución a 2 problemas bastante frecuentes : QUEDARSE PEGADO A LAS PAREDES y QUE EL PERSONAJE SE DETENGA AL CAMBIAR RÁPIDAMENTE DE DIRECCIÓN.
Así que empecemos.
Lo primero será tener los sprites de el personaje y del bloque que nos detendrá de las caídas, para ello vayan a Resources/Create Sprite y creen el sprite de ambos.
Ahora creen un objeto de para cada sprite, ya saben .Resources/Create Object, les ponen los nombres que quieran y seleccionan el respectivo sprite. Y con el objeto de Bloque, marcan la casilla "Solid" para evitar que el personaje atraviese el bloque.
Ahora, nos enfocaremos en el personaje, lo primero será crear el evento Create, estableceremos la gravedad y crearemos 3 variables booleanas y las dejamos en falso. Más o menos así:
Las 3 otras variables las creé para que el juego supiera cuando el personaje se mueve a la izquierda (leftmove), a la derecha (rightmove) o salta (jump). Empiezan en false porque al crearse el objeto, este permanecerá estático hasta que le ordenemos que hacer.
Y ya habremos terminado con este evento, en el software deberá verse similar a esto:
Ahora es momento de establecer el movimiento, para ello crearemos los eventos Keyboard/Left y Keyboard/Right. En cada evento estableceremos la velocidad y le diremos al juego que el personaje se está moviendo, para ello usaremos algo como lo siguiente:
hspeed es la variable que usa Game Maker para modificar la velocidad horizontal de un objeto, es igual a un número negativo (como en el ejemplo de arriba) si se mueve hacia la izquierda y es positivo si se mueve hacia la derecha. Ustedes deben poner el valor que quieran, asegurándose de que el número que pongan en left sea el mismo de right pero negativo. Ah, y para los despistados, leftmove es la variable que creamos hace un rato.
En este punto deberán tener dos eventos como estos, para <left> y <right> respectivamente:
Listo, cuándo tengan presionadas las teclas de derecha o izquierda, su sprite estático se moverá, ahora debemos decirle al programa que hacer cuándo dejen de presionarlas. Para ello, haremos uso de los eventos Release/left y Release/right. Y en cada uno, pondremos algo como lo siguiente:
Ejemplo obviamente de Release/left.
Con el condicional if leftmove==true, el software revisa si el personaje se está moviendo hacia la izquierda.
Después de la verificación, el software establece que ya no se moverá hacia la izquierda mediante leftmove=false.
Después viene otro condicional if rightmove==true, esta linea, en este evento, verifica si en el momento de levantar la tecla izquierda se está presionando la derecha, y en caso de que sea así, se ejecutará lo que hay entre los corchetes (en este caso, el personaje se moverá a la derecha con una velocidad de 4). Esto es muy importante, porque suele suceder que en los eventos de Release, solo pongan que el personaje se detenga, siendo molesto, porque muchas veces no tenemos control del orden en que presionamos las teclas y el personaje puede quedarse quieto porque sí.
Lo siguiente es el else, esto significa que en caso de que no se cumpla lo de arriba, se ejecutará la línea en corchetes que sigue, en español, si en el momento de levantar la tecla izquierda, no está presionada la derecha, el personaje se detendrá.
Ahora solo deberán hacer lo mismo, invirtiendo las variables con Release/right, y tendrán 2 eventos como estos:
Enhorabuena, su personaje ya se mueve a derecha e izquierda, y ustedes no tendrán problemas para controlarlo en una superficie plana, lo siguiente será hacerlo saltar. Así que creen un evento con la tecla que quieran... la ruta por lo general es más o menos así Key Press/ Letters /*insterte letra aquí*.
Una vez creado, tienen que poner un código como este:
Según el ejemplo:
Lo siguiente, es hacer por fin, la colisión con el bloque, deberán crear un evento de colisión, Collision/*seleccionan el objeto bloque*, y deberán poner un código similar a este:
¡Explicación! Aquí hay un condicional que verifica 2 cosas (se sabe por los &&), así pues, verifica que se esté saltando con el jump==true, y verifica que se encuentre con otro objeto en la posición que se le indique con place_meeting.
La función place_meeting, requiere que se le indiquen las coordenadas donde hay que verificar la presencia del objeto, y el objeto en cuestión (lo sé, hasta yo me enredé), en este orden: place_meeting(posición en x, posición en y, y el objeto).
En el ejemplo, puse x, que representa la posición x del objeto al que pertenece el evento (el personaje, en este caso), y+15 toma la posición de mi personaje y le suma 15 pixeles, y other, hace referencia al objeto con el que se está colisionando en el evento, en este caso, el susodicho bloque.
Bueno, después de la verificación de que se esté saltando y de que haya un bloque en la posición indicada, jump=false , le dirá al software que ya caímos y que es posible saltar otra vez.
Por último, vspeed=0, hará que siempre que nuestro personaje esté en contacto con el bloque no podrá seguir cayendo. Pero esto implica que si por ejemplo, hay colisión por el lado derecho del bloque, nuestro personaje quedará atascado. Por eso, hay que crear un último evento, pero mientras tanto, verifiquen que su código luzca similar a esto:
El último evento del tutorial es Step, una vez creado, pondremos un código como este bebé:
Pero según mi experiencia, muchos de los tutoriales no solo nos enseñan a darle movimiento a un objeto, sino que también nos deja algunos bugs, que en muchos casos, son motivos de dolores de cabeza.
Así que en el siguiente tutorial, no solo enseñaré a dar los movimientos básicos de un juego en 2D, sino que también daré solución a 2 problemas bastante frecuentes : QUEDARSE PEGADO A LAS PAREDES y QUE EL PERSONAJE SE DETENGA AL CAMBIAR RÁPIDAMENTE DE DIRECCIÓN.
Así que empecemos.
Lo primero será tener los sprites de el personaje y del bloque que nos detendrá de las caídas, para ello vayan a Resources/Create Sprite y creen el sprite de ambos.
Ahora creen un objeto de para cada sprite, ya saben .Resources/Create Object, les ponen los nombres que quieran y seleccionan el respectivo sprite. Y con el objeto de Bloque, marcan la casilla "Solid" para evitar que el personaje atraviese el bloque.
Ahora, nos enfocaremos en el personaje, lo primero será crear el evento Create, estableceremos la gravedad y crearemos 3 variables booleanas y las dejamos en falso. Más o menos así:
leftmove=falseGravity, es una variable predefinida por Game Maker, nosotros le daremos el valor que queramos, teniendo en cuenta que entre más gravedad, más pesado será nuestro personaje.
rightmove=false
jump=false
gravity=1.6
Las 3 otras variables las creé para que el juego supiera cuando el personaje se mueve a la izquierda (leftmove), a la derecha (rightmove) o salta (jump). Empiezan en false porque al crearse el objeto, este permanecerá estático hasta que le ordenemos que hacer.
Y ya habremos terminado con este evento, en el software deberá verse similar a esto:
Ahora es momento de establecer el movimiento, para ello crearemos los eventos Keyboard/Left y Keyboard/Right. En cada evento estableceremos la velocidad y le diremos al juego que el personaje se está moviendo, para ello usaremos algo como lo siguiente:
hspeed=-4
leftmove=true
hspeed es la variable que usa Game Maker para modificar la velocidad horizontal de un objeto, es igual a un número negativo (como en el ejemplo de arriba) si se mueve hacia la izquierda y es positivo si se mueve hacia la derecha. Ustedes deben poner el valor que quieran, asegurándose de que el número que pongan en left sea el mismo de right pero negativo. Ah, y para los despistados, leftmove es la variable que creamos hace un rato.
En este punto deberán tener dos eventos como estos, para <left> y <right> respectivamente:
![]() |
Para la izquierda. |
![]() |
Para la derecha. |
Listo, cuándo tengan presionadas las teclas de derecha o izquierda, su sprite estático se moverá, ahora debemos decirle al programa que hacer cuándo dejen de presionarlas. Para ello, haremos uso de los eventos Release/left y Release/right. Y en cada uno, pondremos algo como lo siguiente:
Ejemplo obviamente de Release/left.
if leftmove==true"¿Qué significa todo esto?", se preguntarán. Daré una explicación en el orden del código.
{
leftmove=false
if rightmove==true
{
hspeed=4
}
else
{
hspeed=0
}
}
Con el condicional if leftmove==true, el software revisa si el personaje se está moviendo hacia la izquierda.
Después de la verificación, el software establece que ya no se moverá hacia la izquierda mediante leftmove=false.
Después viene otro condicional if rightmove==true, esta linea, en este evento, verifica si en el momento de levantar la tecla izquierda se está presionando la derecha, y en caso de que sea así, se ejecutará lo que hay entre los corchetes (en este caso, el personaje se moverá a la derecha con una velocidad de 4). Esto es muy importante, porque suele suceder que en los eventos de Release, solo pongan que el personaje se detenga, siendo molesto, porque muchas veces no tenemos control del orden en que presionamos las teclas y el personaje puede quedarse quieto porque sí.
Lo siguiente es el else, esto significa que en caso de que no se cumpla lo de arriba, se ejecutará la línea en corchetes que sigue, en español, si en el momento de levantar la tecla izquierda, no está presionada la derecha, el personaje se detendrá.
Ahora solo deberán hacer lo mismo, invirtiendo las variables con Release/right, y tendrán 2 eventos como estos:
![]() |
Izquierda. |
![]() |
Derecha. |
Enhorabuena, su personaje ya se mueve a derecha e izquierda, y ustedes no tendrán problemas para controlarlo en una superficie plana, lo siguiente será hacerlo saltar. Así que creen un evento con la tecla que quieran... la ruta por lo general es más o menos así Key Press/ Letters /*insterte letra aquí*.
Una vez creado, tienen que poner un código como este:
if jump==falseComo arriba, tenemos un condicional, if jump==false, verifica si ya se está saltando, y de no ser así, se ejecuta lo que haya entre corchetes abajo. En este caso establecerá una velocidad vertical (vspeed) de -18 (que gracias a la gravedad, será momentánea), y le dirá a Game Maker que ya está en el aire con jump=true. En pocas palabras, el codigo verifica que no se esté saltando ya para poder saltar. Ya que otro error común es no verificar esto antes, he visto juegos donde los personajes saltan infinitamente.
{
vspeed=-18
jump=true
}
Según el ejemplo:
Lo siguiente, es hacer por fin, la colisión con el bloque, deberán crear un evento de colisión, Collision/*seleccionan el objeto bloque*, y deberán poner un código similar a este:
if jump==true && place_meeting(x,y+15,other)
{
jump=false
}
vspeed=0
¡Explicación! Aquí hay un condicional que verifica 2 cosas (se sabe por los &&), así pues, verifica que se esté saltando con el jump==true, y verifica que se encuentre con otro objeto en la posición que se le indique con place_meeting.
La función place_meeting, requiere que se le indiquen las coordenadas donde hay que verificar la presencia del objeto, y el objeto en cuestión (lo sé, hasta yo me enredé), en este orden: place_meeting(posición en x, posición en y, y el objeto).
En el ejemplo, puse x, que representa la posición x del objeto al que pertenece el evento (el personaje, en este caso), y+15 toma la posición de mi personaje y le suma 15 pixeles, y other, hace referencia al objeto con el que se está colisionando en el evento, en este caso, el susodicho bloque.
Bueno, después de la verificación de que se esté saltando y de que haya un bloque en la posición indicada, jump=false , le dirá al software que ya caímos y que es posible saltar otra vez.
Por último, vspeed=0, hará que siempre que nuestro personaje esté en contacto con el bloque no podrá seguir cayendo. Pero esto implica que si por ejemplo, hay colisión por el lado derecho del bloque, nuestro personaje quedará atascado. Por eso, hay que crear un último evento, pero mientras tanto, verifiquen que su código luzca similar a esto:
El último evento del tutorial es Step, una vez creado, pondremos un código como este bebé:
if place_free(x+hspeed*2,y)
{
hspeed=hspeed;
}
else
{
hspeed=0
}
La función place_free, funciona como place_meeting, pero verifica que haya espacio libre en la posición indicada, por lo tanto if place_free(x+hspeed*2,y), verificará que haya espacio libre en tantos pixeles como el doble de la velocidad horizontal sea. En nuestro caso, como nuestro personaje se mueve con una velocidad de 4, verificaremos que haya 8 pixeles de espacio.
hspeed=hspeed, entre los corchetes, significa que mientras haya espacio libre, la velocidad de mantiene. Y si por el contrario, hay un objeto, Game Maker ejecutará la línea dentro del else, en este caso, hará que nuestra velocidad horizontal sea de 0. Osease, nuestro personaje se moverá con naturalidad mientras haya espacio frente a él, pero si hay un bloque, nos mantendremos alejados unos 8 pixeles y no lo tocaremos, por lo tanto no quedaremos atascados y caeremos con naturalidad.
Si se preguntan, por qué en Step y no en algún otro evento, como el de la colisión, la respuesta es simple, cuándo algo está en Step se ejecuta siempre, mientras que en cualquier otro evento deberá cumplir ciertas características y no verificará todo el tiempo, por lo que habrá errores visibles.
Y el código de Step debe verse como así:
Y listo, pueden ejecutar y ver que todo funciona correctamente, la siguiente tarea será hacer los Sprites e implementarlos a nuestros eventos (pero hablaré de eso otro día).
Para el que lo quiera, el proyecto del tutorial está alojado en MEGA, click en la imagen para descargar.
Y, ya saben, cualquier duda, sugerencia o petición, pueden hacerla en los comentarios abajo, o en la pestaña de contacto arriba. Seguiré con los tutoriales de Game Maker, pronto.
Gracias por leer.
hola bro, primero que nada felicidades por la pagina web, te quedo genial! busque un tutorial sobre como darle movimiento a mi personaje en gamemaker studio 2 y me aparecio esta pagina en primer lugar!!! Tengo una duda, cuando termine todos los pasos, quise utilizar el bloque de colisión como pared y como piso para experimentar, y no me puedo mover (creo que es porque detecta que estoy en choque con el objeto aunque estoy arriba de el porque cuando intento saltar, me deja, e incluso puedo moverme para izquierda y derecha en el aire). Lo que necesito saber es como poder moverme a pesar de colisionar con el objeto, yo use un simple bloque de piedra que utilizo como piso. Muchas gracias por leerme, espero tu respuesta!!!
ResponderBorrar