Anuncios

Bienvenidos sean a este post, hasta el post anterior tenemos un juego casi completo pero todavia no hemos completado el tema de las colisiones y cuando finaliza el juego, lo cual veremos en el dia de hoy.

Anuncios

Nuestra primera modificacion sera en el objeto del jugador donde iremos al evento Step y agregaremos el siguiente condicional:

if (place_meeting(x, y, clase_enemigo)) instance_destroy();
Anuncios

En este caso usamos un place_meeting para detectar si colisionamos contra algun miembro de la clase enemiga y en caso de ser asi procedemos a eliminar la instancia de la nave, no es perfecta pero funcionara para nuestros requerimientos por el momento, si lo chequean observaran que la nave desaparece cuando colisiona contra los enemigos y dependiendo del angulo con los lasers enemigos y/o misiles, pasemos a la siguiente modificacion.

Anuncios

En este caso trabajaremos sobre el objeto enemigo, obj_Enemigo, para darle la posibilidad de desplazarse a los enemigos que se encuentran o genera el jefe, para ello debemos tomar el siguiente condicional del evento Step:

if (instance_exists(obj_Nave))
{
	if (distance_to_object(obj_Nave) <= 200)
	{
		speed = 0;
	
		if (puede_disparar)
		{
			bala_uno = instance_create_depth(x, 
					y, 0, obj_laser_enemigo);
			bala_dos = instance_create_depth(x,
					y, 0, obj_laser_enemigo);
		
			with(bala_uno)
			{
				motion_set(other.image_angle,10);
				image_angle = other.image_angle;
			}
		
			with(bala_dos)
			{
				motion_set(other.image_angle + 180, 10);
				image_angle = other.image_angle;
				image_xscale = -1 * other.bala_uno.image_xscale;
			}
		
			alarm[0] = 30;
			puede_disparar = false;
		}
	}
	else
	{
		dir = point_direction(x, y, obj_Nave.x, obj_Nave.y);
		
		if ((dir >= 315 || dir <= 45) &&
			!collision_rectangle(x+16,y-16,x+26,y+16,
				clase_enemigo, false, true)) ||
			(dir > 45 && dir <= 135 && 
			!collision_rectangle(x-16,y-26,x+16,y-16,
				clase_enemigo, false, true)) ||
			(dir > 135 && dir <= 225 &&
			!collision_rectangle(x-26,y-16,x-16,y+16,
				clase_enemigo, false, true)) ||
			(dir > 225 && dir <= 315 && 
			!collision_rectangle(x-16,y+16,x+16,y+26,
				clase_enemigo, false, true))
		{
			motion_set(dir, 3);
		}
		else
		{
			speed = 0;
		}
	}
}
Anuncios

Al cual modificaremos de la siguiente manera:

if (place_meeting(x, y, obj_Jefe))
{
	y += 3;
}
else if (instance_exists(obj_Nave))
{
	if (distance_to_object(obj_Nave) <= 200)
	{
		speed = 0;
	
		if (puede_disparar)
		{
			bala_uno = instance_create_depth(x, 
					y, 0, obj_laser_enemigo);
			bala_dos = instance_create_depth(x,
					y, 0, obj_laser_enemigo);
		
			with(bala_uno)
			{
				motion_set(other.image_angle,10);
				image_angle = other.image_angle;
			}
		
			with(bala_dos)
			{
				motion_set(other.image_angle + 180, 10);
				image_angle = other.image_angle;
				image_xscale = -1 * other.bala_uno.image_xscale;
			}
		
			alarm[0] = 30;
			puede_disparar = false;
		}
	}
	else
	{
		dir = point_direction(x, y, obj_Nave.x, obj_Nave.y);
		
		if ((dir >= 315 || dir <= 45) &&
			!collision_rectangle(x+16,y-16,x+26,y+16,
				clase_enemigo, false, true)) ||
			(dir > 45 && dir <= 135 && 
			!collision_rectangle(x-16,y-26,x+16,y-16,
				clase_enemigo, false, true)) ||
			(dir > 135 && dir <= 225 &&
			!collision_rectangle(x-26,y-16,x-16,y+16,
				clase_enemigo, false, true)) ||
			(dir > 225 && dir <= 315 && 
			!collision_rectangle(x-16,y+16,x+16,y+26,
				clase_enemigo, false, true))
		{
			motion_set(dir, 3);
		}
		else
		{
			speed = 0;
		}
	}
}
else
{
	speed = 0;	
}
Anuncios
Anuncios

Si observan las dos modificaciones son minimas, la primera es que agregamos un condicional donde verificamos por medio de place_meeting si el enemigo coincide con el jefe y en caso de ser verdadero desplazamos tres posiciones para abajo, luego el condicional que teniamos se transformo en un else if pero internamente sigue exactamente igual aunque despues de este agregamos un else para establecer un speed con el valor de 0, es decir que si no colisiono con el jefe o no esta la nave se detendra absolutamente todos los enemigos menores.

Anuncios

Para la siguiente modificacion vamos a trabajar con el objeto del jefe, vamos a modificar el evento Step para dejar que sea heredero y para ello haremos click con el boton derecho sobre este y seleccionaremos Override Event, esto nos limpiara el evento y le agregaremos el siguiente codigo:

if (ps < 1)
{
	instance_create_depth(0,0,0,obj_destruir_enemigos);
	instance_destroy();
}
Anuncios

En este codigo chequearemos si ps es menor que 1, en caso de ser verdadero creara una instancia de un objeto que aun existe pero pronto agregaremos y explicaremos para luego eliminar a la instancia del jefe, pasemos a crear nuestro nuevo objeto.

Anuncios

Volvemos a crear un objeto como estuvimos haciendo hasta ahora, lo llamaremos obj_destruir_enemigos tal como lo informamos antes y una vez generado le agregaremos un evento Create con la siguiente linea:

alarm[0] = 5;
Anuncios

Esta linea solo establecera un demora de 5 pasos en nuestro room, luego crearemos un evento Step donde agregaremos el siguiente codigo:

if (instance_number(clase_enemigo) > 1)
{
	with(instance_nearest(x, y, clase_enemigo))
	{
		instance_destroy();
	}
}
else
{
	instance_destroy();
}

alarm[0] = 5;
Anuncios
Anuncios

Este condicional verifica si la cantidad de instancias del objeto clase_enemigo es mayor a 1, en caso de ser verdadero por medio de un with chequeamos cuales son las instancias mas cercanas (nearest) en la posicion x e y de clase_enemigo y procedemos a destruir la instancia de lo contrario nos destruimos a nosotros mismos, por ultimo utilizamos la alarma de nuevo con el valor de 5 para generar una pequeña demora y se puede destruir de manera eficiente a todas las instancias enemigas, con esto ya tenemos un gran avance en nuestro juego pero nos faltan un par de detalles, el primero va a ser en nuestro jefe.

Anuncios

Volveremos a nuestro objeto de jefe y dado que ahora no es heredero directo del evento Step, dado que lo reescribimos, vamos a modificar el como se aparece nuestra instancia y para ello agregaremos en el evento Step el siguiente condicional:

if (y - 48 < 0)	y++;
Anuncios

En este condicional verificamos si el valor actual de la variable y menos 48 es menor que 0 procede a incrementar el valor de y, nuestro siguiente paso sera modificar la creacion del jefe y para ello debemos ir al objeto de control, obj_control, en el evento Step donde tenemos el condicional que verifica si llegamos a los 1800 pasos iremos a esta linea:

instance_create_depth(512, 0, 0, obj_Jefe);
Anuncios

Y la modificaremos de la siguiente manera:

instance_create_depth(512, -48, 0, obj_Jefe);
Anuncios

Esto nos creara un objeto por fuera del room pero ahora al no pertenecer al evento maestro no desaparecera por estar por fuera del room, por lo tanto debera bajar tranquilamente para posicionarse en su lugar inicial, por ultimo vamos a agregar una ventana para indicar nuestra victoria o derrota, para ello debemos seguir en nuestro objeto de control y agregaremos un nuevo evento de tipo Draw, una vez generado le agregaremos el siguiente codigo:

draw_set_color(c_dkgray);
draw_set_halign(fa_center);

if (!instance_exists(clase_enemigo) && pasos > 1800)
{
	draw_text(room_width / 2, room_height / 2,
		"Ganaste!!! Gamer Pro Koreano");
} 
else if (!instance_exists(obj_Nave))
{
	draw_text(room_width / 2, room_height / 2,
		"Perdiste!!! Alto manco sos!");
}
Anuncios

Con las primeras dos lineas estableceremos el color de nuestro dibujo, luego diremos su ubicacion horizontal en el room para este caso usaremos el centro de la pantalla, existen en total tres valores para esta funcion:

  • fa_left, para ubicarlo a la izquierda de la pantalla
  • fa_center, para el centro de la misma
  • fa_right, para ubicarlo a la derecha de la pantalla
Anuncios

A su vez podemos ser mas preciso agregando la funcion draw_set_valign que es exactamente lo mismo a la anterior pero para alinearlo verticalmente con estos tres valores disponibles:

  • fa_top, para ubicarlo en la parte superior de la pantalla
  • fa_middle, para ubicarlo en el medio de la pantalla
  • fa_bottom, para ubicarlo en la parte inferior de la pantalla
Anuncios
Anuncios

Con esto explicado despueste tenemos un condicional donde verifica que no exista ninguna instancia del objeto clase_enemigo (recuerden que estan todos loe enemigos vinculados a ella) y que pasos sea mayor a 1800 para simbolizar que tambien ya se genero al jefe, en caso de cumplirse ambas condiciones significa que salimos victoriosos y procedemos a dibujar en pantalla un mensaje para nuestro exito, pero despues tenemos otro condicional donde verificamos que no exista la nave del jugador y en este caso simboliza nuestra derrota por haber sucumbido ante la horda de enemigos, y para ello mostraremos el mensaje correspondiente, en ambos casos usamos a draw_text y para ubicarlo utilizamos la mitad del ancho y el alto del room para que este bien centrado siendo la unica variante entre ambas instrucciones el mensaje a mostrar, con esto podemos probarlo mediante el siguiente video

Anuncios

Ahora si nuestro juego esta mucho mas completo pero todavia nos faltan un par de detalles que terminaremos de pulir en el proximo post, aunque en el video pueden observar como ahora nuestro jefe desciende lentamente para acomodarse, luego se activa y en este caso vemos el mensaje de derrota cuando somos alcanzados.

Anuncios

En resumen, hoy hemos visto las colisiones que nos faltaban para poder dar el aspecto de juego, hemos creado de forma temporal la desaparicion de nuestra nave ante un contacto, hemos mejorado la forma de aparecer nuestro jefe, tambien hemos agregado la destruccion de todos nuestros enemigos en caso de derrotar al jefe y por ultimo una pantalla de notificacion para la victoria o la derrota, 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