diff --git a/Assets/Scripts/LevelEditor/BPMText.cs b/Assets/Scripts/LevelEditor/BPMText.cs index d5b6f8df1..26cfcc4dc 100644 --- a/Assets/Scripts/LevelEditor/BPMText.cs +++ b/Assets/Scripts/LevelEditor/BPMText.cs @@ -1,9 +1,10 @@ +using System; using System.Collections.Generic; using UnityEngine; using TMPro; using System.Linq; -namespace HeavenStudio.Editor +namespace HeavenStudio.Editor { public class BPMText : MonoBehaviour { @@ -12,9 +13,9 @@ namespace HeavenStudio.Editor [SerializeField] private TMP_Text BPM; [SerializeField] private TMP_Text BPMRounded; - private List pressTimes = new List(); + private List pressTimes = new(); - public void ChangeText(float timePressed) + public void ChangeText(double timePressed) { pressTimes.Add(timePressed); @@ -25,12 +26,13 @@ namespace HeavenStudio.Editor if (pressTimes.Count > maxPressTimes) pressTimes.RemoveAt(0); - var averageTime = pressTimes.GetRange(1, pressTimes.Count - 1).Average(); + double averageTime = pressTimes.GetRange(1, pressTimes.Count - 1).Average(); - float thisBPM = 60 / averageTime; // BPM = 60/t - BPM.text = $"{thisBPM}"; - BPMRounded.text = $"{Mathf.RoundToInt(thisBPM)}"; + double thisBPM = 60 / averageTime; + BPM.text = $"{thisBPM:0.000}"; + BPMRounded.text = $"{(int)Math.Round(thisBPM)}"; } + public void ResetText() { pressTimes.Clear(); @@ -38,5 +40,21 @@ namespace HeavenStudio.Editor BPM.text = "---"; BPMRounded.text = "---"; } + + public void ClearSamples() + { + if (pressTimes.Count < 2) return; + + if (pressTimes.Count > maxPressTimes) + pressTimes.RemoveAt(0); + + double averageTime = pressTimes.GetRange(1, pressTimes.Count - 1).Average(); + + double thisBPM = 60 / averageTime; + BPM.text = $"{thisBPM:0.000}"; + BPMRounded.text = $"{(int)Math.Round(thisBPM)}"; + + pressTimes.Clear(); + } } } diff --git a/Assets/Scripts/LevelEditor/TempoFinder/TempoFinder.cs b/Assets/Scripts/LevelEditor/TempoFinder/TempoFinder.cs index efefdbfe7..26da99759 100644 --- a/Assets/Scripts/LevelEditor/TempoFinder/TempoFinder.cs +++ b/Assets/Scripts/LevelEditor/TempoFinder/TempoFinder.cs @@ -2,41 +2,76 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; -namespace HeavenStudio.Editor +namespace HeavenStudio.Editor { public class TempoFinder : Dialog { - private bool pressed; - private float timePressed; [SerializeField] private BPMText bpmText; - private void Awake() + private bool pressed; + private double timePressed; + private double lastTimePressed = double.MinValue; + + private void Awake() { pressed = false; timePressed = 0f; + lastTimePressed = double.MinValue; } + public void SwitchTempoDialog() { - if(dialog.activeSelf) { + if (dialog.activeSelf) + { dialog.SetActive(false); timePressed = 0; + lastTimePressed = double.MinValue; bpmText.ResetText(); - } else { + } + else + { ResetAllDialogs(); dialog.SetActive(true); } } + public void TapBPM() { pressed = true; } + private void Update() { + bool conductorTimeSource = Conductor.instance != null && Conductor.instance.NotStopped(); timePressed += Time.deltaTime; - if(pressed) + if (timePressed > 2) { - pressed = false; - bpmText.ChangeText(timePressed); timePressed = 0; + lastTimePressed = double.MinValue; + bpmText.ClearSamples(); + pressed = false; + } + + if (pressed) + { + if (!conductorTimeSource) + { + bpmText.ChangeText(timePressed); + lastTimePressed = double.MinValue; + } + else + { + if (lastTimePressed == double.MinValue) + { + bpmText.ChangeText(timePressed); + } + else + { + bpmText.ChangeText(Conductor.instance.songPositionAsDouble - lastTimePressed); + } + lastTimePressed = Conductor.instance.songPositionAsDouble; + } + timePressed = 0; + pressed = false; } } }