Должен ли я написать свой собственный физический движок, из-за сетевую интеграцию?

11

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

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

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

Причины для написания собственного физического движка -

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

Причины расширения / модификации JBox2D

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

Итак, что вы думаете. Это моя первая игра, и я не путь профессионального разработчика игр. Если кто-то может предоставить некоторые ссылки на работу, уже проделанную в этой области (желательно с использованием JBox2D / Box2D / Java).

liamzebedee
источник
Также обратите внимание, что если вы используете JBox2D, вам придется использовать его strictfpвезде, что серьезно повлияет на производительность. В противном случае сервер и клиент не может получить точно такие же результаты. Я бы рекомендовал использовать неподвижную точку вместо этого.
Сам Hocevar

Ответы:

7

Обнаружение столкновений в 2D так чертовски просто я не знаю, почему вы даже пробуйте использовать физический движок в первую очередь. А так как все усилия для манипулирования являются прямыми или изогнутыми (не падают, не меняют диагнозы и т. Д.), Лично для меня не проблема, что вы должны выбрать. Сделать свой собственный простой. Столкновение:

Рассмотрим 3 возможных столкновения, которые могут произойти в 2 прямоугольниках:

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

EDIT: Как прокомментировал, я гораздо меньше знакомы с этим вопросом, и не следует обращаться по поводу пули / снаряда столкновения.

Когда я работал с пулями в 2D пространстве, я использовал свой род Pathing, которые работали как в прямом и изогнутом, где я бы бросить снаряд, используя физический движок (что я не делал с нуля) и использовать стандартные столкновения.

Читайте о создании этого с нуля в комментариях.


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

  • Снаряд бросают
  • Направление это бросают в
  • Изогнут ли он или нет
    • И если да, то какова функция кривой
  • Что это за снаряд (это касается графики, эффектов, урона, всего)

Теперь обновление данных в двигателе в соответствии с этими данными, а не на сервере для каждого проклятого снаряда, и посылать пакетные данные для каждой пули. (Представьте, что вы делаете это даже с двумя пулеметами на экране! Господи!)

Джошуа Хеджес
источник
Конечно, его относительно легко реализовать, но я также заинтересован в оптимизации обнаружения столкновений, которую я не знаю, как реализовать.
liamzebedee
Метод , который я описал действительно не требует оптимизации , если вы делаете это , как описано. Единственная оптимизация, которая может потребоваться, - это время, в которое вы выполняете проверки, и то, как часто коллизии действительно обновляются. Например: Они действительно должны быть только обновляется , когда существует возможность столкновения.
Джошуа Hedges
Для того, чтобы расширить на то , что я в последний раз сказал. Вам действительно нужно проверять столкновение зданий, например, когда ваш персонаж движется в первую очередь. Вы только когда - либо необходимо для проверки блока столкновения, когда вы даже единицы в поле зрения, которые не ваш характер. Вам нужно только проверить снаряд столкновения, когда они вообще существуют (на тот момент). Вы можете пропустить любую форму обнаружения типа столкновения (от края до края? От угла к краю? И т. Д.) После того, как узнаете, что что-то даже касается чего-то другого или близко к нему. В противном случае, пропустите это в целом.
Джошуа Хеджес
За исключением случаев, когда я обрабатываю коллизии на стороне сервера, в которых мне нужно обнаруживать коллизии для нескольких игроков и т. Д.
liamzebedee
4
@MadPumpkin: ваша самоуверенность плохо отражается на вашем ответе; Вы говорите об обнаружении столкновений, но вы не упоминаете об обнаружении столкновений с размахом, который лежит в основе правильной обработки пуль в 2D-шутере. Кроме того , даже с подметание, разрешение примерно так же важно , как обнаружение , так как вы должны решить , что столкновение произошло первое, разрешать возможные конфликты, и , возможно , начать все снова разрешение в случае удаленных образований. Конечно , не тривиальный вопрос вы , кажется, подразумевает , что это.
Сэм Хочевар