Как реализовать 2d взрывы, которые будут наносить ущерб с учетом покрытия и расстояния?

9

Как я могу реализовать двумерный взрыв таким образом, чтобы он наносил меньше урона персонажам, которые прячутся за ящиками или другим укрытием? В идеале повреждение будет зависеть от прочности покрытия (например, металлическая стена будет защищать лучше, чем деревянный ящик). В идеале урон будет уменьшаться с расстоянием.

Я собираюсь использовать порт физического движка Box2D - Farseer.

Спасибо.

логово
источник
1
Вики ( goo.gl/c1OJx ) рекомендует использовать частицы, которые могут иметь смысл, поскольку они имитируют реальные физические процессы. Кто-нибудь рассматривал такой подход?
Ден
1
Связанный: gamedev.stackexchange.com/questions/14171/…
finnw

Ответы:

8

Один из относительно простых способов сделать это - нарисовать луч от центра взрыва до центра каждой сущности DISTANCE(explosion,entity) < exlosion.max_radius(псевдокод).

Для каждого существа следуйте этому лучу, уменьшая базовый урон по мере движения. Всякий раз, когда вы ударяете объект, вычитаете его укрывистость от урона (существенно укорачивая луч).

Когда луч попадает на объект, любой урон остается вашим взрывным уроном.

Для этого подхода вам, вероятно, понадобится довольно высокий базовый урон, который быстро уменьшается с расстоянием (обратно пропорционально квадрату расстояния, что должно хорошо).


Другой подход - нарисовать сектор, полностью содержащий сущность; но не шире; и весь путь к .max_radius. Вычтите из области этого сектора площадь, покрытую любым покрытием между взрывом и объектом, умноженную на его значение покрытия. Оставшаяся область - ваш урон от взрыва.

Одним из приятных побочных эффектов этого является то, что чем ближе объект к взрыву, тем шире становится сектор и тем больший урон вы получаете (когда вы подсчитываете всю площадь сектора и просто вычитаете площадь покрытия между сущность и взрыв.

Также может быть полезно рассматривать покрытие как сущности; и просто вычтите урон, получаемый более близкими существами, от тех, кто находится дальше, но это может стать грубым.


Несомненно, существует еще более элегантный и умный подход, но он, вероятно, требует довольно неприятного исчисления. Это всегда так.

Виллихам Тотланд
источник
0

Уменьшение урона с расстоянием должно быть простой задачей. Когда вы создаете взрыв, вы должны знать координаты центра взрыва. Так как вы работаете в 2d, это будут просто x и y.

Все, что вам нужно сделать, это вычислить расстояние между игроками и координатами центра взрыва, используя теорему Пифагора, а затем использовать это значение для максимального радиуса, чтобы рассчитать процент от общего урона.

Например, возьмите координаты (x1, y1) в качестве центральной точки выражения, а (x2, y2) в качестве координат игрока. Затем мы можем рассчитать полученный ущерб следующим образом:

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

Что касается вещей на пути, я слишком устал, чтобы думать об ответе, но вы в основном будете искать пересечения вдоль линии от центра взрыва до игрока.

adamk
источник