Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

Это недавно было задано в Reddit, поэтому я более или менее просто копирую свой ответ оттуда. Я прошу прощения за невозможность предоставить больше ссылок, у меня есть < 10 rep, поэтому я могу отправлять только по два раза за раз.

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

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

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

http://www.mediafire.com/?bjwr225lpefzkfj

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

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

UPDATE:

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