presentacion1630

32
Crear el juego multi jugador Bladimir Díaz Campos

Upload: titiushko-jazz

Post on 09-Aug-2015

37 views

Category:

Documents


0 download

TRANSCRIPT

  1. 1. Bladimir Daz Campos
  2. 2. Agenda Ahora conocemos que un sistema ejecutando XNA puede tener un host con un lobby que espera por usuarios a unirse. Adems conocemos el rol de la clase NetworkSession en la configuracin del juego en red. Ahora vamos a ver como los sistemas son organizados para el juego en red. Luego averiguaremos como el juego pasa los datos entre los sistemas
  3. 3. La historia hasta ahora En la ltima sesin vimos como usar una maquina de estado y XNA permite una maquina host en un juego para buscar juegos y jugar. Al final de la ltima sesin teniamos conectados 2 sistemas Un sistema este en el estado playingAsPlayer y el otro en el estado PlayingAsHost. Ambos juegos tienen una instancia NetworkSession llamada session la cual representa la conexin entre los dos juegos
  4. 4. El objeto NetworkSession El objeto NetworkSession actua como la conexin entre el juego y la red. Los juegos XNA interactan con su sesin enviado datos dentro de la red y recibir mensajes. Lo que necesitamos saber es como usar este objeto para que el juego trabaje. session network session
  5. 5. El juego
  6. 6. Los objetos en el juego Existen 3 objetos en el juego. Jugador 1: Bread Jugador 2: Bread Cheese. Todo lo que el sistema necesita conocer es la posicin de cada uno de esos objetos. Estos sern pasados a travs de la red
  7. 7. Topologa de juego Una topologa en este contexto significa una manera de organizacin del sistema. Cuando consideramos como sistema un juego, debemos comunicar. Hay un nmero diferente de maneras de organizacin, cada una con sus ventajas y desventajas. Necesitamos considerar esto en el caso que decidamos expandir nuestro juego para que sean 8 jugdores
  8. 8. Topologa P2P Una manera de organizar el sistema en una red, puede ser donde cada sistema enva su informacin a cada uno de los otros. Este puede resultar en bastante trafico en la red entre los sitemas
  9. 9. Topologa Cliente Servidor Una mejor manera de organizar la red es tener un sistema que actu como servidor y todos los dems le envan la informacin. Luego ellos reciben toda la informacin desde el servidor. As es como el Xbox Live trabaja
  10. 10. El servidor y el mundo del juego Si se piensa en como un juego trabajar, hace buen sentido organizarla en esta manera. El sistema servidor puede manejar el mundo del juego y enviar a cada cliente alguna informacin que permita al cliente presentar el mundo para jugarlo. A menudo se da el caso de que el host que propone el juego termina siendo el servidor de juegos. Todo esto se oculta al jugar el juego.
  11. 11. El cliente y el servidor en el juego En el juego el servidor mover la bola y detectar el puntaje. El jugador en el servidor controlar la bat derecho. El servidor necesita enviar el cliente. La posicin del bat izquierdo La posicin del cheese. La cadena de texto del puntaje a mostrar. Si tenemos ms jugadores, se deben enviar tambin a ellos esta informacin
  12. 12. La clase XNA PacketWriter XNA provee una clase llamado PacketWriter que ensamblar datos en un paquete que pueden ser enviados a otros sistemas en la red. Se tiene dentro de ella el mtodo Write que nos da cada tem a ser enviado writer = new PacketWriter(); writer.Write('H'); writer.Write(Cheese.XPos); writer.Write(Cheese.YPos); writer.Write(Player1.XPos); writer.Write(Player1.YPos); writer.Write(displayMessage);
  13. 13. Enviar los paquetes Los jugadores locales en un sistema puede enviar datos. El objeto session almacena la lista de los jugadores locales. Obtenemos el elemento al inicio de la lista y llamamos el mtodo SendData para enviar los datos empaquetados a todos los sistemas en el juego. Esto es dicho por el valor PacketWriter junto a las opciones de envio
  14. 14. SendDataOptions Existe un nmero de opciones diferentes para enviar datos. Chat: el mensaje es parte de un chat entre los jugadores InOrder: No se garantiza la entrega, pero el mensaje es recibido en el mismo orden que fue enviado. None: No garantiza que el mensaje llegue a su direccin o que llegue en el orden establecido. ReliableInOrder: Los mensajes se garantizan llegar en el orden que fueron hechos.
  15. 15. Uso de las opciones de ReliableInOrder En nuestra versin de juego, usaremos la opcin RealiableInOrder. Por que nuestro sistema esta en una LAN usando un SystemLink, no hay mucho trafico. Si vamos a crear un juego para una gran red, se debe usar otro tipo de mensaje
  16. 16. Envo de pequeos datos de paquetes Para minimizar el tamao de datos que son transferidos, se deben enviar solo los tems que son ms importantes para jugar. En el caso del juego en red Starlight, se debe enviar las posiciones de las estrellas de fondo. Cada sistema puede dibujar su propia versin de ellas.
  17. 17. Recepcin de los datos El jugador del juego debe enviar la posicin del bat derecho. Esto es usado por el host para implementar el juego. El tipo LocalNetworkGamer provee una propiedad llamada DataAviable que el juego puede ocupar para probar si algn dato a llegado de la red. Si tenemos algn dato, podemos usar PAcketReader para obtener los valores del paquete
  18. 18. Recepcin de los datos Los mensajes del jugador inician con la letra P y contienen las 2 coordenadas de posicin while (localHost.IsDataAvailable) { NetworkGamer sender; localHost.ReceiveData(reader, out sender); char messageType = reader.ReadChar(); if (messageType == 'P') { Player2Bat.XPos = reader.ReadSingle(); Player2Bat.YPos = reader.ReadSingle(); } }
  19. 19. El mtodo ReceiveData El mtodo ReceiveData tiene dos parmetros Una referencia hacia el lector que es llenado con los datos que han sido ledos. Una referencia a una variable llamada sender, que ser la referencia al jugador que enva el mensaje Por que el mtodo ReceiveData quiere cambiar el valor de sender, se ha convertido en un parmetro out
  20. 20. El parmetro out Se ha visto que los parmetros son pasados normalmente a los mtodos por valor. Sin embargo, se ha usado la palabra reservada ref para decir que una referencia para pasar al mtodo una variable y que esta se pueda modificar. La palabra out hace algo similar, pero solamente permite que el mtodo ReceiveData escriba los valores. El objetivo es mejorar la confiabilidad haciendo mas difcil caer en errores localHost.ReceiveData(reader, out sender);
  21. 21. El comportamiento de Update El comportamiento de la actualizacin del jugador es muy similar al del host, pero reservado. Este enva la posicin del bat del jugador 2 Recibe la posicin del jugador 1, el cheese y el mensaje actual del escore para actualizar la pantalla. Si fueran ms jugadores, esto deber trabajar en la misma manera
  22. 22. Enviando la posicin del jugador Este cdigo crea y enva un paquete que contiene la posicin del bat del jugador. Es mensaje es prefijado con la letra P, para que el host conozca que esta recibiendo la informacin del jugador. writer.Write('P'); writer.Write(Player2.XPos); writer.Write(Player2.YPos); LocalNetworkGamer localPlayer = session.LocalGamers[0]; localPlayer.SendData(writer, SendDataOptions.ReliableInOrder);
  23. 23. Enviar la posicin del jugador Este cdigo lee todos los datos enviados al host while (localPlayer.IsDataAvailable) { NetworkGamer sender; localPlayer.ReceiveData(reader, out sender); char messageType = reader.ReadChar(); if (messageType == 'H') { Cheese.XPos = reader.ReadSingle(); Cheese.YPos = reader.ReadSingle(); Player1.XPos = reader.ReadSingle(); Player1.YPos = reader.ReadSingle(); displayMessage = reader.ReadString(); } }
  24. 24. El mtodo session update Al final de la actualizacin del comportamiento del host o del jugador, se debe llamar al mtodo Update en la sesin de red. Esto mantiene a la red en funcionamiento y permite procesar los mensajes entrantes y entregar cualquiera que deba ser entregado. Esto hace que la depuracin de los juegos en red sea complicada, es como un breakpoint que detiene la ejecucin. session.Update();
  25. 25. Mejorando el protocolo Hasta el momento, los mensajes son enviados usando una versin de SendData que transmite el mensaje a todos los sistemas que el juego tiene. Es posible usar una versin diferente de la llamada que dirige el mensaje solamente a uno. Es posible tambin usar la informacin el emisario del mensaje para determinar de donde viene. Esto permite la creacin de mensajes mas avanzados que permitan usar menos ancho de banda.
  26. 26. Demo Si se usa GamerServicesComponent podemos usar la tecla Home para abrir la gua
  27. 27. Resumen Una vez los sistemas han establecido una sesin de red XNA, se puede usar para comunicarse. Las clases PacketReader y PacketWriter proveen los medios de ensamblar mensajes que son enviados de un juego a otro. Es posible orientar un mensaje a un jugador en particular, o enviar un mensaje que es recibido por todos los jugadores en el juego. Un juego debe llamar al mtodo Update en una sesin de red para mantener la sesin activa
  28. 28. Verdadero o Falso Una instancia de NetworkSession provee un enlace entre un juego XNA y una red. Es imposible enviar un mensaje a mas de un sistema a la vez. Es posible enviar solamente valores de punto flotante a otros sistemas XNA El PacketWriter es utilizado para decodificar paquetes que han sido escritos
  29. 29. Verdadero o Falso Una instancia de NetworkSession provee un enlace entre un juego XNA y una red. Es imposible enviar un mensaje a mas de un sistema a la vez. Es posible enviar solamente valores de punto flotante a otros sistemas XNA El PacketWriter es utilizado para decodificar paquetes que han sido escritos
  30. 30. Verdadero o Falso Una instancia de NetworkSession provee un enlace entre un juego XNA y una red. Es imposible enviar un mensaje a mas de un sistema a la vez. Es posible enviar solamente valores de punto flotante a otros sistemas XNA El PacketWriter es utilizado para decodificar paquetes que han sido escritos
  31. 31. Verdadero o Falso Una instancia de NetworkSession provee un enlace entre un juego XNA y una red. Es imposible enviar un mensaje a mas de un sistema a la vez. Es posible enviar solamente valores de punto flotante a otros sistemas XNA El PacketWriter es utilizado para decodificar paquetes que han sido escritos
  32. 32. Verdadero o Falso Una instancia de NetworkSession provee un enlace entre un juego XNA y una red. Es imposible enviar un mensaje a mas de un sistema a la vez. Es posible enviar solamente valores de punto flotante a otros sistemas XNA El PacketWriter es utilizado para decodificar paquetes que han sido escritos