using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class BikeManager : MonoBehaviour { [SerializeField] public int playerID; // {get; set; } // metric system ftw [SerializeField] private float distanceToRun = 100f; // {get; set; } [SerializeField] private float wheelDiameter = .559f; // {get; set; } [SerializeField] private int ticPerTurn = 4; [SerializeField] private float speedIntegrationTime = .5f; private string inputID; private float distancePerTick; private float distanceRun; private float normalSpeed; private float Speed {get; set; } private Queue impulses = new Queue(); private VideoManager vm; // TODO: Refactor deps! public Text tachometer; // Use this for initialization void Start () { vm = gameObject.GetComponent(); // TODO: Refactor w a player manager ? switch (playerID) { case 0: inputID = "WheelP1"; break; case 1: inputID = "WheelP2"; break; } distancePerTick = wheelDiameter * Mathf.PI / ticPerTurn; Debug.Log("Distance to run:" + distanceToRun); Debug.Log("Distance per tick:" + distancePerTick); normalSpeed = distanceToRun / vm.raceFinishTime; } // Update is called once per frame void Update () { if (Input.GetButtonDown(inputID)) { WheelTic(); } Speed = getBikeSpeed(speedIntegrationTime); Debug.Log(Speed); vm.speed = Speed / normalSpeed; tachometer.text = (Speed * 3.6f).ToString() + "km/h"; } int getBikeImpulses(float timeWindow = .5f) { if (impulses.Count == 0) { return 0; } float time = Time.time; float delta = time - impulses.Peek(); while (delta > timeWindow) { impulses.Dequeue(); if (impulses.Count == 0) { break; } delta = time - impulses.Peek(); } return impulses.Count; } float getBikeSpeed(float timeWindow = .5f) { int imp = getBikeImpulses(timeWindow); return imp * distancePerTick / timeWindow; } void WheelTic() { impulses.Enqueue(Time.time); distanceRun += distancePerTick; //Debug.Log(GetProgress()); } public float GetProgress() { return distanceRun / distanceToRun; } }