Actualmente estoy desarrollando un shooter zombie de arriba hacia abajo, en tiempo real. Estoy codificando esto en Java, usando JBox2D como mi motor de física. He estado codificando la red esta semana, y ahora estoy a la altura de la sincronización física.
Estoy planeando usar el modelo predictivo de cliente / servidor autorizado, donde el cliente puede moverse libremente, siempre que el servidor lo apruebe más tarde. Esto implica que el cliente envía paquetes que contienen datos de movimiento al servidor, y el servidor calcula la latencia y vuelve a simular el mundo desde un estado anterior.
Mi problema es que mi motor de física actual, JBox2D (básicamente un puerto de Box2D), no admite la reversión del mundo, y aparentemente no es tan fácil serializar los datos mundiales. Tengo 2 soluciones, podría modificar / ampliar mi motor de física actual o escribir el mío.
Razones para escribir mi propio motor de física:
- Puedo eliminar funciones innecesarias. En un juego de arriba hacia abajo, solo necesito mecánicas de colisión y fuerzas de manejo. No hay gravedad involucrada.
- Puedo entender mejor el código, y [probablemente] sería más fácil implementar funciones de reversión
Razones para extender / modificar JBox2D
- Escribir mi propio motor de física sería una gran cantidad de trabajo, que podría ser engorroso
- JBox2D tiene una comunidad muy solidaria que me puede ayudar con mi desarrollo
- JBox2D, tiene optimizaciones específicas, para cosas como la detección de colisiones, que lo hacen útil
- Algunos trabajos ya se han hecho al respecto, pero se ha compartido poco código
¿Cuáles son tus opiniones? Este es mi primer juego, y no soy un desarrollador profesional de juegos. Si alguien pudiera proporcionar algunos enlaces al trabajo ya realizado en el área (preferiblemente usando JBox2D / Box2D / Java).
fuente
strictfp
todas partes, lo que afectará seriamente el rendimiento. De lo contrario, el servidor y el cliente pueden no obtener exactamente los mismos resultados. Recomendaría usar un punto fijo en su lugar.Respuestas:
La detección de colisiones en 2D es tan simple que no sé por qué incluso se molestaría en usar un motor de física en primer lugar. Y dado que todas las fuerzas de manejo son directas o en una curva (sin caídas, alterando los diagnósticos, etc.) Personalmente, es una obviedad para mí lo que debes elegir. Hacer el tuyo es simple. Colisión:
cuenta las 3 posibles colisiones que pueden ocurrir en 2 rectángulos:
EDITAR: Como se comentó, estoy mucho menos familiarizado con este asunto, y no debería ser consultado sobre la colisión de bala / proyectil.
Cuando trabajé con balas en el espacio 2D, utilicé una especie de ruta que funcionó tanto en línea recta como curva donde arrojaría el proyectil usando el motor de física (que no hice desde cero) y usé la colisión estándar.
Lea sobre cómo construir esto desde cero en los comentarios.
EDITAR: * Confía en mí, * independientemente de cuál sea, necesitarás algún tipo de cálculo muerto en tu motor de juegos, debido a los proyectiles y cuántos proyectiles podrían estar en la pantalla en un momento dado. ABSOLUTAMENTE no desea actualizar cada viñeta en la pantalla por cuadro en su ubicación determinada. Pero es una excelente forma de hacer que un juego sea lento: ¡D! Solo debe actualizar estas cosas:
Ahora actualice los datos en el motor de acuerdo con esos datos, en lugar de hacerlo en el servidor para cada maldito proyectil, y envíe paquetes de datos para cada bala. (¡Imagínese hacerlo con solo 2 ametralladoras en la pantalla! ¡Jesús!)
fuente