¿Cómo implementar explosiones 2D que causarán daños teniendo en cuenta las cubiertas y la distancia?

9

¿Cómo puedo implementar una explosión 2D de manera que cause menos daño a los personajes que se esconden detrás de cajas u otra cubierta? Idealmente, el daño dependerá de la resistencia de la cubierta (por ejemplo, la pared de metal protegerá mejor que la caja de madera). Idealmente, el daño disminuirá con la distancia también.

Voy a utilizar un puerto del motor de física Box2D: Farseer.

Gracias.

Guarida
fuente
1
Wiki ( goo.gl/c1OJx ) recomienda el uso de partículas que podrían tener sentido ya que simula procesos físicos reales. ¿Alguien ha considerado tal enfoque?
Den

Respuestas:

8

Una forma relativamente simplista de hacer esto es dibujar un rayo desde el centro de la explosión hasta el centro de cada entidad donde DISTANCE(explosion,entity) < exlosion.max_radius(pseudocódigo).

Para cada entidad, sigue este rayo, disminuyendo el daño base a medida que avanzas. Cada vez que golpeas un objeto, resta su valor de cobertura del daño (esencialmente acortando el rayo).

Cuando el rayo golpea a la entidad, cualquier daño que quede es tu daño de explosión.

Para este enfoque, es probable que desee un daño base bastante alto que disminuya rápidamente con la distancia (inversamente proporcional al cuadrado de la distancia debería funcionar bien).


Otro enfoque es dibujar un sector que contenga completamente la entidad; pero no más ancho; y todo el camino a cabo .max_radius. Reste del área de este sector el área cubierta por cualquier cobertura entre la explosión y la entidad, multiplicada por su valor de cobertura. El área restante es el daño de tu explosión.

Un claro efecto secundario de esto es que cuanto más cerca está la entidad de la explosión, más amplio se vuelve el sector y más daño sufres (a medida que cuentas toda el área del sector y solo restas el área de cobertura entre entidad y explosión.

También podría ser útil tratar la cobertura como entidades; y simplemente resta el daño recibido por las entidades más cercanas de las que están más lejos, pero eso podría volverse retorcido.


Indudablemente existe un enfoque aún más elegante e inteligente, pero probablemente requiere un cálculo bastante desagradable. Siempre lo hace.

Williham Totland
fuente
0

El daño que disminuye con la distancia debería ser una tarea simple. Cuando crea la explosión, debe conocer las coordenadas del centro de la explosión. Como está trabajando en 2d, será solo x e y.

Todo lo que necesita hacer es calcular las distancias del jugador (s) desde las coordenadas del centro de la explosión usando el teorema de Pitágoras y luego usar eso contra el radio máximo para calcular un porcentaje del daño total.

Por ejemplo, tome las coordenadas (x1, y1) como el punto central de la explosión, y (x2, y2) como las coordenadas del jugador. Luego podemos calcular el daño sufrido de la siguiente manera:

Distance from centre = sqrt((x2-x1 + (y2-y1)²)
Damage taken = (Distance from centre/Explosion radius) * max damage 

En cuanto a las cosas en el camino, estoy demasiado cansado para pensar en la respuesta, pero básicamente estarías buscando intersecciones a lo largo de la línea desde el centro de la explosión hasta el jugador.

adamk
fuente