Ahora lo dejo ordenado por si a alguien le sirve, el problema que tenía era que en matemática el eje Y va hacia arriba, pero en las computadoras va hacia abajo XD, luego necesitaba adaptar un poco para que funcione también si el objetivo está a la izquierda.
Así quedó:
[gml]
//DATOS/////////////////////////////////////////////////
v=10 //Velocidad de disparo //
g=0.2 //Gravedad //
xj=abs(obj_jugador.x-x) //Posición X del jugador //
if xj=0 exit //Para prevenir una división por 0 //
yj=obj_jugador.y-y //Posición Y del jugador //
////////////////////////////////////////////////////////
/*
Tener en cuenta que la ecuación tiene 2 soluciones, una para un disparo más directo y otra para un disparo más alto,
este ejemplo está listo para el disparo directo que es más efectivo, para obtener el otro disparo se debe cambiar el
signo - que está entre el 1 y la raíz, justo como se ve en la ecuación comentada
También si el resultado de lo que va destro de la raíz cuadrada da negativo significa que el objetivo está fuera de
alcance, por eso el exit
*/
//ECUACIÓN//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
raiz=1-((2*g*-yj)/(power(v,2)))-((power(g,2)*power(xj,2))/(power(v,4))) //Contenido de la raíz cuadrada //
if raiz<0 exit //Si devuelve un numero menor que 0 significa que el objetivo está fuera de rango //
//
direccion=arctan(((power(v,2))/(g*xj))*(1-sqrt(raiz))) //Terminamos de calcular la ecuación para disparo directo //
//direccion=arctan(((power(v,2))/(g*xj))*(1+sqrt(raiz))) //Terminamos de calcular la ecuación para disparo indirecto //
//
direccion=radtodeg(direccion) //Pasamos el resultado a grados //
if obj_jugador.x<x direccion=-direccion+180 //Si el objetivo está a la izquierda espejamos el ángulo (Gracias Jairo Honorio) //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if reload=0 { //Si el arma esta recargada
bala=instance_create(x,y,obj_bala) //Crear la bala
bala.speed=v //Poner su velocidad...
bala.gravity=g // ...su gravedad...
bala.direction=direccion // ...y su dirección
reload=50 //Descargar el arma
}
reload-=1 //Recargar el arma lentamente
image_angle=direccion //Dibujar la torreta con el angulo de disparo
[/gml]
Eso obviamente va en step
Listo, dejo un ejemplo adjunto y algunas tags para el buscador XD
Así quedó:
[gml]
//DATOS/////////////////////////////////////////////////
v=10 //Velocidad de disparo //
g=0.2 //Gravedad //
xj=abs(obj_jugador.x-x) //Posición X del jugador //
if xj=0 exit //Para prevenir una división por 0 //
yj=obj_jugador.y-y //Posición Y del jugador //
////////////////////////////////////////////////////////
/*
Tener en cuenta que la ecuación tiene 2 soluciones, una para un disparo más directo y otra para un disparo más alto,
este ejemplo está listo para el disparo directo que es más efectivo, para obtener el otro disparo se debe cambiar el
signo - que está entre el 1 y la raíz, justo como se ve en la ecuación comentada
También si el resultado de lo que va destro de la raíz cuadrada da negativo significa que el objetivo está fuera de
alcance, por eso el exit
*/
//ECUACIÓN//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
raiz=1-((2*g*-yj)/(power(v,2)))-((power(g,2)*power(xj,2))/(power(v,4))) //Contenido de la raíz cuadrada //
if raiz<0 exit //Si devuelve un numero menor que 0 significa que el objetivo está fuera de rango //
//
direccion=arctan(((power(v,2))/(g*xj))*(1-sqrt(raiz))) //Terminamos de calcular la ecuación para disparo directo //
//direccion=arctan(((power(v,2))/(g*xj))*(1+sqrt(raiz))) //Terminamos de calcular la ecuación para disparo indirecto //
//
direccion=radtodeg(direccion) //Pasamos el resultado a grados //
if obj_jugador.x<x direccion=-direccion+180 //Si el objetivo está a la izquierda espejamos el ángulo (Gracias Jairo Honorio) //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if reload=0 { //Si el arma esta recargada
bala=instance_create(x,y,obj_bala) //Crear la bala
bala.speed=v //Poner su velocidad...
bala.gravity=g // ...su gravedad...
bala.direction=direccion // ...y su dirección
reload=50 //Descargar el arma
}
reload-=1 //Recargar el arma lentamente
image_angle=direccion //Dibujar la torreta con el angulo de disparo
[/gml]
Eso obviamente va en step
Listo, dejo un ejemplo adjunto y algunas tags para el buscador XD
CitarProyectil, Disparo, Gravedad, Calculo, Parabola, Calcular, Lanzar, Lanzado, Lance, Objetos