Anuncios

Bienvenidos sean a este post, en el post anterior no solamente creamos nuestro nuevo proyecto sino que vimos como importar los sprites del primer proyecto, en este caso veremos como volver a crear nuestros objetos.

Anuncios

Para este caso vamos a volver a generar el objeto del jugador, pero antes vamos a hacer una modificacion en nuestro sprite, para ello lo volvemos a abrir y vamos a la opcion Collision Mask, si lo desplegamos el mode de estar como Manual y shape como Rectangle, y los cuatro datos del rectangulo pueden ser similares a los siguientes:

  • Left: 2
  • Top: 0
  • Right: 29
  • Bottom: 63
Anuncios

Estos datos pueden ser un poco diferentes a los tuyos pero se los muestro para que entiendan las modificaciones, en este caso sumaremos dos pixels a left y top y restaremos dos pixels a right y bottom, esto lo haremos para que las colisiones sean un poco mas precisas, debera quedar de la siguiente manera:

  • Left: 4
  • Top: 2
  • Right: 27
  • Bottom: 61
Anuncios

En esta modificacion lo unico que hicimos fue modificar la mascara encargada de detectar colisiones, esto podemos modificarlo siempre a nuestras necesidades pero la forma de hacerlo, rectangular, es la mas utilizada por la mayoria de los Game Engine que puedan encontrar, con esta modificacion realizada sigamos con la creacion del objeto.

Anuncios
Anuncios

Vamos de vuelta en el Asset Browser buscamos la carpeta Objects y hacemos click con el boton derecho y seleccionamos Create -> Object, al nuevo objeto lo llamaremos obj_Cj y le asignaremos el sprite spr_Cj, una vez hecho volvemos a establecerlo como solido tildando la opcion Solid, con esto terminamos la parte del sprite pero por ahora seguiremos usando el Drag and Drop porque en realidad para los eventos seguiremos trabajando de la misma pero en lugar de tener unas acciones predeterminadas ahora cada evento espera por nuestro codigo de GML pero no volveremos a trabajar con todos los eventos que vimos anteriormente, por ejemplo con los eventos de teclado, sino que trabajaremos con cuatro basicos:

  • Create, este correra una sola vez, es decir cuando se crea el objeto y lo usaremos para iniciar algunas variables u otras acciones como vimos en el proyecto anterior, p.e. la salud de nuestro heroe.
  • Alarms, este evento sirve como temporizador y cuenta desde un valor X hasta 0 para ejecutarse, se pueden usar hasta 20 alarmas por objeto
  • Step, este evento en los objetos correra por cada paso, se define por la velocidad del nivel o room, si la velocidad o speed esta seteada en 30 esto equivaldra a 30 pasos (steps) por cada segundo o sea 30 pasos por segundo
  • Draw, este evento se encarga de ejecutar acciones cuando se esta dibujando pero si nosotros tenemos un objeto que solo es un grafico no es necesario usarlo pero por ejemplo para los enemigos si necesitamos una accion para determinadas acciones
Anuncios

Estas seran los cuatro eventos que mas usaremos para nuestros codigos, veamos las sub categorias que posee Step:

  • Begin Step, se usa para ejecutar alguna accion al comienzo de una instancia
  • Step, es el evento encargado de monitorear los pasos y sera el mas utilizado
  • End Step, igual al primer evento pero solo que lo hara al momento de finalizar el paso
Anuncios
Anuncios

Y a su vez Draw posee sub categorias:

  • Draw, va a ser el subtipo que mas usaremos en nuestro evento
  • Draw Begin, al igual que Begin Step ejecuta una accion cuando se inicia el dibujar
  • Draw End, idem al anterior pero se ejecuta cuando finaliza el dibujar
  • Draw GUI, es igual a Draw pero esta pensado pura y exclusivamente para la GUI, es decir que se usara mas para mostrar la salud, las municiones, vidas, etc.
  • Draw GUI Begin, hace lo mismo que Draw Begin pero solo para la GUI
  • Draw GUI End, idem al Draw End pero solo para la GUI
  • Pre-Draw, este ejecutara una accion pero antes de empezar a dibujar no mientras comienza el mismo
  • Post-Draw, igual que el anterior pero que lo hara solo cuando haya terminado el dibujar
  • Windows Resize, este se aplicara solo cuando modifiquemos el tamaño de la ventana
Anuncios

Si bien ya usamos algunos de los eventos anteriores pero tengalos en mente porque seran los que mas usaremos.

Anuncios

Comencemos a trabajar sobre el objeto del jugador para poder movernos, para ello debemos agregar un evento Step y otro de Step, una vez hecho nos quedara de la siguiente manera

Anuncios

Como pueden ver ahora tenemos para empezar a agregar el codigo, cuando trabajamos con el proyecto anterior simplemente agregamos una accion encargada de interceptar un evento de presion de teclado (key down) y a su vez elegimos cada uno de las teclas direccionales para poder mover a nuestro jugador por medio de las mismas, en este caso debemos usar la funcion keyboard_check, su sintaxis es la siguiente:

keyboard_check(< tecla >)
Anuncios

Donde en va la tecla debemos usar la funcion ord y ahi pasaremos la tecla con comilla simple y en mayuscula:

ord('A')
Anuncios

Un ejemplo concreto puede ser:

keyboard_check(ord('A'))
Anuncios

Con esto podemos saber cual es la tecla que se presiono pero como sabremos para las direccionales? En este caso GML contempla esta situacion y posee los siguientes valores para dichas teclas:

  • vk_up, para la flecha hacia arriba
  • vk_down, para la flecha hacia abajo
  • vk_right, para la flecha hacia la derecha
  • vk_left, para la flecha hacia la izquierda
Anuncios

Con esto tenemos nuestras teclas totalmente contempladas pero como trabajaremos con ellas? Aca entran en accion el mitico condicional if, para verlo en accion debemos agregar el siguiente bloque dentro de nuestro evento Step:

veloc = 5;
if (keyboard_check(vk_left))
{
	x -= veloc;
} 
else if (keyboard_check(vk_right))
{
	x += veloc;
}
Anuncios

En este caso primero crearemos una variable llamada veloc y le establecemos un valor de 5, luego usamos la funcion keyboard_check donde primero verifica si presionamos la tecla izquierda y en caso de ser verdadero disminuye el valor de x con el valor que establecimos en veloc, lo siguiente es un else if donde verifica si la tecla presionada es la flecha de la derecha y por lo tanto incrementa el valor del x con el de valor de veloc, si soltamos las teclas se detendra nuestro personaje, vamos a agregar las dos condiciones faltantes, para ello agregaremos dos else if mas pero en este caso solo afectaremos a y, el eje Y, del objeto:

veloc = 5;
if (keyboard_check(vk_left))
{
	x -= veloc;
} 
else if (keyboard_check(vk_right))
{
	x += veloc;
}
else if (keyboard_check(vk_up))
{
	y -= veloc;
}
else if (keyboard_check(vk_down))
{
	y += veloc;
}
Anuncios

Con esto ya tenemos los movimientos basicos de nuestro personaje pero todavia nos faltan un par de modificaciones mas, en este caso nos falta de los movimientos, para este proyecto contemplaremos las diagonales que no hicimos en el proyecto anterior, para ello agregaremos los siguientes condicionales de tipo else if:

veloc = 5;
if (keyboard_check(vk_left) && keyboard_check(vk_up))
{
	x -= veloc;
	y -= veloc;
}
else if (keyboard_check(vk_left) && keyboard_check(vk_down))
{
	x -= veloc;
	y += veloc;
}
else if (keyboard_check(vk_right) && keyboard_check(vk_up))
{
	x += veloc;
	y -= veloc;
}
else if (keyboard_check(vk_right) && keyboard_check(vk_down))
{
	x += veloc;
	y += veloc;
}else if (keyboard_check(vk_left))
{
	x -= veloc;
} 
else if (keyboard_check(vk_right))
{
	x += veloc;
}
else if (keyboard_check(vk_up))
{
	y -= veloc;
}
else if (keyboard_check(vk_down))
{
	y += veloc;
}
Anuncios

En esta ocasion hicimos mas que un par de modificaciones, porque no solamente ahora contemplamos la presion de dos teclas al mismo tiempo (izquierda – abajo o izquierda – arriba) sino que movimos las primeras condiciones despues de las que agregamos pero porque esto? Simple si nosotros mantenemos las condiciones simples nunca se detectaran las nuevas compuestas y esto ocasiona que no funcione correctamente, veamos un ejemplo de condicion:

if (keyboard_check(vk_left) && keyboard_check(vk_up))
{
	x -= veloc;
	y -= veloc;
}
Anuncios

En este caso verificamos si se presiono izquierda y arriba, es decir la diagonal hacia arriba y a la izquierda, si se cumple disminuiremos el valor del eje X e Y simultaneamente, en cambio si nosotros presionamos izquierda y abajo seguimos disminuyendo el valor del eje X pero en cambio incrementaremos el valor del eje Y, lo mismo haremos para la combinacion de la derecha tanto para arriba como para abajo y con sus respectivas operaciones, y en todos estos nuevos casos debemos modificar ambos ejes y no solamente uno, con esto ya tenemos contempladas las 8 direcciones que puede desplazarse nuestro personaje, la siguiente modificacion sera con la imagen que se debera representar para el movimiento.

Anuncios

Para esta modificacion cambiaremos el valor del indice de la imagen con la siguiente variable interna:

image_index
Anuncios

Gracias a esta variable interna podemos variar al frame que queremos representar, por ejemplo veamos los valores que corresponden a cada frame de nuestro personaje

Anuncios

Donde 0 lo podemos usar para ir hacia abajo, 1 para arriba, 2 para la derecha y 3 para la izquierda, entonces agregaremos a la variable image_index a todos los condicionales de la siguiente manera:

/// @description Insert description here
// You can write your code in this editor
veloc = 5;
if (keyboard_check(vk_left) && keyboard_check(vk_up))
{
	x -= veloc;
	y -= veloc;
	image_index = 3;	
}
else if (keyboard_check(vk_left) && keyboard_check(vk_down))
{
	x -= veloc;
	y += veloc;
	image_index = 3;
}
else if (keyboard_check(vk_right) && keyboard_check(vk_up))
{
	x += veloc;
	y -= veloc;
	image_index = 2;
}
else if (keyboard_check(vk_right) && keyboard_check(vk_down))
{
	x += veloc;
	y += veloc;
	image_index = 2;
}
else if (keyboard_check(vk_left))
{
	x -= veloc;
	image_index = 3;
} 
else if (keyboard_check(vk_right))
{
	x += veloc;
	image_index = 2;
}
else if (keyboard_check(vk_up))
{
	y -= veloc;
	image_index = 1;
}
else if (keyboard_check(vk_down))
{
	y += veloc;
	image_index = 0
}
Anuncios

Como pueden ver fue solamente agregar el indice que corresponde a image_index y se realizara la magia, nosotros nos manejamos asi de una manera sencilla pero pueden agregar mas frames al sprite para contemplar los movimientos en diagonal, eso lo dejo a vuestros criterios, con esto ya tenemos todos los movimientos y como cambiar al frame correspondiente, solo debemos agregar el objeto al room.

Anuncios
Nota: Recuerden que nuestro room de trabajo es rm_main renombrado en el post anterior.
Anuncios

Vayan al Asset Browser seleccionen al rm_main, despues buscan el objeto y lo tiran dentro del rm_main, les dejo un ejemplo de como queda

Anuncios

Como pueden ver ya tenemos medio cocinado este post, solo nos resta ir a las propiedades del room y modificaremos su tamaño actual al siguiente

Anuncios

Para que use un poco menos de memoria y nos sea mas practico de manejar, solo nos resta probarlo tal como se ve en el siguiente video

Anuncios
Nota: Despues de la modificacion muy probablemente deban reubicar al jugador en la pantalla.
Anuncios
Anuncios

Con esto tenemos terminado los movimientos de nuestro personaje en el nivel, obviamente todavia nos falta el tema de los enemigos, las paredes y las colisiones pero de a poco lo iremos agregando.

Anuncios

En resumen, hoy hemos visto como crear un nuevo objeto, cuales seran los eventos que mas usaremos para el lenguaje, hemos visto como reemplazar a los eventos y las acciones, hemos creado nuestro primer codigo dentro de un objeto y un evento, tambien hemos logrado no solamente el desplazamiento sino que se modifique el frame correspondiente, 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

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.