Як здійснити вибухи 2d, які спричинить збитки з урахуванням покривів та відстані?


9

Як я можу здійснити вибух 2D таким чином, щоб він завдав менше шкоди персонажам, які ховаються за ящиками чи іншим покриттям? В ідеалі пошкодження залежатимуть від міцності покриття (наприклад, металева стіна захистить краще, ніж дерев’яна обрешітка). В ідеалі збиток зменшиться і з відстані.

Я буду використовувати порт фізичного двигуна Box2D - Farseer.

Дякую.


1
Wiki ( goo.gl/c1OJx ) рекомендує використовувати частинки, що може насправді мати сенс, оскільки це наче імітує фактичні фізичні процеси. Хтось вважав такий підхід?
День

Відповіді:


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 

Що стосується речей у дорозі, я занадто втомився, щоб думати про відповідь, але ви, в основному, шукали б перехрестя по лінії від центру вибуху до гравця.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.