Hola comunidad. Yo aquí ultimando los detalles del mapa de selección de nivel de mi juego. Tengo justamente un problema con eso y quisiera que me ayuden a ver como resolverlo. La imagen que adjunto no es mía pero así será mi juego. Cuando uno toca uno de esos círculos se selecciona un nivel para jugarlo, pero yo quiero que por ejemplo si toco un circulo determinado mi personaje se mueva automáticamente hasta dicho círculo, siempre respetando que se mueva por los caminos. Después cuando llegue hasta ese círculo con una alarma que eso ya lo se hacer comenzará el nivel. ¿Alguna idea?
Quizás sea posible utilizando path pero en ese caso ¿Le tendría que indicar las coordenadas para que se mueva a una cierta parte por path?


Amigo, estuve buscando una solución a tu planteo y he dado gratamente con funciones incorporadas de Game Maker que facilitan enormemente esta labor. Asi que a usar el traductor de google  XD para entender la ayuda de esas funciones pude hacerte un ejemplo que funciona el cual lo adjunto en este mismo mensaje.

Te digo cual es la idea del asunto. Si te fijas bien esa imagen está compuesta por circulos que están a la misma distancia tanto vertical como horizontal, como si esto estuviera alineado con respecto a una cuadrícula que en Game Maker suelen llamar "Grid".

Entonces lo que debes hacer es abrir la ventana de diseño del room y definir una cuadrícula (entra al room del ejemplo que te adjunto y mira). Los círculos donde el personaje puede detenerse deben estar dentro de un cuadrito de dicha cuadrícula. Debes definir un sprite que ocupe un cuadrito entero que se llame "pared", con ese objeto delimita el camino como te puedes fijar en el archivo que te pase.

Cree un objeto origen que es el objeto que deberá caminar (hice un simple cuadrito para simplificar) y otro objeto destino que es invisible y es el lugar donde debe ir nuestro personaje.

Ojo: El objeto real que va a ser el que camina por esos caminos no va a ser un simple cuadrito sino un personaje más grande, entonces debes hacerle la máscara de colisión igual que el cuadrito, porque sino estaría atravesando la pared delimitadora y calculo que no funcionaria.

Dentro del objeto origen tenés todo el código para que el objeto se dirija a donde quieres que vaya y busque el camino por sí mismo.

este es el código:

globalvar cuadricula;

tam = 43;
cuadricula = mp_grid_create(0, 0, floor(room_width/tam), floor(room_height/tam), tam, tam);
mp_grid_add_instances (cuadricula, pared, false);

camino = path_add();

if mp_grid_path(cuadricula, camino, x, y, destino.x, destino.y, 0)
    path_start(camino, 5, 0, 0);


Si bien en el diseño del room definimos una cuadrícula para alinear los objetos, esa cuadrícula era solo para ayudar al diseño del room y sin existencia real en el juego. Ahora deberemos crear un recurso de game maker que es equivalente a la cuadrícula del diseño del room pero en memoria, para hacer cálculos.

la creación del mismo se hace con mp_grid_create(), en este caso definí que esa cuadrícula comience desde la posición 0,0 del room, es decir sin desplazamiento, desde el inicio.
el tercer y cuarto campo indica que tamaño tiene esa cuadrícula en cantidad de cuadritos horizontales y verticales respectivamente. Yo puse lo que entre en el room, por eso dividí el room por el tamaño de un cuadrito y al resultado de la división le trunqué los decimales porque necesito un número entero. Los últimos dos campos indican el tamaño en ancho y alto de cada cuadrito de esa cuadrícula.

Esta otra línea de código:
mp_grid_add_instances (cuadricula, pared, false);

lo que significa es que busque todos los objetos "pared" que hay en este room, se fije en que cuadrito estaría y que defina ese cuadrito como límite infranqueable, como lo es la pared.

luego se crea un path nuevo y vacío que va a ser usado por una función que usaremos después que le cargará los datos del camino a recorrer.

esta es la función de la que hablaba:
mp_grid_path(cuadricula, camino, x, y, destino.x, destino.y, 0)

esto quiere decir: buscá un camino usando la cuadrícula (la cual ya definimos los límites u obstáculos que son los objetos pared), el itinerario encontrado guardalo en el path llamado camino, y el camino a buscar es el que se origina en x,y de esta instancia que ejecuta esté código y el que termina en las coordenadas x,y del objeto llamado destino, y el campo cero del último quiere decir: no usés caminos diagonales (es decir, usá movimientos horizontales o verticales solamente)

Esta función esta siendo usada en un if porque si encuentra el camino devuelve true y si no lo encuentra devuelve false. Entonces si encuentra el camino entra a esta otra línea:

path_start(camino, 5, 0, 0);

que quiere decir: empezá a recorrer el camino encontrado a una velocidad de 5 pixel por step, cuando termines el recorrido detente (valor 0 del tercer argumento) y usa el path relativo a mi propia posición.

Acá está la ayuda de las funciones que usé:

http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/motion%20planning/mp_grid_create.html

http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/motion%20planning/mp_grid_path.html

http://docs.yoyogames.com/source/dadiospice/002_reference/paths/path_start.html

cualquier duda consultame. Saludos!

Muchas gracias, es perfecto. Solo tendré que alinear y rediseñar algunas cosas pero el el mejor sistema para que lo aplique a mi juego.