Чи слід писати власний двигун фізики через інтеграцію в мережу?


11

На даний момент я розробляю шутер від зомбі в режимі реального часу. Я кодую це в Java, використовуючи JBox2D як мій двигун фізики. Я кодував мережу на цьому тижні, і зараз я переймаюся фізичною синхронізацією.

Я планую використовувати прогностичну клієнтську / авторитетну модель сервера, де клієнт може вільно переміщатися, доки сервер згодом це схвалить. Це передбачає, що клієнт надсилає на сервер пакети, що містять дані про рух, і сервер обчислює затримку та повторно моделює світ із старого стану.

Моя проблема полягає в тому, що мій поточний двигун фізики JBox2D (в основному порт Box2D) не підтримує відкочування світу, і, мабуть, не так просто серіалізувати світові дані. У мене є 2 рішення, я можу або змінити / розширити свій поточний двигун фізики, або написати своє.

Причини написання мого власного фізичного двигуна -

  • Я можу видалити непотрібні функції. У грі зверху вниз мені дуже потрібні лише механіки зіткнення та керованість. Ніякої сили тяжіння не бере участь.
  • Я можу зрозуміти код краще, і було б [швидше за все] легше реалізувати функції відкоту

Причини розширення / модифікації JBox2D

  • Написання власного двигуна фізики було б значною роботою, яка могла б бути громіздкою
  • JBox2D має широку підтримку спільноти, яка може допомогти мені з моїм розробником
  • JBox2D має спеціальні оптимізації для таких речей, як виявлення зіткнень, які роблять його корисним
  • Деякі роботи, як уже зроблено над цим, але ділилися мало коду

То які ваші думки. Це моя перша гра, і я аж ніяк не професійний розробник ігор. Якщо хтось може надати кілька посилань на роботу, вже виконану в цьому районі (бажано, використовуючи JBox2D / Box2D / Java).


Також зауважте, що якщо ви використовуєте JBox2D, вам потрібно буде користуватися strictfpскрізь, що серйозно вплине на продуктивність. Інакше сервер і клієнт можуть не отримати абсолютно однакових результатів. Я б рекомендував замість цього використовувати фіксовану точку.
sam hocevar

Відповіді:


7

Виявлення зіткнень у 2D настільки проклято, що я не знаю, чому ви б взагалі заважали використовувати двигун фізики. А оскільки всі сили управління прямими вперед або на кривій (без падіння, зміни діагнозів і т. Д.) Особисто мені це не потрібно, щоб вибрати. Зробити своє самостійно просто. Зіткнення:

врахуйте 3 можливі зіткнення, які можуть статися у двох прямокутниках:

  1. Край до краю: Досить просто, ви отримуєте вісь одного краю, а іншої, і ви вирішуєте, займають вони або той самий простір, або досить близько до нього.
  2. Край до кута: це легко стане найпоширенішим, якщо у вас обертові форми. На щастя, це також досить просто здійснити.
  3. Куточок до кута: це трапляється так рідко, що навіть не варто їх застосовувати. Причиною цього є те, що дві речі повинні рухатися в абсолютно протилежних напрямках на тій самій точній осі вниз до останніх обчислених вами двигунів. Тепер, якщо все обертається на 45 або 90 градусів, це МОЖЕ (навіть все ще, мабуть, не варто) включати

EDIT: Як коментується, я набагато менш знайомий з цією справою, і не слід консультуватися з приводу зіткнення кулі / снаряду.

Коли я працював з кулями в двовимірному просторі, я використав своєрідний шлях, який працював як по прямій, так і в кривій частині, де я б кинув снаряд за допомогою двигуна фізики (що я не робив з нуля) і використовував стандартне зіткнення.

Про будівництво цього з нуля читайте в коментарях.


Редагувати: * Повірте мені, * незалежно від того, вам знадобиться якась форма мертвих рахунків у вашому ігровому двигуні, через снаряди та скільки снарядів може бути на екрані в будь-який момент часу. Ви АБСОЛЮТНО не хочете оновлювати кожну кулю на екрані за кадром у вказаному місці. Але це прекрасний спосіб зробити гру незвично повільною: D! Вам слід коли-небудь оновлювати ці речі:

  • Кидається снаряд
  • Напрямок, в який його кидають
  • Зігнутий він чи ні
    • І якщо так, то яка функція кривої
  • Що це снаряд (це пояснює графіку, ефекти, пошкодження, все)

Тепер оновіть дані в двигуні відповідно до цих даних, а не на сервері для кожного проклятого снаряда і надсилайте пакетні дані для кожної кулі. (Уявіть, що ви робите це навіть із 2-х кулеметів на екрані! Ісусе!)


Звичайно, це порівняно просто в реалізації, але мене також цікавить оптимізація виявлення зіткнень, яку я не маю уявлення, як реалізувати.
liamzebedee

Описаний нами метод дійсно не потребуватиме оптимізації, якщо ви зробите це так, як описано. Єдиною оптимізацією, яка може знадобитися, є час, коли ви підготуєте перевірки, і як часто зіткнення насправді оновлюються. Напр .: ЇХ РОЗПОВІДНО оновлювати лише тоді, коли є можливість зіткнення.
Джошуа Хеджес

Щоб розширити те, про що я говорив востаннє. Вам потрібно дійсно перевірити наявність колізій, наприклад, коли ваш персонаж рухається в першу чергу. Вам потрібно коли-небудь перевіряти на предмет зіткнення, коли у вас навіть є одиниці, які не є вашим персонажем. Потрібно лише перевірити на предмет зіткнення снарядів, коли вони навіть існують (на той момент). Ви можете пропустити будь-яку форму виявлення типу зіткнення (це край до краю? Кут до краю? Тощо), після того як ви дізнаєтесь, що щось навіть торкається чогось іншого або близько до нього. В іншому випадку пропустіть його в цілому.
Джошуа Хеджес

За винятком випадків, коли я обробляю сторону сервера зіткнень, в якій мені потрібно виявити зіткнення для декількох гравців тощо
liamzebedee

4
@MadPumpkin: ваша самовпевненість погано відображається на вашій відповіді; Ви говорите про виявлення зіткнень, але ви не згадуєте про виявлення зіткнення, що є основним принципом правильної керованості кулями у 2D стрільбі. Крім того, навіть під час розгортання, дозвіл настільки ж важливий, як і виявлення, оскільки вам потрібно вирішити, яке зіткнення відбулося спочатку, вирішити потенційні конфлікти та, можливо, запустити всю резолюцію заново у випадку вилучення сутностей. Звичайно, це не тривіальна матерія, яку ви, мабуть, натякаєте на це.
sam hocevar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.