hola estoy manejando estados finitos de maquina para un jugador que cuando este en estado "atacar" debe de buscar a que distancia esta el enemigo y dispararle una fleche.

el jugador solo tiene estados caminar, defender, atacar, por ejemplo cuando el estado sea atacar, este caminara o se alejara cierta distancia hasta que este mas o menos en trayectoria de la fleche, en ese momento el mismo jugador disparara una fleche, el problema aqui es como hacer la logica para que la fleche llegue en trayectoria parabolica hasta donde se encuentra el objetivo?
Es Mejor No Saber Porque Funciona, Que Saber El Porque No Funciona...
Tienes alguna duda con "Game Design" o de videojuegos en general, contactamente mas facil en twitter @pavulzavala

Déjame ver si comprendo tu ya tienes la distancia solo te falta la parábola cierto?  y que se ejecute la parábola y la flecha aterrice a la distancia establecida?
:3 visita mi canal-cito de youtube :3

Cita de: elmmertonw en Diciembre 28, 2017, 06:59:39 PM
Déjame ver si comprendo tu ya tienes la distancia solo te falta la parábola cierto?  y que se ejecute la parábola y la flecha aterrice a la distancia establecida?

correcto!
Es Mejor No Saber Porque Funciona, Que Saber El Porque No Funciona...
Tienes alguna duda con "Game Design" o de videojuegos en general, contactamente mas facil en twitter @pavulzavala

Buenas somnus, yo tuve está misma duda años atrás para lo granaderos de GravityBox. Ahora publiqué el juego échale un vistaso! http://www.comunidadgm.org/juegos-en-desarrollo/gravity-box/.

Hay varios puntos, para empezar hay dos soluciones para dar a un objetivo con un tiro parabólico. La una haciendo que el ángulo sea constante pero se dispare más lento o rápido y la otra es haciendo que la velocidad sea constante y solo se cambie el ángulo al correcto para dar al objetivo. Por supuesto, ambas pueden fallar dependiendo del objetivo.

Tenemos la ecuación de movimiento parabólico (sin cosas locas como fricción del viento u gravedad no constante):

x=x0 + v*cos(d)*t;
y=y0 + v*sin(d)*t + 1/2*g*t^2;

La parte horizontal es un polinomio que se divide en dos partes independientes una de la otra, la una constante "x0" y la otra lineal "v*cos(d)*t". "x0" indica la posición inicial y la parte lineal indica la posición a través del tiempo que es una linea recta descrita por el componente horizontal  "cos(d)" del ángulo en que se disparó, la velocidad "v" y el tiempo "t".

En la parte vertical tenemos un polinomio en principio más o menos igual al otro, excepto que aquí usamos la componente vertical del ángulo "sin(d)". También la cosa cambia porque aquí se usa la fuerza aceleratoria de la gravedad que es descrita por el producto cuadrático "1/2*g*t^2". Este es un polinomio cuadratico.

(aquí me salgo del tema, pero...) Las aceleraciones son cuadraticas porque si la velocidad cambia la posicion del objeto a traves del tiempo, la aceleracion cambia la velocidad del objeto a traves del tiempo. Entonces si lo vemos desde la perspectiva de la posicion esto es el cambio de un cambio ¡algo cuadratico!.

Lo que tenemos que hacer es encontrar el ángulo con que tendría que ser lanzada la bala para dar en el blanco. O bien la velocidad con que tendría que ser lanzada, así que no nos sirve de nada el tiempo. Hay que juntar las dos ecuaciones de tal modo que nos deshagamos del tiempo. Nos queda lo siguiente:


//Primero despejamos el tiempo (t) en la primera ecuación
x=x0 + v*cos(d)*t;
x-x0=v*cos(d)*t;
t=(x-x0)/(v*cos(d));

//Ahora reemplazamos t en la segunda...
y=y0 + v*sin(d)*(x-x0)/(v*cos(d)) + 1/2*g*( (x-x0)/(v*cos(d)) )^2;
//igualamos a 0:
y0-y0 + v*sin(d)*(x-x0)/(v*cos(d)) + 1/2*g*( (x-x0)/(v*cos(d)) )^2=0;


Y bueno haciendo algo de álgebra ::

//simplificamos mágicamente
(y0-y) + tan(d)*(x-x0) + g/(2(v^2)) * (x-x0)^2 * ( (tan(d)^2) + 1) = 0;
//Hacemos el producto:
(y0-y) + tan(d)*(x-x0) + g/(2(v^2)) * (x-x0)^2 + g/(2(v^2)) * (x-x0)^2 * tan(d)^2  = 0;
dividiendo entre (x-x0):
(y0-y)/(x-x0) + tan(d) + g/(2(v^2)) * (x-x0) + g/(2(v^2)) * (x-x0) * tan(d)^2 = 0;
//ahora acomodamos y observamos que (y0-y)/(x-x0) es la tangente del ángulo (a) entre el punto inicial y el objetivo

así que taran! nos queda la ecuación cuadrática final:
g/(2(v^2))*(x-x0) * tan(d)^2 + tan(d) + tan(a) + g/(2(v^2)) * (x-x0)  = 0;
donde:
A= g/(2(v^2))*(x-x0);
B= 1;
C= g/(2(v^2))*(x-x0) + tan(a);





De allí listo, usando la formula general salen dos soluciones, una o ninguna. Si te salen 2 una te da una parábola muy alta, así como disparando al cielo y esperando a que caiga mil años después en el punto exacto y la otra bajita y más directa. Todo eso está aquí (con algo de historia y un poco más claro) en el foro de matemáticas en que me ayudaron años atrás http://rinconmatematico.com/foros/index.php?topic=77776.msg310558#msg310558.

Y bueno si creías que ya todo había terminado, pues no! aún queda la solución de si ya tienes el ángulo bien definido pero quieres variar la velocidad para dar al enemigo:

usando la ecuación cuadrática final anterior:

g/(2(v^2))*(x-x0) * tan(d)^2 + tan(d) + tan(a) + g/(2(v^2)) * (x-x0)  = 0;
Luego solo cambiando de lugar haciendo álgebra:
g/(2(v^2))*(x-x0) * tan(d)^2 + g/(2(v^2)) * (x-x0)  = - tan(d) - tan(a) ;
g/(2(v^2)) * (x-x0) * ( 1 + tan(d)^2 ) = - tan(d) - tan(a) ;
g/(2(v^2))  = (-tan(d) - tan(a)) / ( 1 + tan(d)^2 * (x-x0) ) ;
1/2*g/(v^2)  = (-tan(d) - tan(a)) / ( 1 + tan(d)^2 * (x-x0) ) ;
v^2=(g/2)/ (-tan(d) - tan(a)) / ( 1 + tan(d)^2 * (x-x0) );

Al final nos queda esto:
v = sqrt( ( g*( 1 + tan(d)^2 * (x-x0) ) )/  (-2 * (tan(d) + tan(a)) )  );


HAY QUE RECORDAR QUE tan(d) es distinto a tan(a), tan(a)=(y-y0/x-x0) es la tangente del ángulo entre tú y el objetivo. Mientras que tan(d) es la tangente del ángulo al que disparas.

Suerte!