реализация сетевого многопользовательского игрового цикла в витой - PullRequest
0 голосов
/ 04 марта 2019

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

это многопользовательская стрелялка.

Теперь я хочу интегрировать основной цикл вигра (на стороне сервера) для обработки ввода и физики (для пуль и игроков). Входные данные принимаются от клиентов через веб-сокеты.Я хочу, чтобы игровой цикл запускал игру, скажем так.50 кадров в секунду.

, если я следую методу реализации игрового цикла, упомянутого в этой статье .у меня есть этот код ниже

previous = getCurrentTime()

def loop():
    double lag = 0.0
    while True:

      current = getCurrentTime()
      elapsed = current - previous
      previous = current
      lag += elapsed

      processInput()

      while (lag >= MS_PER_UPDATE):
        update()
        lag -= MS_PER_UPDATE
      send_state_to_connected_clients()

В статье упоминается, что:

Если вы создаете игру, которая работает в веб-браузере, вы в значительной степени не можетенаписать свой собственный классический игровой цикл.Основанный на событиях характер браузера исключает его

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

в той же статье внизу упоминаются следующие пункты:

Используйте цикл событий платформы:
1. Это просто.Вам не нужно беспокоиться о написании и оптимизации основного цикла игры
2. Это хорошо сочетается с платформой.Вам не нужно беспокоиться о том, чтобы явно предоставить хосту время для обработки его собственных событий, кэширования событий или иным образом управлять несоответствием импеданса между входной моделью платформы и вашей.

Что я ищуЭто общий подход к реализации игрового цикла в витой (для сетевой многопользовательской игры).

  • если я использую встроенный реактор, используя LoopingCall для вызова моего Loop?Как это тогда обрабатывает вопросы, упомянутые в статье.
  • Должен ли я как-то создать свой собственный цикл?(например, используя потоки / процессы или какую-то другую конструкцию для запуска игрового цикла отдельно от реактора)
  • Должен ли я как-то создать свою собственную реализацию реактора?

1 Ответ

0 голосов
/ 04 марта 2019

Если я правильно понимаю проблему, у вас будет сервер Python, и игроки будут воспроизводить FPS в реальном времени в браузере.Вам придется:

  • отображать игру в режиме реального времени
  • обрабатывать пользовательские события в браузере
  • отправлять результаты событий браузера на сервер
  • анализ результатов на сервере
  • отправка событий сервера в браузер
  • обработка событий сервера в браузере

Мы уже знаем, что вы собираетесьиспользуйте WebSockets.

Отображение игры в режиме реального времени

Вам нужно будет отобразить графику где-нибудь, возможно, внутри холста.Вам нужно будет реализовать множество функций, таких как обновление строки состояния, отображение изменений и так далее.Они будут срабатывать при обработке ответов от сервера.

Обработка пользовательских событий в браузере

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

Отправлять результаты событий браузера на сервер

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

Разобрать результаты на сервере

Сервер будет иметь цикл обработки событий и будет получать сообщения WebSocket от браузеров игроков.Например, если сервер получает событие съемки, он получит текущие координаты игрока и направление, вычислит, куда направляется пуля, и отправит сообщение в браузер игроков.Если кого-то ударили, то должен быть рассчитан урон и определен, умирает ли игрок, впоследствии игроки будут получать сообщения WebSocket с сервера, и впоследствии звук пуль будет отображаться вместе с графическим дисплеем пули и, возможно, кровью, падающими игроками.и т. д.

Отправка серверных событий в браузер

Браузеры будут прослушивать сообщения WebSocket с сервера и обрабатывать их.

Обрабатывать серверные события в браузере

Мы не можем доверять пользовательским событиям, потому что может быть вовлечен некоторый обман, поэтому, когда вы снимаете, браузер будет обрабатывать событие, и сервер получит сообщение.Когда сервер отправляет сообщение WebSocket, браузеры «верят», что сервер отправил точный ответ.

Технические потребности

Вам понадобится графический API, прослушиватели пользовательских событий и прослушиватели WebSocket вбраузеры.На сервере вы будете прослушивать клиентские сообщения WebSocket.

...