Базовая сеть с Pygame - PullRequest
       25

Базовая сеть с Pygame

18 голосов
/ 01 апреля 2012

Мне нужно немного поработать над сетью для проекта Pygame.

По сути, это 2D-игра для одного игрока или кооперативная игра.Сеть должна поддерживать только двух игроков, один из которых является хостом.

Единственная информация, которую необходимо отправить, - это позиции игроков, крипов и пуль.

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

Итак, возможно ли для относительного новичка внедрить сеть в Pygame?Кто-нибудь может указать мне правильное направление?

Ответы [ 5 ]

12 голосов
/ 01 апреля 2012

Об этом недавно спросили в Reddit, так что я более или менее просто скопирую свой ответ оттуда.Я извиняюсь за то, что не смог предоставить больше ссылок, у меня <10 повторений, поэтому я могу публиковать только две за один раз. </p>

Twisted может работать, но у меня нет большого опыта с этим.Я бы порекомендовал использовать сокеты, так как в любом случае Twisted использует их в фоновом режиме.Руководство Биджа (google it) - это в значительной степени Библия сокетов, если вы хотите узнать, как они работают (в C ++, но концепции распространяются повсюду).Python устраняет некоторые сложности, но все же хорошая идея знать, что происходит в фоновом режиме.

Для сокетов, специфичных для Python, вы можете пойти дальше и просто использовать howto (user745294 разместил ссылку выше). Вот хорошая статья под названием «Что нужно знать каждому программисту об игровой сети».В нем рассматриваются различные типы основных сетевых стилей (клиент-сервер, p2p, udp v. Tcp и т. Д.), А также история того, что некоторые основные игры использовали для своих сетей.

Ниже приведена ссылка надемо я сделал при создании сетевой "игры" в Python 2.6 / Pygame.На самом деле это не игра, но каждый клиент, которого вы создаете, подключается к серверу и управляет персонажем.Вы можете перемещать своего персонажа с помощью клавиш со стрелками, и персонаж будет перемещаться на всех подключенных клиентах.Я пытался комментировать исходный код с некоторым указанием того, что я отправляю туда и обратно, но вам, возможно, понадобится немного знаний о сокетах, чтобы понять его.

Исходный код приведен в ссылках на кодовую панель в комментарии.ниже этого поста.Вам потребуется предоставить два изображения в одном каталоге со скриптами:

  1. bg.png - фоновый спрайт.Это должно быть изображение шириной 400px и высотой 300px (при необходимости это можно изменить в классе GameClient)
  2. sprite.png - персонаж игрока.Он должен быть меньше фона, чтобы вы могли видеть, как он движется.
6 голосов
/ 02 апреля 2012

Вы можете использовать Twisted для работы в сети с PyGame. В "игровом" проекте на Launchpad есть несколько примеров того, как можно объединить основные циклы; в основном, используйте twisted.internet.task.LoopingCall, чтобы рисовать кадры PyGame и обрабатывать ввод, позволяя выбранному реактору Twisted работать нормально.

2 голосов
/ 02 апреля 2012

Поскольку вы уже используете Pygame, я думаю, что эта легкая сетевая библиотека, созданная для Pygame, сделает то, что вам нужно, и научит вас, но не сокрушит вас. "Mastermind Networking Lib" через pygame.org

0 голосов
/ 02 апреля 2012

Использование необработанных розеток является низкоуровневым и полным опасности.Как уже было сказано, Twisted сложен и требует времени, чтобы начать работу.Чтобы избавить себя от головной боли, я бы попробовал что-то вроде https://github.com/dotcloud/zerorpc-python

Вам нужны следующие решения:

  • обнаружение других игроков в локальной сети, вы нехотите, чтобы игрок вводил какой-либо IP-адрес
  • обрабатывает сетевые ошибки
  • сериализует сообщения, содержащие ваши данные (позиции, имя игрока и т. д.)
  • обрабатывает потоки, так как сеть является асинхронным IO

Выше все еще следует называть «базовым», вам действительно нужно использовать какую-то необычную сетевую библиотеку с идиоматическим API.

ОБНОВЛЕНИЕ:

По сути, вам необходимо предоставить сетевой сервис(в своем собственном потоке), который будет отправлять сообщения в Queue Python, затем получать доступ к этой же очереди из вашего кода Pygame, и, если сообщение есть, вы обновляете все структуры, которые используете, чтобы сохранить позицию игрока и отображать ее на экране.Вы не должны посылать такие вещи, как позиции маркеров по сети, поскольку они могут быть легко (и быстрее) рассчитаны локально, вы просто отправляете событие, например bullet_shot, по сети с исходным положением и вектором скорости.

0 голосов
/ 02 апреля 2012

Существует pyro (удаленный объект python) в качестве другого решения для работы в сети на python.

http://irmen.home.xs4all.nl/pyro/

...