2012-04-01 7 views
13

Ho bisogno di fare un po 'di networking di base per un progetto Pygame.Networking di base con Pygame

Fondamentalmente, è un gioco 2D a giocatore singolo o cooperativo. Il networking ha solo bisogno di supportare 2 giocatori, con uno come host.

L'unica informazione che deve essere inviata è la posizione di giocatori, brividi e pallottole.

Ho letto e Twisted continua a venire, ma non ho mai fatto il networking e non sono sicuro che potrebbe essere eccessivo.

Quindi, è possibile che un novizio relativo implementa il networking in Pygame? Qualcuno può indicarmi la giusta direzione?

risposta

11

Questo è stato chiesto di recente su Reddit, quindi dovrò più o meno semplicemente copiare la mia risposta da lì. Mi scuso per non essere in grado di fornire più link, ho < 10 rep, quindi posso pubblicare solo due alla volta.

Twisted potrebbe funzionare, ma non ho molta esperienza con esso. Consiglierei di andare con le prese, poiché è quello che Twisted utilizza in background comunque. La guida di Beej (google it) è praticamente la Sacra Bibbia di socket se vuoi imparare come funzionano (in C++, ma i concetti si estendono ovunque). Python distoglie parte della complessità, ma è comunque una buona idea sapere cosa sta succedendo in background.

Per i socket specifici Python, è possibile andare avanti e utilizzare semplicemente howto (user745294 ha pubblicato un collegamento sopra). Here è un bell'articolo intitolato "Ciò che ogni programmatore deve sapere su Game Networking". Si inserisce nei diversi tipi di principali stili di networking (client-server, p2p, udp v. Tcp, ecc.) E la storia dietro ciò che alcuni dei principali giochi utilizzati per il loro networking.

Di seguito è riportato un collegamento a una demo che ho realizzato per creare un "gioco" in rete in Python 2.6/Pygame. In realtà non è un gioco, ma ogni client che crei si connette al server e controlla un personaggio. Puoi spostare il tuo personaggio con i tasti freccia e il personaggio si sposterà su tutti i client connessi. Ho provato a commentare il codice sorgente con qualche indicazione su cosa sto mandando avanti e indietro, ma potresti aver bisogno di un po 'di conoscenza sui socket per capirlo.

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

+0

Qui ci sono un paio di collegamenti di codepad al Client/Server nel caso in cui non si voglia visitare Mediafire (dovrai fornire i tuoi file bg.png e sprite.png). Server: http://codepad.org/p9lVrmqn Client: http://codepad.org/e6pwGj24 – nemec

+1

Il link mediafire è morto comunque, sembrerebbe. I link al codepad sono fantastici però, grazie! –

0

C'è piro (pitone oggetto remoto) come un'altra soluzione per reti nei pitone.

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

+0

Non utilizzare Pyro per comunicazioni non affidabili. Sicuramente non è adatto per un gioco giocato su internet. http://packages.python.org/Pyro4/security.html#pickle-as-serialization-format – Glyph

+0

Ammetto che non è il caso d'uso migliore per questo, grazie per la segnalazione. – Tshirtman

0

Uso delle prese prime è basso livello e piena di pericoli. Come detto prima, Twisted è complesso e richiede tempo per essere installato e funzionante. Per risparmiare qualche mal di testa mi piacerebbe provare qualcosa di simile https://github.com/dotcloud/zerorpc-python

È necessario seguenti soluzioni:

  • scoperta altro giocatore (s) sulla rete (locale), non si vuole il giocatore per inserire alcuni indirizzi IP
  • gestire errori di rete
  • serializzare i messaggi contenenti i dati (posizioni, nome giocatore, ecc.)
  • maniglia threading come networking è asincrona IO

Sopra dovrebbe ancora essere chiamato 'base', si dovrebbe davvero utilizzare alcuni di fantasia networking libreria API idiomatica.

UPDATE:

In sostanza è necessario per esporre servizio di rete (in un suo filo) che spingerà i messaggi a Python di Queue, quindi accedere a questa stessa coda dal codice Pygame, e se c'è un messaggio quindi si aggiorna qualsiasi struttura tu usi per memorizzare la posizione del giocatore e disegnarla sullo schermo. Non dovresti inviare cose come le posizioni dei proiettili sulla rete in quanto possono essere facilmente (e più velocemente) calcolate localmente, basta inviare un evento come bullet_shot sulla rete con la posizione di origine e il vettore di velocità.

+2

Twisted non è poi così complesso. Un server di eco è costituito da 3 righe di codice. Un server RPC a 2 vie non è molto più di questo. Twisted è una soluzione di rete generale, tuttavia, adatta per un client di gioco: zerorpc si affida a zeromq e non è quindi adatto alle comunicazioni client non attendibili; è più per coordinare i servizi di back-end l'uno con l'altro. – Glyph

6

È possibile utilizzare Twisted per il collegamento in rete con PyGame. The "game" project su Launchpad ha alcuni esempi di come si possano integrare insieme i loop principali; in pratica, usa twisted.internet.task.LoopingCall per disegnare i frame PyGame e gestire l'input, mentre fai girare normalmente il reattore Twisted di tua scelta.