Anuncios

Bienvenidos sean a este post, hoy nos centraremos en como manejar a nuestro personaje en el nuevo juego.

Anuncios

En el post anterior establecimos la base de nuestro juego, tambien creamos dos objetos y establecimos una base de prueba, hoy nos centraremos principalmente en el objeto del jugador, obj_Jugador, donde lo editaremos y agregaremos un evento de tipo Create, una vez hecho agregaremos el siguiente codigo:

image_speed = 0;
vel_hor = 0;
vel_vrt = 0;
Anuncios

La primera es una variable interna para establecer que la velocidad de imagen sera de 0, es decir que estara inactivo al momento de crear el objeto, en este proyecto a diferencia de los anteriores no usaremos a vspeed y hspeed sino que utilizaremos dos variables para hacer la misma tarea, en este caso seran vel_hor para hspeed y vel_vrt para vspeed, por ahora las iniciaremos con un valor de 0, lo siguiente sera agregar un evento Step, una vez hecho le pasaremos este codigo:

if (place_meeting(x, y + 10, obj_Plataforma))
{
	vel_vrt = 0;
	sprite_index = spr_jugador_camina;
	image_speed = 0;
}
Anuncios
Anuncios

En este caso agregaremos un condicional para verificar las colisiones, si observan no usamos ninguno de las funciones anteriores, en cambio usamos a place_meeting y esta funcion no devuelve una instancia como los otros sino que nos devolvera true si hay colision y false mientras no la haya, en este caso pasamos los ejes X e Y a este ultimo lo incrementamos en 10 para que este por arriba, por ultimo le pasamos el objeto a verificar la colision, en caso de ser verdadero vamos a establecer a vel_vrt en 0 para detener la caida, tambien establecemos a sprite_index para asignar un nuevo sprite cada vez que nos detengamos y esto es gracias a que sprite_index solamente toma una referencia del sprite que le indiquemos y mientras la image_speed sea igual a 0 solo mostrara el primer frame pero esto nos resultara practico cuando agreguemos un poco mas de codigo, observen como despues seteamos el valor de image_speed en 0 para detenerlo, nuestro siguiente paso sera agregar el siguiente condicional dentro de este ultimo condicional:

	if (keyboard_check_pressed(vk_space))
	{
		vel_vrt = -15;	
	}
Anuncios

En este condicional verificamos que se haya presionado la barra espaciadora, la cual usaremos para salta, en caso de ser verdadero estableceremos el valor de -15 a vel_vrt para que mueva hacia arriba nuestro personaje pero ya veremos esto mas adelante, lo siguiente sera agregar un else if al primer condicional:

else if (vel_vrt < 15)
{
	++vel_vrt;	
}
Anuncios

Este condicional verifica si vel_vrt es menor que 15, esto servira como limite para nuestra variable, pero en caso de cumplirse la condicion incrementaremos el valor de vel_vrt ocasionando que nuestro jugador comience a descender, este condicional quedara de la siguiente manera:

if (place_meeting(x, y + 10, obj_Plataforma))
{
	vel_vrt = 0;
	sprite_index = spr_jugador_camina;
	image_speed = 0;
	if (keyboard_check_pressed(vk_space))
	{
		vel_vrt = -15;	
	}
}
else if (vel_vrt < 15)
{
	++vel_vrt;	
}
Anuncios

Con esto creamos la capacidad de caer a nuestro jugador y agregamos la capacidad de saltar, agreguemos los siguientes condicionales:

if (keyboard_check(vk_right)) vel_hor = 5;
if (keyboard_check(vk_left)) vel_hor = -5;
if (keyboard_check(vk_left) && keyboard_check(vk_right))
{
	image_speed = 0;
	vel_hor = 0;
}
Anuncios
Anuncios

Los primeros dos condicionales verifican si presionamos la flecha a la derecha o la izquierda respectivamente, en el primer caso establece que el valor de vel_hor sea de 5 para incrementar el valor del eje X y en el segundo caso a vel_hor le asignamos el mismo valor pero negativo para que en lugar de incrementar decremente el valor del eje X, por ultimo tenemos un condicional donde verificamos que se hayan presionado las teclas anteriores al mismo tiempo, en caso de ser cierto estableceremos a image_speed y vel_hor con el valor de 0 para detenernos completamente, hasta aca cubrimos la capacidad de poder saltar y desplazarnos a la derecha como a la izquierda pero todavia nos falta un par de cosas mas, nuestro siguiente paso sera el desplazamiento y para ello debemos agregar el siguiente bloque:

if (vel_hor > 0)
{
	image_speed = 0.5;
	image_xscale = 1;
}
else if (vel_hor < 0)
{
	image_speed = 0.5;
	image_xscale = -1;
}
Anuncios
Anuncios

Este condicional verificara el valor de vel_hor para saber si nos estamos desplazando horizontalmente, si el valor fuese 0 indica que no se esta desplazando, en el primer condicional verificamos si es mayor que 0, es decir que tiene un valor positivo y nos desplazamos hacia la derecha, por lo tanto establecera que la velocidad de la imagen (image_speed) sera de 0.5, y estableceremos el valor de image_xscale en 1, esta variable se encarga de la escala horizontal de la imagen, en este caso al ser de 1 establecemos que utilice el 100% de la imagen o como se denomina comunmente su tamaño regular, el siguiente condicional verifica lo opuesto, en este caso si vel_hor tiene un valor negativo lo cual implica que nos estamos desplazando hacia la izquierda, recuerden los condicionales anteriores, y la unica diferencia que tenemos con respecto al bloque anterior es que image_xscale tendra un valor de -1, esto significa que tambien usara el 100% de la imagen pero hara un espejo de la misma invirtiendola, con esta simple mecanica nos ahorramos una imagen y obtuvimos el mismo efecto, ahora agreguemos la siguiente linea:

if (vel_vrt != 0)
{
	sprite_index = spr_jugador_salta;
	image_speed = 0.5;
}
Anuncios

Esta se encarga de cambiar la imagen por la que usamos para representar el salto siempre y cuando vel_vrt sea distinta de 0, esto implica la accion de saltar como de caer, tambien agregamos un valor para image_speed para ver como se mueve nuestro jugador en el aire, solo nos resta un par de lineas mas para desplazarnos y detectar las colisiones tanto horizontales como verticales, comencemos con las horizontales agregando el siguiente bloque:

if (place_meeting(x + vel_hor, y, obj_Plataforma))
{
	while(!place_meeting(x + sign(vel_hor), 
			y, obj_Plataforma))
	{
		x += sign(vel_hor);
	}
	vel_hor = 0;
} 
x += vel_hor;
vel_hor = 0;
Anuncios

En este bloque primero chequeamos si ocurre la coincidencia entre el jugador y la plataforma pero incrementaremos el valor de x con el valor de vel_hor, despues pasamos el eje Y y el objeto a coincidir, en el bloque usaremos un while que se ejecutara mientras place_meeting devuelva false, en este caso usamos sign que solo devuelve tres posibles valores dependiendo del signo que posea el valor que pasemos, por ejemplo:

  • Si fuese 5 el valor, devuelve el valor de 1 porque es positivo
  • Si fuese -5 el valor, devuelve el valor de -1 porque es negativo
  • Si fuese 0 o null, devuelve 0 porque no informamos ningun valor
Anuncios

Mientras esto se cumpla incrementaremos o disminuiremos el valor de X, siempre dependiendo hacia donde nos dirigimos, por fuera del while siempre estableceremos el valor de vel_hor con 0 para detenerlo, por fuera del condicional siempre incrementaremos el valor de x por medio de vel_hor y despues estableceremos a vel_hor con 0 porque de lo contrario seguira caminando solo, ahora agreguemos el bloque para las colisiones verticales:

if (place_meeting(x, y + vel_vrt, obj_Plataforma))
{
	while(!place_meeting(x, y + sign(vel_vrt),
			obj_Plataforma))
	{
		y += sign(vel_vrt);
	}
	vel_vrt = 0;
} 
y += vel_vrt;
Anuncios

Tecnicamente es igual al bloque anterior pero la unica diferencia esta en el incremento, en lugar de hacerlo en el eje X lo hacemos en el eje Y e incrementamos con vel_vrt pero esta vez no pasamos establecemos a vel_vrt con el valor de 0 porque lo hacemos con el condicional del comienzo, veamos el codigo final hasta el momento:

if (place_meeting(x, y + 10, obj_Plataforma))
{
	vel_vrt = 0;
	sprite_index = spr_jugador_camina;
	image_speed = 0;
	if (keyboard_check_pressed(vk_space))
	{
		vel_vrt = -15;	
	}
}
else if (vel_vrt < 15)
{
	++vel_vrt;	
}

if (keyboard_check(vk_right)) vel_hor = 5;
if (keyboard_check(vk_left)) vel_hor = -5;
if (keyboard_check(vk_left) && keyboard_check(vk_right))
{
	image_speed = 0;
	vel_hor = 0;
}

if (vel_hor > 0)
{
	image_speed = 0.5;
	image_xscale = 1;
}
else if (vel_hor < 0)
{
	image_speed = 0.5;
	image_xscale = -1;
}

if (vel_vrt != 0)
{
	sprite_index = spr_jugador_salta;
	image_speed = 0.5;
}

if (place_meeting(x + vel_hor, y, obj_Plataforma))
{
	while(!place_meeting(x + sign(vel_hor), 
			y, obj_Plataforma))
	{
		x += sign(vel_hor);
	}
	vel_hor = 0;
} 
x += vel_hor;
vel_hor = 0;

if (place_meeting(x, y + vel_vrt, obj_Plataforma))
{
	while(!place_meeting(x, y + sign(vel_vrt),
			obj_Plataforma))
	{
		y += sign(vel_vrt);
	}
	vel_vrt = 0;
} 
y += vel_vrt;
Anuncios

Con esto podemos pasar a probar nuestro proyecto para ver como funciona hasta ahora, veamos el siguiente video

Anuncios

En el video podemos observar varios detalles interesantes, el primero como pudimos trabajar con colisiones de otra forma, tambien ahora tenemos animaciones de una forma mas simple y efectiva que trabaja de mejor forma que la anterior.

Anuncios

En resumen, hoy hemos visto agregado el movimiento para nuestro objeto jugador, hemos visto como crear colisiones de otra forma, hemos visto como tener animaciones para nuestro personaje ya sea saltando o caminando sobre la plataforma, espero les haya gustado sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.00