diff --git a/osu.Game/Graphics/Containers/BeatSyncedContainer.cs b/osu.Game/Graphics/Containers/BeatSyncedContainer.cs new file mode 100644 index 0000000000..1438ccf002 --- /dev/null +++ b/osu.Game/Graphics/Containers/BeatSyncedContainer.cs @@ -0,0 +1,64 @@ +using osu.Framework.Allocation; +using osu.Framework.Configuration; +using osu.Framework.Graphics.Containers; +using osu.Game.Beatmaps; +using osu.Game.Beatmaps.Timing; + +namespace osu.Game.Graphics.Containers +{ + public class BeatSyncedContainer : Container + { + private Bindable beatmap; + private int beat; + private double timingPointStart; + //This is to avoid sending new beats when not at the very start of the beat + private const int seek_tolerance = 20; + private const double min_beat_length = 1E-100; + + public BeatSyncedContainer() + { + } + + protected override void Update() + { + if (beatmap.Value != null) + { + double currentTime = beatmap.Value.Track.CurrentTime; + ControlPoint kiaiControlPoint; + ControlPoint controlPoint = beatmap.Value.Beatmap.TimingInfo.TimingPointAt(currentTime, out kiaiControlPoint); + + if (controlPoint != null) + { + double oldTimingPointStart = timingPointStart; + double beatLenght = double.MinValue; + int oldBeat = beat; + bool kiai = false; + + beatLenght = controlPoint.BeatLength; + timingPointStart = controlPoint.Time; + kiai = kiaiControlPoint?.KiaiMode ?? false; + + beat = beatLenght > min_beat_length ? (int)((currentTime - timingPointStart) / beatLenght) : 0; + + //should we handle negative beats? (before the start of the controlPoint) + //The beats before the start of the first control point are off by 1, this should do the trick + if (currentTime <= timingPointStart) + beat--; + + if ((timingPointStart != oldTimingPointStart || beat != oldBeat) && (int)((currentTime - timingPointStart) % (beatLenght)) <= seek_tolerance) + OnNewBeat(beat, controlPoint.BeatLength, controlPoint.TimeSignature, kiai); + } + } + } + + protected virtual void OnNewBeat(int newBeat, double beatLength, TimeSignatures timeSignature, bool kiai) + { + } + + [BackgroundDependencyLoader] + private void load(OsuGameBase game) + { + beatmap = game.Beatmap; + } + } +} \ No newline at end of file diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj index 63acdb1914..18c483fe40 100644 --- a/osu.Game/osu.Game.csproj +++ b/osu.Game/osu.Game.csproj @@ -74,6 +74,7 @@ +