Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Yhur en Marzo 30, 2021, 02:00:40 PM

Título: Soy nuevo y mis colisiones no funcionan como quiero
Publicado por: Yhur en Marzo 30, 2021, 02:00:40 PM
Hola a tod@s.
Antes de nada decir que soy nuevo en esto de la programación, llevo unes 11 días usando GMS 2 y viendo tutoriales para empezar a moverme por el programa.

Mi problema es el siguiente, viendo un tutorial he podido moverme con el ratón por la room en todas las direcciones, cuando colisiono contra una pared el personaje como es natural se detiene ( ejemplo derecha ) , pues bien cuando estoy yendo hacia la diagonal superior derecha el personaje va dando trompicones y una vez supero la pared e intento andar mas el personaje se para.

Lo que yo quiero hacer es que el personaje se deslice por las paredes de forma que pueda dar vueltas sobre los obstáculos sin que me pare el personaje, que me ralentice el movimiento pero no lo llegue a parar, que solo pare al personaje si choca en línea recta contra un obstáculo (0º,90º,180º,270º).

Espero que me haya explicado bien, como digo soy nuevo en esto y me gustaría aprender, muchas gracias.
Título: Re: Soy nuevo y mis colisiones no funcionan como quiero
Publicado por: Void en Abril 01, 2021, 10:37:46 AM
GameMaker tiene muchas maneras de mover objetos, que manera en especifica es la más apropiada pasa usar depende del caso, y habría sido mejor que mostraras la manera en que tú estás moviendo el objeto para ayudarte a arreglar ese código.

En todo caso, acá te dejo una manera de mover el objeto como quieres:

[gml]Dist = min(6,point_distance(x,y,mouse_x,mouse_y));
Dir = point_direction(x,y,mouse_x,mouse_y);

Xx = lengthdir_x(Dist,Dir);
Yy = lengthdir_y(Dist,Dir);

if Xx > 0 move_contact_solid(0,abs(Xx));
if Xx < 0 move_contact_solid(180,abs(Xx));
if Yy > 0 move_contact_solid(270,abs(Yy));
if Yy < 0 move_contact_solid(90,abs(Yy));[/gml]

En este código la variable Dist tiene la distancia que el objeto va a moverse por step, que será ente caso 6 o la distancia hasta el mouse, el que sea el valor menor. Cambiando el número 6 por otros valores cambia la distancia máxima que el objeto se mueve.

La variable Dir tiene la dirección hacia el mouse desde el objeto.

Usamos esos 2 valores junto con las funciones lengthdir_ para calcular el factor vertical y horizontal del movimiento del objeto, los calculamos por separado para que el objeto se mueva como quieres de manera que si no puede moverse horizontalmente al menos mantenga el movimiento vertical, o viceversa.

Finalmente cambiamos la posición del objeto con la función move_contact_solid, que moverá un objeto en la dirección determinada la distancia indicada o hasta encontrar un objeto sólido. La función tiene la particularidad de que si le pones valores negativos se vuelve loca así que hay que asegurarnos de pasarle un valor positivo, y eso significa tener condiciones para las 4 direcciones básicas.

Dejo un ejemplo con ese código para que lo veas en uso.
Título: Re: Soy nuevo y mis colisiones no funcionan como quiero
Publicado por: Yhur en Abril 01, 2021, 12:18:53 PM
Muchísimas gracias ^^,  soy muy novato aun en esto y no se me ocurrió pasar lo que tengo puesto sorry :P.
Ahora mismo pruebo tu solución, otra vez gracias