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.
Respostas:
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.
fonte
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:
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.
fonte