Базовая сеть с Pygame
Мне нужно создать базовую сеть для проекта Pygame.
В принципе, это 2D однопользовательская игра или совместная игра. Сети должны поддерживать только 2 игрока, причем один из них является хостом.
Единственная информация, которую нужно отправить, - это позиции игроков, крипов и пуль.
Я читал, и Twisted продолжает подниматься, но я еще не занимался сетью раньше, и я не уверен, что это может быть перебор.
Итак, возможно ли относительное новичку реализовать сетевое взаимодействие в Pygame? Может ли кто-нибудь указать мне в правильном направлении?
Ответы
Ответ 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
по сети с исходным положением и вектором скорости.