gold_sprint_lpr/Assets/Scripts/GameScene/BikeManager.cs

138 lines
3.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 float MaxSpeed {get; set; }
private Queue<float> impulses = new Queue<float>();
private float lastTimeImp;
private float lastTimeDlt;
public float maxTimeDlt = 1.0f;
private float filteredSpeed;
private VideoManager vm;
// TODO: Refactor deps!
public Text tachometer;
public Text maxspeed;
// 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 () {
//Speed = getBikeSpeedLegacy(speedIntegrationTime);
Speed = getBikeSpeedApproxFiltered();
vm.speed = Speed / normalSpeed;
if (Speed > MaxSpeed) {
MaxSpeed = Speed;
}
tachometer.text = (Speed * 3.6f).ToString("#0.0") + "km/h";
maxspeed.text = "Max : " + (MaxSpeed * 3.6f).ToString("#0.0");
if (Input.GetButtonDown(inputID))
WheelTic();
}
void FixedUpdate() {
}
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 getBikeSpeedApproxFiltered(float max = 90 / 3.6f) {
float speed = getBikeSpeedApprox();
if (speed < max)
filteredSpeed = speed;
return filteredSpeed;
}
float getBikeSpeedApprox() {
float newTimeDlt = Time.time - lastTimeImp;
if (lastTimeDlt < 0.01)
return 0f;
if (newTimeDlt < lastTimeDlt)
return distancePerTick / lastTimeDlt;
if (newTimeDlt < maxTimeDlt)
return distancePerTick / newTimeDlt;
return 0f;
}
float getBikeSpeedLegacy(float timeWindow = .5f) {
int imp = getBikeImpulses(timeWindow);
return imp * distancePerTick / timeWindow;
}
void WheelTic() {
impulses.Enqueue(Time.time);
distanceRun += distancePerTick;
//Debug.Log(GetProgress());
lastTimeDlt = Time.time - lastTimeImp;
lastTimeImp = Time.time;
Debug.Log(lastTimeDlt);
}
public float GetProgress() {
return distanceRun / distanceToRun;
}
}