Comunidad Game Maker

Ayuda => Desarrollo de Scripts => Mensaje iniciado por: CuervoNegro en Julio 25, 2019, 06:09:42 am

Título: Crear proyectil con movimiento parabólico que intercepte objetivo
Publicado por: CuervoNegro en Julio 25, 2019, 06:09:42 am
Creador: CuervoN(yo)
Descripción: crear un objeto con una velocidad en X y Y  determinadas para conseguir un movimiento parabólico que termine por interceptar un objetivo especifico
Versión de GM:  Game maker Studio 2

Script:
////////////////////////////////////////////////////// createproy  /////////////////////////////////////////////////
/////////// Crear proyectil con velocidad en X y Y especificos para dar en un objetivo determinado by CuervoN/////////////
/*
argument0 = coordenada x del punto inicial
argument1 = coordenada y del punto inicial
argument2 = coordenada x del punto final
argument3 = coordenada y del punto final
argument4 = Velocidad minima 300(ejemplo)
argument5 = Velocidad maxima 600(ejemplo)
*/


///Coordenadas del punto inicial y del punto final(target)
var xi= argument0*room_speed
var yi= argument1*room_speed
var xf= argument2*room_speed
var yf= argument3*room_speed

var potmin=argument4 //Velocidad minima = 300(ejemplo)
var potmax=argument5 //Velocidad maxima = 600(ejemplo)
var grav=global.grav //Gravedad global.grav=9.8(ejemplo)

xdir=sign(xf-xi) //Guardar direccion
xf=xi+abs(xf-xi) //manejar xf-xi como positivo, para evitar algunos errores
if xi==xf{xf=xi+1} //Evitar que xf y xi sean iguales, porque da uno que otro error...
var c= (grav/(2*power(potmin,2)))*(power(xf-xi,2)) //Calcular un valor(c) con ecuacion extraña( :D ) para reducir codigo

while(((power(xf-xi,2)-4*(c*(c-yf+yi))))<0){ //Evitar algunos errores que pueden surgir si el target es imposible de alcanzar
potmin+=5
if xi==xf{xf=xi+1}
c= (grav/(2*power(potmin,2)))*(power(xf-xi,2))
}

var res=(-(xf-xi)-sqrt(power(xf-xi,2)-4*(c*(c-yf+yi))))/(-2*c) //Ecuacion extraña :D

ang=radtodeg(arctan(res)) //tranformacion de resultado
if xdir=-1{ang+=2*abs(ang-90)} //modificar angulo si es necesario

//ang es el angulo o direccion a la cual lanzar el proyectil

ins=instance_create_depth(x,y,depth,proy) //Crear el objeto que funciona como proyectil ("proy" es el objeto)
var pot=min(potmin,potmax) //acotar velocidad de acuerdo a la velocidad maxima
ins.hspeed=lengthdir_x(pot,ang)/room_speed //darle velocidad en x al proyectil
ins.vspeed=lengthdir_y(pot,ang)/room_speed //darle velocidad en y al proyectil


Se debe cambiar el objeto "proy" por el objeto proyectil que desee utilizar.


En el evento step del objeto proyectil debe estar la siguiente linea:
vspeed+=global.grav/room_speed  //Gravedad

Notas:
Hay que tener una variable global llamada "global.grav" para la gravedad. valor recomendado: 9.8

Ejemplo:
createproy(x,y,mouse_x,mouse_y,300,600)  //crea un proyectil en las coordenadas X y Y que intentara interceptar las coordenadas del mouse con una velocidad minima de 300 y maxima de 600

Video de ejemplo:

https://www.youtube.com/watch?v=vHVjBxWOTtI





Título: Re:Crear proyectil con movimiento parabólico que intercepte objetivo
Publicado por: somnus en Julio 29, 2019, 02:51:14 am
muy interesante este script, se me ajusta para algunas mecanicas deseadas, por cierto en caso de tener alguna flecha, como obtener el angulo del proyectil?
Título: Re:Crear proyectil con movimiento parabólico que intercepte objetivo
Publicado por: CuervoNegro en Julio 30, 2019, 05:27:51 am
muy interesante este script, se me ajusta para algunas mecanicas deseadas, por cierto en caso de tener alguna flecha, como obtener el angulo del proyectil?

Hola, si te refieres al angulo de la flecha cuando esta en movimiento puedes girarla de esta forma:

var angulo=point_direction(x,y,x+hspeed*2,y+vspeed*2);
image_angle=angulo;

Si te refieres al angulo de lanzamiento, lo puedes obtener de la variable "ang" que se encuentra en el script, solo asegúrate leerla ya que se hayan hecho todos los cálculos correspondientes.
Título: Re:Crear proyectil con movimiento parabólico que intercepte objetivo
Publicado por: somnus en Agosto 06, 2019, 05:36:28 pm
Va, gracias, voy a checar