Hacer que lo rápido parezca lento (Box2D)

9

Estoy trabajando en un juego en el que controlas un trebuchet para lanzarle bolas al oponente.

Es como un juego llamado 'Asedio medieval'. Cuando el trebuchet balancea su brazo, el jugador debe aprovechar el mejor momento para presionar el botón y soltar la pelota. Entonces la pelota volará en el ángulo tangente. ingrese la descripción de la imagen aquí Mi problema ahora es que el brazo del trebuchet se balancea demasiado rápido para que el jugador aproveche el momento correcto. Mientras tanto, tiene que ser así de rápido, de lo contrario no puede lanzar lo suficientemente lejos. Y hay una pequeña cuerda que conecta la bola y el brazo de trebuchet, si el brazo se balancea demasiado lento, la bola simplemente cuelga de la cuerda cuando el brazo se mueve.

Resuelvo el problema alternando el tamaño del paso, cada vez que el brazo se balancea, cambio el tamaño del paso de 1/60 a 1/200. Y una vez que el jugador suelta la pelota, vuelve a 1/60.

Esto funciona bastante bien, excepto que mi juego es para multijugador con redes. Por lo tanto, cambiar el paso puede causar problemas.

Otra solución que se me ocurre es permitir que oscile lentamente, pero cuando el jugador suelta la pelota, agrego velocidad manualmente a la pelota mientras mantengo su dirección. Realmente no me gusta esta solución porque parece falsa y todavía tengo el problema de que la pelota está colgando de la cuerda, a menos que la haga muy corta.

Por favor, arroja algo de luz sobre esto, ¡gracias!


EDITAR

Gracias por el aporte de todos, resuelvo el problema haciendo que el brazo se balancee lentamente y cuando el jugador suelta la pelota, agarra la velocidad de la pelota y multiplicada por dos. Se ve exactamente igual que cambiar el tamaño del paso. Solo hay una cosa extra que necesito hacer. Debido a que el brazo oscila muy lentamente, la pelota simplemente cuelga del extremo del brazo en lugar de balancearse. Resolví esto aplicando una fuerza igual a la fuerza gravitacional sobre la pelota durante y solo durante el período de swing. Entonces ya no cuelga allí, sino que se balancea con el brazo.

La respuesta de @MrCranky es detallada y parece factible, así que la aceptaría. :)

Arch1tect
fuente
¿Quizás podrías mover el trebuchet lentamente, pero multiplicar las fuerzas que actúan sobre la pelota? No he trabajado con Box2D antes, lo siento si es una idea tonta. Aparte de eso, mi única suposición sería jugar con la masa de la pelota para ver si las más pesadas o más ligeras pueden dar resultados aceptables a velocidades más lentas. Además, podría valer la pena analizar la física de los trebuchets de la vida real. Esos parecen algo lentos, por lo que tal vez los datos sobre ellos (tamaño, munición, fuerzas, etc.) podrían darle algunas ideas para su simulación.
Cristiano
2
Hacer que la física de la computadora se comporte como "lo real" es realmente difícil. Casi todos los motores de física simulan cuerpos rígidos, lo que significa que los efectos como la flexión del brazo trebouchet no se tienen en cuenta ni la física de la cuerda ni el comportamiento del material de ninguna manera precisa, por lo que una simulación exacta sin "trampa" es casi imposible. El proceso para acercarse a algo que parece real es un poco como esto: ajustar, ajustar, ajustar, hacer trampa, ajustar, ajustar, hacer trampa, hacer trampa, ajustar, comenzar de nuevo, ajustar, ajustar, ajustar, hacer trampa, hacer trampa, hacer trampa, hacer trampa , engañar, ajustar.
LearnCocos2D
44
Kitten cannon utiliza el enfoque más realista para este problema: los humanos realmente son tan malos manipulando la realidad física y necesitan ayuda de la máquina, si desea dar la "sensación" de un trebuchet que se mueve lo suficientemente lento para que un humano lo controle manualmente pero se lanza más rápido de lo físicamente posible, es posible que desee crear una animación puramente artística de "disparando" y luego generar la bola en función de dónde el usuario interrumpe la animación.
MickLH

Respuestas:

3

Instintivamente, diría que nos falta una parte sustancial del contexto necesario para responder, que es "¿por qué el aspecto multijugador te impide cambiar el paso del tiempo?"

Si está tratando de compartir una simulación física a través de una conexión de red, bueno, eso suele ser algo bastante difícil de hacer. Las simulaciones divergen muy fácilmente, y especialmente con conexiones de red que pueden perder paquetes, es muy difícil mantener las cosas juntas.

La respuesta simple y más robusta a su pregunta es usar un paso de tiempo variable. Cuando se acerque al momento de la decisión, en lugar de actualizar su simulación física en un segundo por cada segundo que pasa en el mundo real, actualícela en medio segundo u otro número adecuado. Como se trata de un efecto de integración, es probable que puedas salirte con solo bajar la velocidad de actualización a la velocidad más baja durante la ventana de decisión, pero también puedes interpolar rápidamente a la velocidad más baja. De cualquier manera, esencialmente está reproduciendo la simulación física en cámara lenta. Debe comportarse de manera perfectamente precisa, lo suficientemente lenta como para que el jugador pueda tomar su decisión. No consideraría ningún otro medio para eludir la física para que funcione, lo más probable es que todos funcionen horriblemente y no se sientan 'bien'.

Entonces volvemos a la implementación de la red. Sin más información, supongo que tienes dos opciones. En primer lugar, si está operando en sintonía con la otra parte en red. Entonces, cuando un jugador tiene que reducir la velocidad para tomar su decisión, reduzca la velocidad de ambos jugadores por igual. Esto probablemente se sentirá molesto y extraño para el jugador que no está disparando, porque confundirá sus propios tiempos de reacción.

Para el segundo, imagine dos trebuchets disparándose el uno al otro. El trebuchet tarda 10 segundos en lanzarse, y la ventana de disparo comienza en T + 5s. P1 comienza el ciclo de disparo en T + 0s, y en T + 5s ralentiza su simulación física local en un 50%. Les llevará 15 segundos jugar todo el ciclo. Entonces, en T + 5s, P1 le dice a P2 que comience a reproducir el ciclo de lanzamiento de 10s a toda velocidad. Entonces P1 ve que el ciclo de trebuchet toma 15 segundos, P2 ve que toma 10 segundos, pero ambos jugadores ven que el ciclo termina en T + 15 segundos. Cuando P1 realmente se libera, le dicen a P2 cuándo se lanzaron en el ciclo nocional. Entonces, si P1 se lanza en T + 10s, en realidad es de 7.5s a través del ciclo de lanzamiento de 10s. P2 puede mostrar el lanzamiento en T + 12.5s (7.5s en su reproducción local del ciclo), y las simulaciones de ambos jugadores deberían haber lanzado el proyectil en el mismo punto físico del ciclo.

Entonces, en este segundo enfoque, ya no estás simulando al mismo tiempo. Está ejecutando dos simulaciones independientes, pero en su lugar está rastreando las entradas de los jugadores. Si a ambos se les dice que el jugador lanzó a las 7.5 s en el ciclo de lanzamiento, ambos deberían acordar dónde aterrizará el proyectil. Sin embargo, en la práctica, es probable que diverja muy rápido, y necesitará sincronizar los estados de simulación de alguna manera.

MrCranky
fuente
0

¿Por qué no simplemente copiar / adaptar lo que ya existe y funciona en casos similares?

ingrese la descripción de la imagen aquí

Korchkidu
fuente
0

Si su trebuchet se mueve demasiado rápido, la solución obvia sería escalar el tiempo para hacerlo más lento. Es decir, por cada segundo de tiempo real, haga pasar solo, por ejemplo, 0.1 segundos en su simulación física. Ahora, desde el punto de vista del jugador, la pelota se moverá 10 veces más despacio.

En realidad, hay otra forma de lograr el mismo efecto: en lugar de escalar el tiempo, simplemente escale todas sus constantes físicas que están en unidades, incluido el tiempo. Por ejemplo, la aceleración gravitacional tiene unidades de velocidad / tiempo = distancia / tiempo², por lo que si la gravedad es la única constante en tu juego, reducirla en un factor de 100 = 10² logra el mismo efecto que reducir el tiempo en un factor de 10 .

Por supuesto, si su modelo de física incluye otras constantes con unidades de tiempo (o velocidad = distancia / tiempo, o aceleración = distancia / tiempo², etc.), también tendrá que escalarlas si desea mantener las trayectorias iguales .

Tenga en cuenta que hay un límite en cuanto a qué tan lejos puede llegar prácticamente con esto: si reduce el tiempo en, digamos, un factor de 100, su trebuchet será realmente fácil de controlar, pero es probable que sus jugadores también se aburran mientras esperan Bolas para flotar lentamente después de dispararlas. Si ese es un problema, es posible que deba recurrir a trucos más avanzados como los sugeridos en otras respuestas, como usar una escala de tiempo realmente lenta mientras el trebuchet está disparando, pero cambiar a una escala de tiempo más rápida una vez que se ha lanzado la pelota.

Ilmari Karonen
fuente
gracias, pero probablemente no viste mi edición. Sí, lo resolví con el último método en su respuesta
Arch1tect