void Update() { // Check for mode update if (GameManager.instance.client.pb.state != oldState) { oldState = GameManager.instance.client.pb.state; if (oldState == Protobowl.GameState.RUNNING) { SetMode(Mode.RUNNING); } else if (oldState == Protobowl.GameState.BUZZED) { SetMode(Mode.BUZZED); } else if (oldState == Protobowl.GameState.PAUSED) { SetMode(Mode.PAUSED); } else if (oldState == Protobowl.GameState.PROMPTED) { SetMode(Mode.PROMPTED); } else if (oldState == Protobowl.GameState.IDLE) { SetMode(Mode.IDLE); } } // Update bar if (isMoving) { currTime = Mathf.Clamp(currTime + Time.deltaTime, 0, targetTime); } if (targetTime != 0) { movingBar.transform.GetComponent <RectTransform> ().localScale = new Vector3(initScale * currTime / targetTime, initScale, initScale); } }
/// <summary> /// Update display and state /// </summary> public IEnumerator UpdateDisp() { while (true) { if (!pb.isConnected()) { continue; } // detect change in state if (oldState != pb.state) { oldState = pb.state; if (oldState == Protobowl.GameState.RUNNING) { localTime = pb.data ["real_time"].AsLong; } } // detect new question if (pb.state == Protobowl.GameState.NEW_Q) { hasAddAnswer = false; pb.state = Protobowl.GameState.RUNNING; InitDisp(); } // run client-side display if (pb.state == Protobowl.GameState.RUNNING) { pb.hasBuzz = false; List <int> timing = Utils.ConvertJSONToList(pb.data ["timing"].AsArray); if (localIndex < timing.Count) { var qList = pb.data ["question"].ToString().Split(' '); disp = string.Join(" ", qList.Take(localIndex + 1).ToArray()); var currentInterval = Mathf.Round(timing [localIndex] * pb.data ["rate"]); yield return(new WaitForSeconds(currentInterval / 1000)); localTime += (long)currentInterval; localIndex++; } else { var timePassed = (localTime - pb.data ["time_offset"].AsLong - pb.data ["begin_time"].AsLong) / 1000f; var currentInterval = 100; if (timePassed < GetTotalTime()) { localTime += currentInterval; yield return(new WaitForSeconds(currentInterval / 1000f)); } else { pb.state = Protobowl.GameState.IDLE; } } } else { yield return(new WaitForSeconds(0.1f)); } // auto-fill when question ends if (pb.state == Protobowl.GameState.IDLE) { disp = pb.data ["question"]; // add answer to log if (!hasAddAnswer) { pb.answerStack.Push(pb.GetAnswer()); hasAddAnswer = true; } } // ping server pb.Ping(); } }