2012-04-01 16 views
13

Necesito hacer algunas redes básicas para un proyecto de Pygame.Redes básicas con Pygame

Básicamente, se trata de un solo jugador en 2D o juego cooperativo. La red solo necesita admitir 2 jugadores, con uno como anfitrión.

La única información que debe enviarse es la posición de los jugadores, creeps y bullets.

He estado leyendo y Twisted sigue apareciendo, pero no he hecho redes antes y no estoy seguro de si eso podría ser una exageración.

Entonces, ¿es posible que un novato relativo implemente redes en Pygame? ¿Alguien puede señalarme en la dirección correcta?

Respuesta

11

Esto se hizo recientemente en Reddit, así que más o menos me limitaré a copiar mi respuesta desde allí. Me disculpo por no poder proporcionar más enlaces, tengo < 10 rep por lo que solo puedo publicar dos a la vez.

Twisted podría funcionar, pero no tengo mucha experiencia con él. Recomiendo ir con sockets, ya que eso es lo que Twisted usa en el fondo de todos modos. La guía de Beej (google it) es más o menos la Sagrada Biblia de los sockets si quieres aprender cómo funcionan (en C++, pero los conceptos se extienden por todas partes). Python sí abstrae parte de la complejidad, pero aún así es una buena idea saber qué está sucediendo en el fondo.

Para sockets específicos de Python, puede seguir adelante y simplemente usar el howto (user745294 publicó un enlace arriba). Here es un buen artículo titulado "Lo que todo programador necesita saber sobre Game Networking". Se incluye en los diferentes tipos de estilos de red principales (cliente-servidor, p2p, udp v. Tcp, etc.) y la historia detrás de lo que algunos juegos importantes utilizaron para su red.

A continuación se muestra un enlace a una demostración que hice sobre la creación de un "juego" en red en Python 2.6/Pygame. En realidad, no es un juego, pero cada cliente que creas se conecta al servidor y controla un personaje. Puede mover su personaje con las teclas de flecha y el personaje se moverá en todos los clientes conectados. Traté de comentar el código fuente con alguna indicación de lo que estoy enviando de ida y vuelta, pero es posible que necesite un poco de conocimiento acerca de los enchufes para entenderlo.

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

+0

Aquí hay un par de enlaces del teclado numérico al Cliente/Servidor en caso de que no desee visitar mediafire (deberá proporcionar su propio bg.png y sprite.png). Servidor: http://codepad.org/p9lVrmqn Cliente: http://codepad.org/e6pwGj24 – nemec

+1

El enlace de mediafire está muerto de todos modos, al parecer. Los enlaces del teclado numérico son geniales, ¡gracias! –

0

Hay pyro (objeto remoto pitón) como otra solución para la creación de redes en Python.

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

+0

No use Pyro para las comunicaciones que no sean de confianza. Definitivamente no es adecuado para un juego jugado en internet. http://packages.python.org/Pyro4/security.html#pickle-as-serialization-format – Glyph

+0

Admito que ese no es el mejor caso de uso, gracias por señalarlo. – Tshirtman

0

Uso de las tomas en bruto es de bajo nivel y lleno de peligros. Como dije antes, Twisted es complejo y toma tiempo para ponerse en marcha. Para ahorrarse algunos dolores de cabeza que me gustaría probar algo así como https://github.com/dotcloud/zerorpc-python

Es necesario siguientes soluciones:

  • descubrimiento de otro jugador (s) en la red (local), no desea que el jugador entre en alguna dirección IP
  • maneja errores de red
  • serializa los mensajes que contienen tus datos (posiciones, nombre del jugador, etc.)
  • roscado mango, como la creación de redes es asíncrona IO

fija anteriores debería ser llamado 'básico', que realmente debería usar alguna fantasía redes biblioteca con API idiomática.

ACTUALIZACIÓN:

Esencialmente lo que necesita para exponer servicio de red (en su propio hilo) que empujará mensajes a Python de Queue, a continuación, acceder a esta misma cola de su código de Pygame, y si hay un mensaje luego de actualizar cualquier estructura que use para almacenar la posición del jugador y dibujarla en la pantalla. No debe enviar cosas como posiciones de bala a través de la red, ya que pueden calcularse fácilmente (y más rápido) localmente, solo envíe un evento como bullet_shot a través de la red con la posición de origen y el vector de velocidad.

+2

Twisted no es tan complejo. Un servidor de eco es de 3 líneas de código. Un servidor RPC de 2 vías no es mucho más que eso. Sin embargo, Twisted es una solución de red general, adecuada para un cliente de juegos: zerorpc depende de zeromq y, por lo tanto, no es adecuada para las comunicaciones de clientes no confiables; es más para coordinar servicios de back-end entre sí. – Glyph

6

Puede usar Twisted para establecer una red con PyGame. The "game" project en Launchpad tiene algunos ejemplos de cómo se podrían integrar los bucles principales; básicamente, use twisted.internet.task.LoopingCall para dibujar fotogramas PyGame y manejar entrada, mientras deja que el reactor Twisted de su elección se ejecute normalmente.