100 lines
2.5 KiB
C#
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;
|
|
}
|
|
}
|