Anuncios

Bienvenidos sean a este post, en este post completaremos nuestro segundo proyecto donde agregaremos la puerta, la llave para abrirla y pasar al siguiente nivel, como ultimo tema hablaremos brevemente sobre los scripts.

Anuncios

Vamos a volver a repetir la experiencia del proyecto anterior donde teniamos una puerta para pasar al siguiente nivel y necesitabamos una llave para abrirla pero esta vez nos quedara mas «monona» en un monton de aspectos, comencemos creando los dos objetos, el primero sera obj_Llave, le asignamos el sprite spr_Llave y lo establecemos como solido, el siguiente objeto sera para la puerta y lo llamaremos obj_Puerta, le asignamos el sprite spr_Puerta y tambien lo hacemos solido, por ultimo ubiquenlo dentro del room, les dejo un ejemplo

Anuncios

Con esto concretado debemos hacer nuestras primeras modificaciones, la primera sera en el objeto obj_Cj, en el evento Create agregaremos las siguiente variables:

tiene_llave = false;
no_estoy = false;
Anuncios

La primera sera la encargada de indicar que tenemos la llave o no y la segunda sera la que indica si estamos o no en la puerta, ya veremos porque, y por ultimo le agregamos una nueva alarma, le asignamos a Alarm2 y luego agregamos la siguiente linea:

no_estoy = false;
Anuncios

Cuando hablemos de la proxima notificacion explicaremos esto, continuando con nuestras modificaciones la proxima sera en el objeto obj_Puerta donde agregaremos un evento de tipo Step y le introduciremos el siguiente codigo:

var jugador = collision_rectangle(
                 x, 
                 y, 
                 x + sprite_width, 
                 y + sprite_height, 
                 obj_Cj, false, false);
 if (jugador != noone && !jugador.tiene_llave 
         && !jugador.no_estoy)
 {
     show_message("Necesitas la llave para abrirla");
     jugador.no_estoy = true;
     jugador.alarm[2] = 30;
 } 
 else if (jugador!=noone && jugador.tiene_llave) 
 {
     room_goto(rm_main);
 }
Anuncios

En este caso volvemos a crear una variable para almacenar a nuestra objeto de colision, recuerden que esta funcion devuelve la instancia que la colisiono, despues utilizamos un condicional donde chequea si la variable es disitinta de noone, no tenemos la llave y no_estoy es distinta de true, si se cumplen estas tres condiciones mostraremos un mensaje sobre que necesitan la llave para abrirla, seteamos a no_estoy como true y usamos la nueva alarma para volverlo a setear en false, esto debemos hacerlo asi porque sino al crear el mensaje nunca podremos despegarnos de la puerta, el siguiente condicional si colisionamos y tenemos la llave, en caso de ser cierto vuelve a cargar el room donde estamos, la siguiente modificacion sera en el objeto obj_Llave.

Anuncios

En este caso agregaremos otro evento Step -> Step y una vez creado agregaremos el siguiente codigo:

var jugador = collision_rectangle(
                 x, 
                 y, 
                 x + sprite_width + 2, 
                 y + sprite_height + 2, 
                 obj_Cj, false, false);
 if (jugador!=noone)
 {
     jugador.tiene_llave = true;
     instance_destroy();
 }
Anuncios

En este codigo volvemos a crear una nueva variable llamada jugador donde volvemos a hacer el procedimiento de collision_rectangle pero observen una curiosidad, en el parametro que equivaldria a right y bottom no solo adicionamos el ancho y alto sino que ademas le sumamos un dos porque este al ser tan chico nos genera inconvenientes para detectar las colisiones, tengan esto en cuenta a la hora de trabajar con objetos muy pequeños, despues tenemos un condicional donde aprovechamos la instancia devuelta y seteamos a tiene_llave como true para indicar que la tenemos y por ultimo destruimos la instancia, nuestra siguiente modificacion sera en el ojbeto obj_Salud, en el evento Draw debemos agregar el siguiente bloque:

if (obj_Cj.tiene_llave == true)
 {
     draw_sprite(spr_Llave,0,135,5);
 }
Anuncios

Este condicional verifica si tiene_llave del objeto obj_Cj es verdadero y procede a dibujar el sprite de la llave al lado de nuestra barra de salud, con esta ultima modificacion podemos pasar a probar nuestro juego mediante el siguiente video

Anuncios

En el video podemos ver como quedo nuestro proyecto terminado, como ahora tenemos una salida que nos llevara a otro nivel siempre y cuando tengamos la llave, tambien vemos que mantenemos todos los aspectos anteriores y agregamos una notificacion cuando tengamos la llave en nuestro poder, obviamente esta es una version muy mejorada con respecto al anterior y si bien muchas de las cosas que agregamos en este juego se podrian haber hecho con Drag and Drop no creo que hubiesen resultado nada facil, aunque este no haya sido tampoco tan facil si pudimos ver a lo largo de la creacion del proyecto como es mas flexible con respecto a la otra forma de crear juegos, pasemos al siguiente tema.

Anuncios

Scripts

Los scripts son tambien componentes de nuestro juego iguales a los objetos, sprites, sonidos y todo lo visto hasta ahora, la diferencia va a radicar es que podremos tener codigo que puede ser reutilizado por el resto de los componentes de nuestro juego y si debemos hacer una comparacion con respecto a otro lenguajes los scripts equivalen a las funciones y esto nos permitira no solamente reutilizarlos sino tambien poder pasarles parametros para que puedan procesar los mismos, para poder entender el concepto vamos a crear uno, para ello deben ir al Asset Browser, seleccionen la carpeta Scripts, hacen click con el boton derecho y seleccionen Create -> Scripts, este nos creara un cuadro vacio con el siguiente codigo

Anuncios

Debemos volver al Asset Browser y renombrar a nuestro script como CaminarEnemigo para que nos quede de la siguiente manera

Anuncios

Como pueden ver en su estructura mas basica es una funcion la cual podra ser accedida por cualquier objeto del programa, vamos a tomar este script y lo usaremos para modificar el desplazamiento de nuestros enemigos, en el objeto obj_BalaEnem vamos a comentar o eliminar el siguiente bloque del evento Step:

switch(patron_caminata)
 {
     case "horizontal":
         if (mi_veloc==2 && !inicio_establecido)
         {
             hspeed = mi_veloc;
             image_index = 3;
         } 
         else if (!inicio_establecido) 
         {
             hspeed = mi_veloc;
             image_index = 2;
         }
         if ((collision_rectangle(
             x,
             y,
             x + 30,
             y + 30,
             obj_Prd, false, false) != noone) ||
             (collision_rectangle(
             x,
             y,
             x + 30,
             y + 30,
             obj_Enemigo, false, true) != noone)
             )
         {
             if (hspeed == 2)
             {
                 image_index = 2;
                 hspeed *= -1;
             } else {
                 image_index = 3;
                 hspeed *= -1;
             }
         }
         inicio_establecido = true;          
         break; 
     case "vertical":
         if (mi_veloc==2 && !inicio_establecido)
         {
             vspeed = mi_veloc;
             image_index = 0;
         } 
         else if (!inicio_establecido) 
         {
             vspeed = mi_veloc;
             image_index = 1;
         }
         if ((collision_rectangle(
             x,
             y,
             x + 30,
             y + 62,
             obj_Prd, false, false) != noone) ||
             (collision_rectangle(
             x,
             y,
             x + 30,
             y + 62,
             obj_Enemigo, false, true) != noone) 
             )
         {
             if (vspeed == 2)
             {
                 image_index = 1;
                 vspeed *= -1;
             } else {
                 image_index = 0;
                 vspeed *= -1;
             }
         }
         inicio_establecido = true;
         break;
 }
Anuncios

Una vez realizado esto vamos a agregar el siguiente codigo en nuestro script:

 function CaminarEnemigo(sentido)
 {
     switch(sentido)
     {
         case "horizontal":
             if (mi_veloc==2 && !inicio_establecido)
             {
                 hspeed = mi_veloc;
                 image_index = 3;
             }
             else if (!inicio_establecido)
             {
                 hspeed = mi_veloc;
                 image_index = 2;
             }   
             break;
         case "vertical":
             if (mi_veloc==2 && !inicio_establecido)
             {
                 vspeed = mi_veloc;
                 image_index = 1;
             }
             else if (!inicio_establecido)
             {
                 vspeed = mi_veloc;
                 image_index = 0;
             }       
             break;
     }
 inicio_establecido = true;
 }
Anuncios

Observen como creamos una funcion llamada CaminarEnemigo con un atributo llamado sentido, al igual que en otros lenguajes el dato que pasemos al llamar la funcion sera recibido por sentido, luego en el bloque tenemos el switch donde verifica a sentido, hara lo mismo que hicimos antes verifica el sentido (horizontal o vertical), luego tiene un condicional donde verifica el signo de mi_veloc y que inicio_establecido este en estado false, si se cumplen las condiciones establecera los valores de hspeed y vspeed (dependiendo del sentido) y el frame correspondiente para cada sentido, por ultimo estableceremos a inicio_establecido como true para que no verifique mas estas condiciones, nuestra siguiente modificacion sera de vuelta en el objeto ebj_Enemigo.

Anuncios

En este objeto debemos agregar primero esta linea luego de generar el valor en alazar en el evento Step:

CaminarEnemigo(patron_caminata);
Anuncios

Como pueden ver estamos llamado al script o funcion, o como prefieran llamarlo, y ahora como argumento le pasamos a patron_caminata para que determine todo lo necesario para que pueda generar el objeto y desplazarlo en alguno de los dos sentidos, el siguiente paso sera agregar el siguiente bloque detras de la linea anterior:

var pared = collision_rectangle(
	x,
    y,
    x + sprite_width,
    y + sprite_height,
    obj_Prd, false, false);
	
var enemigo = collision_rectangle(
    x,
    y,
    x + sprite_width,
    y + sprite_height,
    obj_Enemigo, false, true);
	
if (pared!=noone || enemigo!=noone)
{
	hspeed *= -1;
	vspeed *= -1;
	if (hspeed==2 && patron_caminata=="horizontal")
		image_index = 3;
	else if (hspeed==-2 && patron_caminata=="horizontal")
		image_index = 2;
		
	if (vspeed==2 && patron_caminata=="vertical")
		image_index = 1;
	else if (vspeed==-2 && patron_caminata=="vertical")
		image_index = 0;
}
Anuncios

Primero crearemos dos variables para detectar las colisiones de la pared y de otro enemigo, volvimos a decir que no somos nosotros por medio del true, una vez que los tenemos verificamos si uno u otro es distinto de noone, en caso de ser cierto invertimos tanto a hspeed como a vspeed, lo siguiente seran dos condicionales para verificar el sentido y el signo de la velocidad para cambiar la imagen a la que corresponda tras el rebote, como pueden ver gracias a la nueva funcion reducimos el doble codigo que teniamos anteriormente de orden innecesario, si bien este no fue el mejor ejemplo si nos permite visualizar, de una manera simple, como se pueden reutilizar los scripts facilitando las tareas, si prueban el juego deberia funcionar como antes pero veamos como quedo el codigo de nuestro evento Step:

var alazar = irandom(60);
CaminarEnemigo(patron_caminata);

var pared = collision_rectangle(
	x,
    y,
    x + sprite_width,
    y + sprite_height,
    obj_Prd, false, false);
	
var enemigo = collision_rectangle(
    x,
    y,
    x + sprite_width,
    y + sprite_height,
    obj_Enemigo, false, true);
	
if (pared!=noone || enemigo!=noone)
{
	hspeed *= -1;
	vspeed *= -1;
	if (hspeed==2 && patron_caminata=="horizontal")
		image_index = 3;
	else if (hspeed==-2 && patron_caminata=="horizontal")
		image_index = 2;
		
	if (vspeed==2 && patron_caminata=="vertical")
		image_index = 1;
	else if (vspeed==-2 && patron_caminata=="vertical")
		image_index = 0;
}
 
if (alazar==0)
{
	if (patron_caminata=="horizontal" && mi_veloc==2)
	{
		equis = other.bbox_right;
		ye = other.bbox_top + (sprite_height / 2);
	} 
	else if (patron_caminata=="horizontal" && mi_veloc==-2)
	{
		equis = other.bbox_left;
		ye = other.bbox_top + (sprite_height / 2);
	}
	else if (patron_caminata=="vertical" && mi_veloc==2)
	{
		equis = other.bbox_left + (sprite_width / 2);
		ye = other.bbox_bottom;
	}
	else
	{
		equis = other.bbox_left + (sprite_width / 2);
		ye = other.bbox_top;
	}
	var bala = instance_create_depth(equis, ye, 1, 
						obj_BalaEnem);
	with(bala)
	{
		hspeed = other.hspeed;
		vspeed = other.vspeed;
		speed = 10;
		audio_play_sound(snd_Laser,0,false);
	}
}
Anuncios

Con esto hemos terminado nuestro segundo proyecto, faltaron algunos detalles que pueden agregar tales como la colision para los enemigos y la puerta, un sonido para cuando cambiamos de cuarto, o tal vez algun que otro detalle que crean conveniente, por ultimo les dejo el proyecto para que puedan compararlo con el de ustedes:

Anuncios

En resumen, hoy hemos completado nuestro proyecto con las llaves y puertas para pasar al siguiente nivel, hemos agregado la notificacion de cuando no tenemos la llave y hemos agregado la capacidad de mostrar cuando tengamos la llave en nuestro poder y por ultimo hemos visto una breve explicacion sobre que son los scripts, como funcionan y como pudimos implementar uno en nuestro segundo proyecto, 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

Anuncio publicitario