¿Qué pasos estarían involucrados en la construcción de un paisaje 2D destructible, como en Worms? Idealmente, ¿cuáles son algunas formas en que este proceso podría hacerse lo más eficiente posible?
¿Qué pasos estarían involucrados en la construcción de un paisaje 2D destructible, como en Worms? Idealmente, ¿cuáles son algunas formas en que este proceso podría hacerse lo más eficiente posible?
Respuestas:
No sé cómo se implementó exactamente el paisaje en gusanos, pero estoy bastante seguro de que usaron un mapa de bits para el paisaje (al menos en los juegos más antiguos de la serie).
Un enfoque muy básico sería una imagen de mapa de bits (B / N) donde los píxeles negros representan el aire y los píxeles blancos representan el suelo . La destrucción del paisaje se puede hacer fácilmente usando operaciones de píxeles. Entonces, si un cohete golpea el suelo, pinta un círculo negro radius = blastRadius
en el punto de impacto.
Luego puede renderizar su mundo (o solo una parte de él) utilizando ese mapa de bits. Para un mejor rendimiento, le sugiero que lo implemente de una manera que pueda actualizar / representar solo una parte del "mundo". P.ej. Si algunas partes del paisaje son destruidas por un cohete, simplemente vuelva a renderizar las áreas afectadas, no el mundo entero.
En lugar de una imagen en B / N como su "mapa de colisión", también podría usar una imagen de 24 bits donde use dos canales para almacenar la superficie normal (x, y) por píxel y un canal para almacenar la "colisión" real mapa". Tener la superficie normal a mano te ayudará enormemente a calcular las granadas que rebotan o a determinar si un personaje puede moverse en una dirección determinada.
Una posibilidad fuera de mi cabeza:
Utilice una representación de ruta de gráficos vectoriales para almacenar el contorno de la "tierra" destructible. Cuando ocurre un evento de destrucción (por ejemplo, una granada se dispara), el área de la explosión, representada como un círculo, se eliminaría del camino de tierra a través de una operación de resta booleana. El camino resultante representa la nueva "tierra" para la detección de colisión en el suelo, y posiblemente también una máscara para dibujar la tierra.
Escribí una prueba de concepto que usaba geometría sólida constructiva para manejar terrenos destructibles. Utilicé el Tessellator GLU para realizar las operaciones booleanas. La documentación explica cómo, busque "CSG Uses for Winding Rules" .
Introduje la salida triangular del teselador como polígonos estáticos en Box2D. El PoC funcionó bastante bien. Pude restar arbitrariamente y agregar terreno en tiempo real y el terreno continuó comportándose adecuadamente con Box2D. El único inconveniente real fue que el teselador GLU puede producir triángulos degenerados que a Box2D no le gustan, así que tuve que filtrarlos a mano.
El siguiente paso en el PoC (al que nunca llegué) fue usar el algoritmo SCC de la biblioteca de gráficos de impulso para detectar cuándo una porción del terreno se había cortado (cortar la cima de una montaña). El terreno cortado aún sería destructible, pero ahora está representado por un cuerpo Box2D dinámico (no estático) con los triángulos unidos como formas. Tuve el diseño resuelto pero perdí interés una vez que comencé a investigar la documentación de impulso. I "plan de" volver a examinar la idea cuando hago una tierra quemada / Worms juego algún día.
Todas las respuestas anteriores hablan sobre la implementación del caso más simple, como en los gusanos. Es decir, cuando se destruye el área de impacto y todo lo demás queda intacto. ¿Consideró que su paisaje puede dividirse en dos? Digamos que hay una montaña y los jugadores cortan el fondo con un lanzacohetes. Ahora, ¿no debería caer la montaña? Además, sería natural que un paisaje sea un poco elástico. En la época de los gusanos (al menos como los recuerdo, no jugué gusanos durante, como, muchos años) las computadoras no eran lo suficientemente fuertes como para hacerlo bien. Pero lo son ahora.
Por supuesto, depende totalmente de las ambiciones de su proyecto. Pero si quieres que sea realmente increíble, tal vez deberías probar Box2D como motor de física. Hay mucho que puedes hacer con él.
Como bummzack dijo Bitmaps. Aunque podría usar transparencias de 1 bit o si no tiene ese soporte, use un horrible color rosa que no usará en su juego.
El punto de impacto se puede calcular simplemente verificando el color del píxel. y cuando ocurre un impacto, cambie el color (o elimínelo) del mapa de bits.
En cuanto al radio de la explosión, mi primera parada sería el algoritmo circular de Bresenham , muy rápido y eficiente. Aunque primero haría un rought delete con algo así como un cuadrado y pondría el círculo alrededor para obtener los bordes.