Comunidad orientada al desarrollo de videojuegos

Game Maker: Sistema de búsqueda de rutas

Por fin estamos de vuelta, con Game Maker Studio, tras varios problemas técnicos y las siempre ociosas festividades. Aunque prometí comenzar un tutorial sobre la creación de una aventura gráfica, hoy prefiero compartir un sencillo tutorial de búsqueda de rutas en laberintos usando funciones internas en GM:Studio.

Introducción

Hace unas semanas, participé con mi equipo de desarrollo en el conocido concurso Ludum Dare, con un juego de inflitración. El principal “problema” que tuve con la programación, era el sistema de guardias. Asignar una serie de rutas a los guardias para andar de un punto a otro y recorrer siempre el mismo recorrido era tarea fácil usando el sistema de paths de GM, sin embargo la duda venía a la hora de perseguir al jugador, una vez te localizaban.

Usando funciones como mp_potential_path o mp_potential_step, los npcs comprobaban pixel a pixel que había delante de ellos y reaccionaban trazando una ruta. Sin embargo este sistema es demasiado precio y consume demasiados recursos como para ser viable en un proyecto a alta resolución, con múltiples cuelgues y comportamientos extraños. La solución, la encontramos con el uso de GRIDS

La función MP_GRID_CREATE

Antes de nada, tened en cuanto que trabajaremos en una room de 640 x 480 con vista cenital (similar a un PAC_MAN para hacernos una idea).

Una vez creada la room, pasaremos a crear un objeto de control: obj_control. En él, crearemos un Evento Create y le asignaremos el siguiente script:

///crear grid
globalvar grid;
grid = mp_grid_create(0, 0, room_width / 32, room_height /32, 32, 32)

with (obj_arbol)
{ mp_grid_add_cell(grid, floor(x / 32), floor(y / 32));}

Pasamos a explicarlo: La función mp_grid_create lo que hará es dividir toda la habitación en celdas, creando una cuadrícula invisible de celdas de 32 x 32 pixeles. Esas celdas se usarán a la hora de buscar rutas. No es lo mismo buscar una ruta entre miles de píxeles que entre 60-90 casillas.

La segunda parte del script lo que hace es asignar obstáculos a la ruta, en este caso, crearemos un obj_arbol que medirá 32 x 32 y tendrá su  centro en (0,0).

room1La siguiente parte será crear unos objetos, en este caso los he llamado obj_aldeanos, que constarán de dos eventos: Create y Step

En el evento create le asignaremos el siguiente código:

velocidad = random(5)+1

Esto guardará en la variable velocidad un valor aleatorio entre 1 y 6.

En el evento step pondremos esto:

///ir al raton
if mouse_check_button_released(mb_left) {

camino = path_add();

mp_grid_path(grid, camino,x,y,mouse_x,mouse_y,1)

path_start(camino,velocidad,0,false)

}

Esto comprobará en cada step si se ha soltado el botón izquierdo del ratón. Si es así, creará un path guardado en la variable camino, usando dicho path para la siguiente función:

La función mp_grid_path

Esta función es sumamente potente ya que usará la grid que hemos creado previamente (guardada en la variable global grid) para buscar la ruta más corta desde el obj_aldeano hasta la posición del ratón, esquivando los obj_arbol, el 1 del final de la función indica si podrá ir en diagonal o no.

Una vez preparada la ruta falta comenzarla, usando path_start para ordenar que comience el camino y vaya al objetivo con la velocidad asignada a dicha variable (entre 1 y 6).

Mientras la ruta sea correcta (no se pulse en un lugar imposible de llegar como dentro de un árbol), todos los aldeanos que coloquemos buscarán ese lugar y competirán por llegar antes, ya que cada uno irá a una velocidad distinta.

Conclusiones

Como habéis comprobado en este simple tutorial, con apenas 10 líneas de código hemos conseguido un sistema de búsqueda de rutas funcional y sencillo. A la hora de perseguir a un enemigo, lo encontrarán siempre, por lo que el siguiente paso para un sistema más complicado, sería usar un sistema de alarmas para que haya posibilidades de que el enemigo pierda el rastro del jugador, por ejemplo comprobando cada 3-4 segundos si la distancia al jugador es > x píxeles y si está fuera de su rango de visión. Si no os imaginais cómo y tenéis interés, hablaré de ello en el próximo tutorial.

Mientras tanto, os dejo con el proyecto por si no habeís conseguido hacerlo, y el ejemplo en Html5:

Archivo del proyecto

Ejemplo Html5

 

,

6 thoughts on “Game Maker: Sistema de búsqueda de rutas

Leave a Reply