//-------------------------------------------------------------> /// <summary> /// Registrar o agregar un nuevo tick con informacion de input /// controlando un tamanno maximo para la cola /// </summary> /// <param name="inputTick"></param> public void AddInputTick(InputTick inputTick) { //Controlar tamanno maximo de la cola if (tickQueue.Count > limitTickQueueSize) { tickQueue.Dequeue(); } tickQueue.Enqueue(inputTick); }
//-------------------------------------------------------------> /// <summary> /// Registrar o agregar un nuevo tick con informacion de input /// para el cliente controlando un tamanno maximo para la cola /// </summary> /// <param name="inputTick"></param> public void AddInputTick(InputTick inputTick) { if (tickQueue.Count > limitTickQueueSize) { tickQueue.Dequeue(); } tickQueue.Enqueue(inputTick); lastTickQueue = inputTick.tick; }
//-------------------------------------------------------------> /// <summary> /// Actualizacion cada fotograma /// </summary> private void Update() { List <Client> clientList = serverMain.GetClientList(); //Ejecucion cada tick (tickrate) timer += Time.deltaTime; while (timer >= Time.fixedDeltaTime) { timer -= Time.fixedDeltaTime; for (int i = 0; i < clientList.Count; i++) { if (clientList[i].GetGameObject() != null) { EnumDisplacement displacement; bool jump; //Obtener nuevo tick con input del cliente if (clientList[i].GetTickQueue().Count > 0) { InputTick inputTick = clientList[i].GetTickQueue().Dequeue(); clientList[i].SetLastTickExecuted(inputTick); displacement = inputTick.displacement; jump = inputTick.jump; //Si no hay un input almacenado en la cola, repetimos ultima entrada (estimacion) } else { jump = clientList[i].GetLastTickExecuted().jump; displacement = clientList[i].GetLastTickExecuted().displacement; } //Establecer velocidades Rigidbody2D rb = clientList[i].GetGameObject().GetComponent <Rigidbody2D>(); switch (displacement) { case EnumDisplacement.Left: rb.velocity = new Vector2(-3f, rb.velocity.y); break; case EnumDisplacement.Right: rb.velocity = new Vector2(3f, rb.velocity.y); break; case EnumDisplacement.None: rb.velocity = new Vector2(0, rb.velocity.y); break; } if (jump) { rb.velocity = new Vector2(rb.velocity.x, 5f); } } } //Ejecutar la fisica para todos los clientes Physics2D.Simulate(Time.fixedDeltaTime); //Enviar el estado de los jugadores a los clientes SendStatus(clientList); } }
public void SetLastTickExecuted(InputTick lastTickExecuted) { this.lastTickExecuted = lastTickExecuted; }