-
Fisica en videojuegos
Hola, bueno hace rato no público ni nada, pero como buscando y buscando vi a varios que saben mucho de programación, tal vez me puedan/quieran ayudar, ahí va:
Estamos haciendo (para la Facu) el típico juego de proyectiles de tiro oblicuo (suponete que sea el engry birds), con gravedad. Trabajamos con sfml y en C++.
Lo que tengo es esto y noce que es lo que me está faltando para hacer andar.
Código:
//tomamos el tiempo total de la aplicación tt_total += app->getframetime (), tdelta_t = app->getframetime (), t//calculamos vix, viy, posix, posiy tvix = velocidad * cosf(ángulo), tviy = velocidad * sin(ángulo), tposix = vix * t_total, tposiy = posiy + viy * delta_t - 0.5 * (g) * (delta_t * delta_t), tbala->setposition(posix, posiy), tviy = viy - G * delta_t;
Bueno aclaremos un poco.
T_total: es el tiempo total de la aplicación.
Delta_t: es el tiempo descompuesto, es para usarlo como integrador numérico.
Vix: es la velocidad inicial en x.
Viy: es la velocidad inicial en y.
Posix: es la posición inicial en x.
Posiy: es la posición inicial en y.
Bala: es el sprite de una bala y la seteamos en (posix, posiy).
Viy: ahora es afectada por la gravedad lo que debería hacerla disminuir su velocidad.
-
Fisica en videojuegos
Buenas. Supongo que quieres usar las fórmulas del movimiento parabólico. El problema es que no te vale el tiempo total de la aplicación como variable de tiempo, pues el segundo tiro sería igual que el primero, y así sucesivamente. Por tanto, cada bala tiene que tener su propio contador, o bien resetear el contador para cada nuevo tiro. Eso es lo primero, por lo tanto, no te vale el t_total, a no ser que lo resetes (igualar a 0) cada vez que haya un nuevo tiro.
(A partir de ahora asumiré que en t_total tenemos el tiempo correcto, en base a lo comentado arriba).
Por otra parte, te estas armando un lío con las variables:
-Lo que tú llamas posix y posiy no son la posición inicial, sino la posición actual, pues dependen del tiempo. O sea, que has mezclado la posición inicial y la actual, necesitas otras dos variables. Así pues, una vez calculadas vix y viy, calculas la posición para el nuevo instante de tiempo.
Para la posición x utilizas el tiempo absoluto (t_total) y para el y el diferencial (delta_t). Esto no tiene mucho sentido. Si utilizas t_total como te he comentado arriba debes usar t_total en ambos casos.
La última línea sobra, la viy (velocidad inicial) no se modifica, pues es la inicial.
En resumen, si quieres utilizar t_total reseteándolo para cada tiro:
Código:
tt_total += app->getframetime (), // lo ponemos a 0 para cada nuevo tiro o disparo tdelta_t = app->getframetime (), // no lo necesitamos en realidad tvix = velocidad * cosf(ángulo), tviy = velocidad * sin(ángulo), tpx = (vix * t_total) + posix; // posición en el instante t_total tpy = posiy + viy * total_t - 0.5 * (g) * (total_t * total_t), tbala->setposition(posix, posiy).
Donde:
Vix, viy: velocidad inicial, es una constante.
Pix, piy: posición inicial, es una constante.
Px, py: posición actual. Se calcula cada frame.
La alternativa es usar el diferencial de tiempo (delta_t), lo cual yo creo que sería lo más apropiado. Si es eso lo que quieres, dímelo y te lo explico. Un saludo.
-
Fisica en videojuegos
Muchas gracias por la respuesta, ya lo había solucionado me quedo de la siguiente manera, por si alguien lo necesita:
Código:
viy = viy + (g * delta_t), vix = vix + (viento * delta_t), posix = posix + (vix * (delta_t)) + 0.5 * viento * ((delta_t) * (delta_t)), posiy = posiy - (viy * (delta_t)) - 0.5 * g * ((delta_t) * (delta_t)), //aquí cambiamos los sign ya que tenemos la g negativa sprite. Setposition(posix, posiy),
Donde viento afecta a la pelota sobre el eje X y g sobre el eje y, y delta_t es el tiempo que pasa entre cada frame, se lo multiplico por 10 para que sea más rápido, y me quedo de 10. Saludos.
Posdata: entiendo lo que me quieres decir, pero posiy y posix, los nombro como posición inicial porque son así cuando empiezan, después obviamente que no son más iniciales, pero como la formula es esa.