Как я могу реализовать двумерный взрыв таким образом, чтобы он наносил меньше урона персонажам, которые прячутся за ящиками или другим укрытием? В идеале повреждение будет зависеть от прочности покрытия (например, металлическая стена будет защищать лучше, чем деревянный ящик). В идеале урон будет уменьшаться с расстоянием.
Я собираюсь использовать порт физического движка Box2D - Farseer.
Спасибо.
Ответы:
Один из относительно простых способов сделать это - нарисовать луч от центра взрыва до центра каждой сущности
DISTANCE(explosion,entity) < exlosion.max_radius
(псевдокод).Для каждого существа следуйте этому лучу, уменьшая базовый урон по мере движения. Всякий раз, когда вы ударяете объект, вычитаете его укрывистость от урона (существенно укорачивая луч).
Когда луч попадает на объект, любой урон остается вашим взрывным уроном.
Для этого подхода вам, вероятно, понадобится довольно высокий базовый урон, который быстро уменьшается с расстоянием (обратно пропорционально квадрату расстояния, что должно хорошо).
Другой подход - нарисовать сектор, полностью содержащий сущность; но не шире; и весь путь к
.max_radius
. Вычтите из области этого сектора площадь, покрытую любым покрытием между взрывом и объектом, умноженную на его значение покрытия. Оставшаяся область - ваш урон от взрыва.Одним из приятных побочных эффектов этого является то, что чем ближе объект к взрыву, тем шире становится сектор и тем больший урон вы получаете (когда вы подсчитываете всю площадь сектора и просто вычитаете площадь покрытия между сущность и взрыв.
Также может быть полезно рассматривать покрытие как сущности; и просто вычтите урон, получаемый более близкими существами, от тех, кто находится дальше, но это может стать грубым.
Несомненно, существует еще более элегантный и умный подход, но он, вероятно, требует довольно неприятного исчисления. Это всегда так.
источник
Уменьшение урона с расстоянием должно быть простой задачей. Когда вы создаете взрыв, вы должны знать координаты центра взрыва. Так как вы работаете в 2d, это будут просто x и y.
Все, что вам нужно сделать, это вычислить расстояние между игроками и координатами центра взрыва, используя теорему Пифагора, а затем использовать это значение для максимального радиуса, чтобы рассчитать процент от общего урона.
Например, возьмите координаты (x1, y1) в качестве центральной точки выражения, а (x2, y2) в качестве координат игрока. Затем мы можем рассчитать полученный ущерб следующим образом:
Что касается вещей на пути, я слишком устал, чтобы думать об ответе, но вы в основном будете искать пересечения вдоль линии от центра взрыва до игрока.
источник