gold_sprint_lpr/Assets/Scripts/GameScene/BikeManager.cs
2018-03-10 18:20:58 +01:00

100 lines
2.5 KiB
C#

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<float> impulses = new Queue<float>();
private VideoManager vm;
// TODO: Refactor deps!
public Text tachometer;
// Use this for initialization
void Start () {
vm = gameObject.GetComponent<VideoManager>();
// 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;
}
}