Noticias

¡Ayuda a la Comunidad GM, haz una donación!

* Sponsor

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: disparar flecha segun la distancia del enemigo  (Leído 869 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado somnus

en: Diciembre 27, 2017, 08:01:05 pm
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
 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado elmmertonw

  • Habitual
  • *
  • Puntos: 81
  • Mensajes: 52
  • Agradecido: 6 veces
  • Sexo: Masculino
  • I'm brony :D Compositor,Artista,Programador...
    • Ver Perfil
    • Mi pequeño canal para aprender a programar
Respuesta #1 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?

:3 visita mi canal-cito de youtube :3
 
Los siguientes usuarios dieron las gracias a este tema: Yuzo


Desconectado somnus

Respuesta #2 en: Diciembre 28, 2017, 08:14:01 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
 


Desconectado brunoxzx

Respuesta #3 en: Enero 05, 2018, 09:37:59 am
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):
Código: [Seleccionar]
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:

Código: [Seleccionar]
//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 ::
Código: [Seleccionar]
//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:
Código: [Seleccionar]
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!

 
Los siguientes usuarios dieron las gracias a este tema: Yuzo