Hola a todos, estoy haciendo un juego y necesito un movimiento parabólico, quiero que una granada vaya a un punto alto, con la distancia, y recorra entre el punto del soldado y caiga donde fue puesto el mouse para lanzar. Pero no se hacerlo y por eso les estoy pidiendo ayuda :'(
Como en el ejemplo del video de abajo :
https://photos.app.goo.gl/3rqAwf17PHWJ97Me9 (https://photos.app.goo.gl/3rqAwf17PHWJ97Me9)]
Es relativamente simple, lo primero es, en el evento Create, determinar el punto de origen desde donde sale la granada y el punto final donde caerá la granada, y usar esos puntos para determinar la distancia y dirección en que la granada va a viajar, e inicializamos una variable z para la altura del vuelo de la granada:
[gml]Dest_x = mouse_x;
Dest_y = mouse_y;
Dist = point_distance(xstart,ystart,Dest_x,Dest_y);
Dir = point_direction(xstart,ystart,Dest_x,Dest_y);
z = 0;[/gml]
Luego en cada paso movemos la instancia la cantidad apropiada y calculamos la altura que tendría la granada en ese paso:
[gml]Dist_Rem = point_distance(x,y,Dest_x,Dest_y)
x += lengthdir_x(min(Dist_Rem,8),Dir)
y += lengthdir_y(min(Dist_Rem,8),Dir)
z = sin((((Dist_Rem)/Dist))*pi)[/gml]
El calculo de z es simple, tomamos la distancia que le falta a la granada por viajar y la dividimos entre la distancia total que debe viajar para normalizar el valor, tomamos dicho valor y lo multiplicamos por pi para poder aprovechar la parábola de la función matemática seno.
Ahora simplemente se dibuja manualmente el sprite del objeto, multiplicando z por el valor de la altura máxima que la granada puede alcanzar y restándole el resultado a al valor y. Recomendaría en lugar de usar un valor estático para la altura máxima usar un factor de la distancia total:
[gml]draw_sprite_ext(sprite_index,image_index,x,y-z*(Dist/3)[/gml]
Dejo un ejemplo con el código: