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

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

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

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

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

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

Ответы на вопрос(5)

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

 skrx13 окт. 2018 г., 18:07
Mastermind используетсоленый огурец что не безопасно.«Предупреждение. Модуль pickle не защищен от ошибочных или вредоносных данных. Никогда не извлекайте данные, полученные из ненадежных или не прошедших проверку подлинности источников».
 skrx27 окт. 2018 г., 11:38
Автор изменил библиотеку, чтобы она теперь использовала json по умолчанию, что безопасно.

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

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

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

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

ОБНОВИТЬ:

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

 Glyph02 апр. 2012 г., 22:23
Витая не все так сложно. Эхо-сервер состоит из 3 строк кода. Двухсторонний RPC-сервер - это не намного больше. Twisted - это общее сетевое решение, подходящее для игрового клиента - zerorpc использует zeromq и, следовательно, не подходит для взаимодействия с ненадежным клиентом; это больше для координации внутренних сервисов друг с другом.

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

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

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

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

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

bg.png это фоновый спрайт. Это должно быть изображение шириной 400px и высотой 300px (это можно изменить вGameClient класс при необходимости)sprite.png это персонаж игрока. Он должен быть меньше фона, чтобы вы могли видеть, как он движется.
 John T08 мар. 2014 г., 11:23
Похоже, что ссылка на MediaFire мертва. Ссылки на кодовую панель отличные, спасибо!
 Jackpy08 нояб. 2018 г., 22:46
Привет, я знаю, что это старый, но ссылка на MediaFire не работает. Если у вас все еще есть исходный код, я действительно заинтересован!
 nemec10 нояб. 2018 г., 21:32
Исходный код приведен в ссылках на кодовую панель в комментарии выше. Единственный дополнительный контент, который был включен в mediafire - это два изображения: bg.png (фон) и sprite.png (персонаж игрока). Предоставьте два собственных изображения (у меня их больше нет), и код будет работать так, как ожидается.
 nemec01 апр. 2012 г., 21:30
Вот пара ссылок кодовой панели на клиент / сервер на случай, если вы не захотите посещать mediafire (вам нужно будет предоставить свои собственные bg.png и sprite.png). Сервер:codepad.org/p9lVrmqn Клиент:codepad.org/e6pwGj24

оты в сети на Python.

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

 Glyph02 апр. 2012 г., 23:34
Не используйте Pyro для любых ненадежных сообщений. Это определенно не подходит для игры в интернете.packages.python.org/Pyro4/...
 Tshirtman03 апр. 2012 г., 20:36
Я признаю, что это не лучший вариант использования, спасибо за указание.

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

Ваш ответ на вопрос