Anuncios

Bienvenidos sean a este post, hasta ahora hicimos al personaje jugable, el laberinto y las colisiones, pasemos a agregar los enemigos.

Anuncios

Nuestro primer paso sera crear un nuevo objeto al cual llamaremos obj_Enemigo, a este lo estableceremos como solido y por ultimo le asignamos el sprite llamado spr_Enemigo, con todo esto realizado vamos a comenzar con los eventos.

Anuncios

El primer evento que agregaremos a nuestro objeto obj_Enemigo sera el Create, una vez agregado el evento le ingresaremos el siguiente codigo:

randomize();
image_speed = 0;
patron_caminata = choose("horizontal","vertical");
mi_veloc = choose(2,-2);
inicio_establecido = false;
Anuncios
Anuncios

Como dijimos en este post no debemos preocuparnos por el tipo de variable ya que este se definira en base a la informacion ingresada, la primera variable es una interna del Game Engine donde estableceremos que la velocidad de la imagen sera 0 para evitar que pase por todos los frames, la siguiente variable (patron_caminata) la usaremos para que determine como sera el movimiento del enemigo, la funcion choose se encarga de seleccionar de forma al azar entre todos los valores que le informemos pero para que esto sucede se debe informar la funcion randomize la cual genera el verdadero efecto de «al azar» porque de lo contrario GameMaker siempre usa la misma secuencia y no existira el factor «al azar», en este caso usamos solo dos pero pueden agregarse mucho mas dependiendo de la situacion (el limite son 16 valores), y establecera si se mueve horizontalmente o verticalmente, la siguiente variable usa de nuevo choose para elegir entre dos velocidades, la primera sera para desplazarse hacia la derecha o abajo y la negativa para la izquierda o arriba, por ultimo tenemos una variable que se encargara de decir si esta establecido el inicio o no, el siguiente paso sera agregar un nuevo evento de tipo Step y luego otro de Step, una vez hecho agregaremos el siguiente codigo:

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;
		}
		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;
		}
		inicio_establecido = true;
		break;
}
Anuncios
Anuncios

En este caso tenemos un switch para ver los dos probables valores que tomara patron_caminata, analicemos primero el valor horizontal.

En este case usara un condicional donde verifica que mi_veloc es igual a 2 e inicio_establecido no es true, tiene un negador delante, si se cumple estas dos condiciones seteara a hspeed con el valor de mi_veloc y establecemos cual es la imagen a mostrar por medio de image_index, en este caso es 3, esto puede depender de cual cuadro o frame hayas elegido para el desplazamiento hacia la derecha, luego tenemos un else if donde verifica si inicio_establecido no es true, como antes y entendemos que mi_veloc no sera igual a 2 sino a -2, recuerden el choose del evento Create, y en caso de cumplirse esta condicion volvera a setear a hspeed con el valor de mi_veloc y establecemos en image_index al frame que corresponde a mirar hacia la izquierda, en mi caso fue el 2, por ultimo establecemos que inicio_establecido sea verdadero con un true, con esto cubrimos el case para el valor horizontal.

Anuncios

En el siguiente case cubrimos si el valor es vertical y si lo vemos es exactamente lo mismo al case horizontal pero en lugar de modificar a hspeed lo hacemos con vspeed, y los image_index deben ser para los frames correspondientes para arriba y abajo, recuerden que el mi_veloc es para abajo y el negativo para arriba, con esto ya tenemos enemigos con movimiento pero por ahora pasan a traves de las paredes por lo que debemos agregar las colisiones.

Anuncios

Para el tema colisiones vamos a trabajar con un condicional, este ira dentro de cada case pero por fuera de los condicionales que agregamos anteriormente, vamos a tomar el case de movimiento horizontal y agregaremos el siguiente bloque antes o despues de setear con true a inicio_establecido pero antes del break:

		if ((collision_rectangle(
			x,
			y,
			x + 32,
			y + 32,
			obj_Prd, false, false) != noone) ||
			(collision_rectangle(
			x,
			y,
			x + 32,
			y + 32,
			obj_Enemigo, false, true) != noone)
			)
		{
			if (hspeed == 2)
			{
				image_index = 2;
				hspeed *= -1;
			} else {
				image_index = 3;
				hspeed *= -1;
			}
		}
Anuncios

En este condicional usaremos a la funcion collision_rectangle, la cual genera un rectangulo de colision en base a la informacion que le pasamos, antes de continuar hablemos sobre esta funcion, la sintaxis es la siguiente:

collision_rectangle(x1,y1,x2,y2,objeto,precision,notme);
Anuncios

Vamos a describir cada uno de los argumentos que pasamos:

  • x1, sera el valor para el left del rectangulo
  • y1, sera el valor para el top del rectangulo
  • x2, sera el valor para el right del rectangulo
  • y2, sera el valor para el bottom del rectangulo
  • objeto, sera el objeto informado para chequear las colisiones
  • precision, sera un valor booleano para usar o no precision
  • notme, un valor booleano para indicar si somos nosotros o no
Anuncios

Los cuatro primeros parametros son los cuatro parametros que usamos para todos los rectangulos de colision y afines, el siguiente parametro sera para el objeto que colisionara con nosotros, cuando hablamos de precision nos referimos a true o false para indicar que use mayor precision o no al momento de la deteccion y notme tambien sera true o false para indicar si somos nosotros (self) o no (other).

Anuncios
Nota: Al informar el objeto tambien podemos usar el ID de la instancia, all u other.
Anuncios

Si volvemos a nuestro bloque observen que pasamos el valor de los ejes X e Y de nuestro objeto (obj_Enemigo) y le sumamos el valor de 32 a los ultimos dos parametros para definir una cuadro de 32 por 32 en el movimiento horizontal, despues informamos el objeto obj_Prd, luego usamos false para no usar precision y por ultimo un false para indicar que somos nosotros, esta funcion devuelve un resultado que mientras no haya contacto sera de noone, por esta razon comparamos en la condicion para que la ejecute cuando sea distinto (!=) a noone.

Anuncios
Anuncios

Despues tenemos un operador OR logico (||) para comparar otro collision_rectangle exactamente igual al anterior pero para compararlo con otro enemigo, la unica diferencia que habra es en notme donde ahora usaremos a true para indicar que no somos nosotros, si se cumple con algunas de las dos condiciones pasaremos al bloque del condicional y en este tenemos otro condicional donde verificamos si hspeed es igual a 2, esto equivale a decir que se desplaza a la derecha si esto es asi modificamos el frame de la imagen por el que mira a la izquierda y tomamos a hspeed y lo multiplicamos por -1, esto cambiara el signo de nuestro hspeed y comenzara a desplazarse hacia la izquierda, luego tenemos un else para chequear la otra condicion, es decir que hspeed sea igual a -2, y en este caso volvera a cambiar el frame de la imagen por el que mira a la derecha y volvemos a multiplicar a hspeed por -1 para convertirlo en positivo y comenzar el desplazamiento a la derecha, con esto cubrimos las colisiones contra las paredes en los desplazamientos horizontales, vamos a trabajar con las colisiones verticales.

Anuncios

Debemos utilizar un bloque parecido para la deteccion de colisiones pero con unas sutiles diferencias, vamos al case vertical y agregamos este bloque antes del break:

		if ((collision_rectangle(
			x,
			y,
			x + 32,
			y + 64,
			obj_Prd, false, false) != noone) ||
			(collision_rectangle(
			x,
			y,
			x + 32,
			y + 64,
			obj_Enemigo, false, true) != noone) 
			)
		{
			if (vspeed == 2)
			{
				image_index = 1;
				vspeed *= -1;
			} else {
				image_index = 0;
				vspeed *= -1;
			}
		}
Anuncios

Basicamente es lo mismo pero con un par de sutiles diferencias, la primera mas evidente es que no usamos a hspeed sino a vspeed, en este condicional invertiremos a este dependiendo si sube o baja y lo mismo haremos con el frame pero la gran diferencia la tendremos en el bottom de collision_rectangle, al cual lo incrementaremos con 64 y no 32 porque esta es la altura de nuestro personaje para que funcione mejor la coincidencia de nuestro rectangulo de colisiones, esto nos evita que atraviese a la pared y rebote, con esto ya tenemos la deteccion de colisiones verticales de nuestro enemigo que cambiara de imagen y direccion cada vez que colisione contra una pared o contra otro enemigo, solo nos resta ir al Room1 agregar cuatro enemigos en el mismo y ver como funciona, les muestro un ejemplo con el siguiente video

Anuncios

En el video podemos ver como funcionan las detecciones tanto contra las paredes o los enemigos, tambien vemos como varian sus desplazamientos en cada inicio de juego.

Anuncios

En resumen, hoy hemos agregado a nuestros enemigos, hemos creado un metodo para que nuestros enemigos seleccionen de forma al azar entre dos tipos de desplazamientos, asi como la direccion de los desplazamientos, tambien hemos agregado las colisiones tanto contras las paredes como contra otros enemigos, 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