/// <summary> /// Quitar otro cliente que desconecto /// </summary> private void clienteAtenderOtroClienteDesconectado(TgcSocketRecvMsg msg) { var playerId = (int)msg.readNext(); otrosMeshes[playerId].dispose(); otrosMeshes.Remove(playerId); }
/// <summary> /// Crear Mesh para el nuevo cliente conectado /// </summary> private void clienteAtenderOtroClienteConectado(TgcSocketRecvMsg msg) { //Recibir data var vehiculoData = (VehiculoData)msg.readNext(); crearMeshOtroCliente(vehiculoData); }
/// <summary> /// Atender mensaje InformacionInicial /// </summary> private void clienteAtenderInformacionInicial(TgcSocketRecvMsg msg) { //Recibir data var vehiculoData = (VehiculoData)msg.readNext(); //Cargar mesh var loader = new TgcSceneLoader(); var scene = loader.loadSceneFromFile(vehiculoData.meshPath); meshPrincipal = scene.Meshes[0]; //Ubicarlo en escenario meshPrincipal.Position = vehiculoData.initialPos; //Camara this.camara.resetValues(); this.camara.setCamera(meshPrincipal.Position, 100, 400); //Ver si ya habia mas clientes para cuando nosotros nos conectamos var otrosVehiculosCant = (int)msg.readNext(); for (var i = 0; i < otrosVehiculosCant; i++) { var vData = (VehiculoData)msg.readNext(); crearMeshOtroCliente(vData); } }
/// <summary> /// Actualizar lógica del server /// </summary> private void updateServer() { //Iterar sobre todos los nuevos clientes que se conectaron for (int i = 0; i < networkingMod.NewClientsCount; i++) { //Al llamar a nextNewClient() consumimos el aviso de conexion de un nuevo cliente TgcSocketClientInfo clientInfo = networkingMod.nextNewClient(); atenderNuevoCliente(clientInfo); } //Iterar sobre todos los nuevos clientes que se desconectaron for (int i = 0; i < networkingMod.DisconnectedClientsCount; i++) { //Al llamar a nextNewClient() consumimos el aviso de desconexión de un nuevo cliente TgcSocketClientInfo clientInfo = networkingMod.nextDisconnectedClient(); atenderClienteDesconectado(clientInfo); } //Atender mensajes recibidos for (int i = 0; i < networkingMod.Server.ReceivedMessagesCount; i++) { //El primer mensaje es el header de nuestro protocolo del ejemplo TgcSocketClientRecvMesg clientMsg = networkingMod.Server.nextReceivedMessage(); TgcSocketRecvMsg msg = clientMsg.Msg; MyClientProtocol msgType = (MyClientProtocol)msg.readNext(); switch (msgType) { case MyClientProtocol.PosicionActualizada: serverAtenderPosicionActualizada(clientMsg); break; } } }
/// <summary> /// Actualizar posicion de otro cliente /// </summary> private void clienteAtenderActualizarUbicaciones(TgcSocketRecvMsg msg) { var playerId = (int)msg.readNext(); var nextPos = (Matrix)msg.readNext(); if (otrosMeshes.ContainsKey(playerId)) { otrosMeshes[playerId].Transform = nextPos; } }
/// <summary> /// Actualizar lógicad el cliente /// </summary> private void updateClient() { //Analizar los mensajes recibidos for (int i = 0; i < networkingMod.Client.ReceivedMessagesCount; i++) { //El primer mensaje es el header de nuestro protocolo del ejemplo TgcSocketRecvMsg msg = networkingMod.Client.nextReceivedMessage(); MyServerProtocol msgType = (MyServerProtocol)msg.readNext(); //Ver que tipo de mensaje es switch (msgType) { case MyServerProtocol.InformacionInicial: clienteAtenderInformacionInicial(msg); break; case MyServerProtocol.OtroClienteConectado: clienteAtenderOtroClienteConectado(msg); break; case MyServerProtocol.ActualizarUbicaciones: clienteAtenderActualizarUbicaciones(msg); break; case MyServerProtocol.OtroClienteDesconectado: clienteAtenderOtroClienteDesconectado(msg); break; } } if (meshPrincipal != null) { //Renderizar todo renderClient(); //Enviar al server mensaje con posicion actualizada, 10 paquetes por segundo acumulatedTime += GuiController.Instance.ElapsedTime; if (acumulatedTime > 0.1) { acumulatedTime = 0; //Enviar posicion al server TgcSocketSendMsg msg = new TgcSocketSendMsg(); msg.write(MyClientProtocol.PosicionActualizada); msg.write(meshPrincipal.Transform); networkingMod.Client.send(msg); } } }