[XNA] Videojuegos multijugador

Si desarrollar un videojuego ya de por sí es un reto, el tema se complica mucho más si este es multijugador. Hay muchas cosas que controlar: latencia, pérdida de datos, orden de envío/recepción de paquetes, optimización de la cantidad de datos a enviar/recibir… en este artículo primero recopilo algunos consejos para el desarrollo de juegos multijugador (no necesariamente específicos de XNA), y posteriormente veremos un pequeño ejemplo en esta genial plataforma de Microsoft. (que nadie se asuste, aunque programar juegos multijugador es complicado, XNA facilita las cosas encapsulando de forma muy sencilla cosas que si tubiéramos que codificar por nuestra cuenta tendrían una considerable complejidad añadida).

 

Tipologías de red

Esto os recordará a las asignaturas de redes… para los videojuegos, las tipologías más comunes son las conexiones «peer to peer» (todos los mensajes se envían a todo el mundo por parte de cada máquina), y la tipología cliente/servidor (cada máquina-jugador envía los datos a un servidor central, y este redistribuye la información). Tengamos en cuenta que el servidor puede ser una máquina dedicada, o una de las máquinas de los propios jugadores, que también puede actuar como tal.

Es una decisión de diseño importante seleccionar la tipología de red, ya que por ejemplo, la tipología peer to peer puede llegar a consumir todo el ancho de banda disponible si hay muchos jugadores conectados. Hay que vigilar con este punto.

 

El problema de la latencia

Es un problema tan molesto como inevitable, la latencia siempre estará ahí, por muy buena conexión que tengamos, y por más que optimicemos nuestro juego… la red es algo que no controlamos nosotros (sobretodo si no es una red local). Por ello hay que tomar decisiones importantes durante la fase de diseño de la lógica de nuestros juegos: por ejemplo, qué haremos si durante varios ciclos del juego no conocemos la nueva opsición de los demás jugadores… una posible aproximación sería presuponer que los demás jugadores mantienen la misma velocidad y dirección en cada instante, respecto el último dato conocido de los mismos. Aunque obviamente esto puede dar lugar a imprecisiones, puede reducir los efectos de «parpadeo», o «desaparición» de jugadores por la pantalla. En el XNA Creators Club Online encontramos un ejemplo de código perfecto de una implementación para minimizar este problema.

 

Sacar provecho del multithreading

Es recomendable utilizar un thread específico para la comunicación (envío de información entre las máquinas de los jugadores), y otro para la lógica del juego (física, AI, etc). Con esto se exprimirá la capacidad de la XBOX 360 y el PC, y los problemas de latencia no afectarán tanto al rendimiento general del juego.  Respecto este tema, existe un excelente tutorial en ziggyware, que recomiendo.

 

Haz todas las pruebas que puedas

Si de por sí ya es importante hacer pruebas en nuestros juegos antes de lanzarlos al mundo, con los juegos multijugador estas hay que multiplicarlas. Por suerte con XNA se puede simular tanto la latencia como la pérdida aleatoria de paquetes con el objetivo de depurar mejor nuestro juego.

Tecnología multiplayer en XNA

XNA tiene «acceso directo» a los servicios Windows LIVE y XBOX LIVE de forma gratuita y casi transparente (dependiendo de la plataforma en la que se ejecute nuestro juego). Entre otras cosas, lo que nos ofrece es:

  •  Creación de hosts
  • Manejo de conexiones
  • Comunicaciones por voz entre los jugadores
  • No puedes conectarte a un servidor propio en Internet si estás dentro de LIVE (pero se pueden implementar métodos de conectividad alternativos, aunque no funcionarían en XBOX 360)

 

Conectando a Windows/XBOX LIVE

La conexión a este servicio de Microsoft, nos resultará gratuita, y su funcionalidad se encapsula en el namespace GamerServices. Hagamos una prueba básica… crearemos un proyecto nuevo, y en el constructor de la clase Game,  añadiremos la siguiente línea de código: Components.Add(new GamerServicesComponent(this)); Después, ejecutaremos el juego y pulsaremos la tecla INICIO. Y ya estamos conectados a LIVE! Deberíamos ver algo parecido a lo siguiente:

A partir de aquí podemos crear una cuenta LIVE, o identificarnos con la nuestra -si tienes una cuenta «hotmail.com» o «live.com» puedes puedes autenticarte directamente-. Cuando estemos autenticados, veremos algo parecido a lo siguiente:

 

El poder (y el precio) de LIVE

Como hemos visto en el sencillo ejemplo, acceder a los servicios de LIVE es sencillo, y muy potente además. No obstante, tiene por supuesto sus limitaciones, sobretodo si trabajamos sobre la XBOX 360. Estas limitaciones son que no puedes enviar datos a servidores externos. Esto previene que se haga un mal uso de la información de los jugadores, pero la desventaja es que no se puede almacenar información personalizada online, que podría ser utilizada para hacer juegos multijugador más complejos, o cuyas partidas no fueran síncronas.

Los requerimientos de membresía a los servicios de LIVE son los siguientes para las distintas plataformas soportadas:

Xbox 360 console Windows-based development computer Zune
Run an XNA Framework Game LIVE Silver membership + Premium XNA Creators Club membership No memberships required No memberships required
Use System Link for Local Area Network gameplay LIVE Silver membership + Premium XNA Creators Club membership No memberships required No memberships required
Sign in to Xbox LIVE and Games for Windows – LIVE Servers LIVE Silver membership + Premium XNA Creators Club membership LIVE Silver membership + Premium XNA Creators Club membership Not available on Zune
Use LIVE to connect to other machines over the Internet while the game is in
development
LIVE Gold membership + Premium XNA Creators Club membership LIVE Silver membership + Premium XNA Creators Club membership Not available on Zune

 

Podéis encontrar más información al respecto en el MSDN: Getting Started with Networked Games. Respecto los precios… no son exageradamente caros. El Premium XNA Creators Club membership ronda los 99$ al año y el LIVE Silver membership no alcanza los 50$ al año. El Creators Club lo necesitaremos para desarrollar y publicar nuestro juego en XBOX Indie Games, y LIVE Silver Membership para desarrollar y testear nuestro juego multijugador.

Los jugadores que quieran jugar online ya disponen de un membership Silver o Gold, por lo que no tienen que pagar nada que no tengan ya -excepto el juego que tu les vendes 🙂 -.

 

Ejemplos de código

Podéis ejecutar el código de ejemplo disponible bajo windows y con el método de conexión System Link en vuestro PC corriendo bajo Windows. Los ejemplos de código que os recomiendo son los de XNA Creators Club Online.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *