Como implementar explosões 2D que causarão danos, levando em consideração coberturas e distâncias?

9

Como posso implementar uma explosão 2D de uma maneira que cause menos danos aos personagens que se escondem atrás de caixas ou outra capa? O dano ideal dependerá da força da tampa (por exemplo, uma parede de metal protegerá melhor do que uma caixa de madeira). Idealmente, os danos também diminuirão com a distância.

Vou usar uma porta do mecanismo de física Box2D - Farseer.

Obrigado.

Den
fonte
11
A Wiki ( goo.gl/c1OJx ) recomenda o uso de partículas que podem realmente fazer sentido, pois meio que simula processos físicos reais. Alguém já considerou essa abordagem?
Den

Respostas:

8

Uma maneira relativamente simplista de fazer isso é desenhar um raio do centro da explosão para o centro de toda entidade onde DISTANCE(explosion,entity) < exlosion.max_radius(pseudo-código).

Para cada entidade, siga este raio, diminuindo o dano base à medida que avança. Sempre que você acertar um objeto, subtraia o valor da cobertura do dano (diminuindo o raio).

Quando o raio atinge a entidade, qualquer dano que resta é o seu dano de explosão.

Para esta abordagem, você provavelmente deseja um dano de base bastante alto que diminua rapidamente com a distância (inversamente proporcional ao quadrado da distância deve ser bom).


Outra abordagem é desenhar um setor que contenha totalmente a entidade; mas não mais amplo; e todo o caminho até .max_radius. Subtraia da área deste setor a área coberta por qualquer cobertura entre a explosão e a entidade, multiplicada pelo seu valor de cobertura. A área restante é o seu dano de explosão.

Um efeito colateral puro disso é que, quanto mais próxima a entidade estiver da explosão, mais amplo o setor fica e mais danos você sofrerá (contando toda a área do setor e subtraindo apenas a área de cobertura entre entidade e explosão.

Também poderia ser útil tratar a cobertura como entidades; e simplesmente subtrair os danos sofridos por entidades mais próximas daqueles mais distantes, mas isso pode ficar horrível.


Sem dúvida, existe uma abordagem ainda mais elegante e inteligente, mas provavelmente requer algum cálculo bastante desagradável. Sempre faz.

Williham Totland
fonte
0

Dano diminuindo com a distância deve ser uma tarefa simples. Ao criar a explosão, você deve conhecer as coordenadas do centro da explosão. Como você está trabalhando em 2D, serão apenas x e y.

Tudo o que você precisa fazer é calcular as distâncias dos jogadores das coordenadas do centro da explosão usando o teorema de Pitágoras e depois usá-lo contra o raio máximo para calcular uma porcentagem do dano total.

Por exemplo, considere as coordenadas (x1, y1) como o ponto central da explicação e (x2, y2) como as coordenadas do jogador. Podemos então calcular o dano recebido da seguinte maneira:

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

Quanto às coisas no caminho, estou cansado demais para pensar na resposta, mas você basicamente procuraria cruzamentos ao longo da linha do centro da explosão até o jogador.

adamk
fonte