2012-04-01 6 views
13

Ich brauche einige grundlegende Vernetzung für ein Pygame-Projekt.Grundlegende Vernetzung mit Pygame

Grundsätzlich ist es ein 2D-Einzelspieler- oder kooperatives Spiel. Die Vernetzung muss nur 2 Spieler unterstützen, einen als Host.

Die einzige Information, die gesendet werden muss, sind die Positionen der Spieler, Creeps und Kugeln.

Ich habe gelesen und Twisted kommt immer wieder, aber ich habe noch nie zuvor Networking gemacht und ich bin mir nicht sicher, ob das ein Overkill sein könnte.

Also ist es für einen relativen Neuling möglich, Netzwerk in Pygame zu implementieren? Kann mir jemand in die richtige Richtung zeigen?

Antwort

11

Dies wurde kürzlich auf Reddit gefragt, also werde ich mehr oder weniger meine Antwort von dort kopieren. Ich entschuldige mich dafür, dass ich nicht in der Lage bin, mehr Links zur Verfügung zu stellen, ich habe < 10 rep, so dass ich nur zwei auf einmal posten kann.

Twisted könnte funktionieren, aber ich habe nicht eine ganze Menge Erfahrung damit. Ich würde empfehlen, mit Sockets zu gehen, da Twisted ohnehin im Hintergrund arbeitet. Beejs Guide (google it) ist so ziemlich die Bibel der Sockets, wenn man lernen möchte, wie sie funktionieren (in C++, aber die Konzepte erstrecken sich überall). Python abstrahiert etwas von der Komplexität, aber es ist immer noch eine gute Idee zu wissen, was im Hintergrund passiert.

Für Python-spezifische Sockets können Sie weitermachen und einfach das Howto verwenden (user745294 hat einen Link oben gepostet). Here ist ein netter Artikel mit dem Titel "Was jeder Programmierer über Game Networking wissen muss". Es geht in die verschiedenen Arten von wichtigen Netzwerkstilen (Client-Server, P2P, UDP v. TCP, etc.) und die Geschichte, die einige große Spiele für ihre Vernetzung verwendet.

Unten ist ein Link zu einer Demo, die ich gemacht habe, um ein vernetztes "Spiel" in Python 2.6/Pygame zu machen. Es ist kein Spiel, aber jeder Client, den Sie erstellen, verbindet sich mit dem Server und steuert einen Charakter. Du kannst deinen Charakter mit den Pfeiltasten bewegen und der Charakter bewegt sich auf allen verbundenen Clients. Ich habe versucht, den Quellcode mit einem Hinweis darauf, was ich hin und her sende, zu kommentieren, aber du brauchst vielleicht ein wenig Wissen über Sockets, um es zu verstehen.

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

+0

Hier sind ein paar Codepad-Links zum Client/Server, falls Sie mediafire nicht besuchen möchten (Sie müssen Ihre eigenen bg.png und sprite.png angeben). Server: http://codepad.org/p9lVrmqn Client: http://codepad.org/e6pwGj24 – nemec

+1

Die Mediafire-Verbindung ist sowieso tot, so scheint es. Die Codepad Links sind aber toll, danke! –

0

Es ist pyro (Python Remote-Objekt) als eine andere Lösung für die in Python zu vernetzen.

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

+0

Verwenden Sie Pyro nicht für nicht vertrauenswürdige Kommunikation. Es ist definitiv nicht für ein Spiel geeignet, das über das Internet gespielt wird. http://packages.python.org/Pyro4/security.html#pickle-as-serialization-format – Glyph

+0

Ich gebe zu, das ist nicht der beste Anwendungsfall dafür, danke für das Aufzeigen. – Tshirtman

0

Raw Sockets verwenden ist schwach- und voller Gefahren. Wie gesagt, Twisted ist komplex und braucht Zeit, um aufzustehen. Um sich einige Kopfschmerzen speichere ich so etwas wie https://github.com/dotcloud/zerorpc-python

würde versuchen, Sie müssen folgende Lösungen:

  • entdecken andere Spieler (n) auf (local) Netzwerk, Sie möchten nicht Spieler einige IP-Adresse einzugeben
  • Handle Netzwerkfehler
  • serialisieren Nachrichten mit Ihren Daten (Positionen, Spielername usw.))
  • als Netzwerkgriff Threading ist asynchron IO

Above noch ‚Basis‘ genannt werden, sollten Sie wirklich etwas Phantasie Networking-Bibliothek mit idiomatischen API verwenden sollten.

UPDATE:

Im Wesentlichen müssen Sie Netzwerkdienst belichten (in einem eigenen Thread), die Nachrichten an Pythons Queue, dann Zugriff auf diese gleiche Warteschlange von Ihrem Pygame Code drücken, und wenn es eine Nachricht ist, dass Sie dann aktualisieren Welche Strukturen Sie auch verwenden, um die Position des Spielers zu speichern und auf dem Bildschirm zu zeichnen. Sie sollten keine Dinge wie Geschosse über das Netzwerk senden, da sie einfach (und schneller) lokal berechnet werden können. Sie senden einfach ein Ereignis wie bullet_shot über das Netzwerk mit Quellposition und Geschwindigkeitsvektor.

+2

Twisted ist nicht so komplex. Ein Echo-Server besteht aus 3 Codezeilen. Ein 2-Wege-RPC-Server ist nicht viel mehr. Twisted ist eine allgemeine Netzwerklösung, die für einen Spielclient geeignet ist - zerorpc setzt auf zeromq und ist daher nicht für die Kommunikation mit nicht vertrauenswürdigen Clients geeignet; Es ist mehr für die Koordinierung von Back-End-Diensten miteinander. – Glyph

6

Sie können Twisted für die Vernetzung mit PyGame verwenden. The "game" project auf Launchpad hat einige Beispiele, wie man die Hauptschleifen integrieren könnte; Im Grunde verwenden Sie twisted.internet.task.LoopingCall, um PyGame-Frames zu zeichnen und Eingaben zu verarbeiten, während Sie den Twisted-Reaktor Ihrer Wahl normal laufen lassen.