diff --git a/Assets/Scripts/Games/BouncyRoad/BouncyRoad.cs b/Assets/Scripts/Games/BouncyRoad/BouncyRoad.cs index 0170a5324..c273da5ea 100644 --- a/Assets/Scripts/Games/BouncyRoad/BouncyRoad.cs +++ b/Assets/Scripts/Games/BouncyRoad/BouncyRoad.cs @@ -22,7 +22,6 @@ namespace HeavenStudio.Games.Loaders { new GameAction("ball", "Ball") { - function = delegate { var e = eventCaller.currentEntity; BouncyRoad.instance.SpawnBall(e.beat, e.length, e["goal"], e["color"]); }, defaultLength = 1f, resizable = true, parameters = new List() @@ -57,6 +56,17 @@ namespace HeavenStudio.Games [SerializeField] float fallY; + const double BALL_SEEK_TIME = 1.0; + private struct ScheduledBall + { + public double beat; + public double length; + public bool goal; + public Color color; + } + List scheduledBalls = new(); + int ballIndex; + public static BouncyRoad instance; const int IALeft = 0; @@ -143,6 +153,35 @@ namespace HeavenStudio.Games CurveCache.Add(1, newCurves); } + public override void OnGameSwitch(double beat) + { + double gameStartBeat = beat, gameEndBeat = double.MaxValue; + var firstEnd = EventCaller.GetAllInGameManagerList("gameManager", new string[] { "switchGame", "end" }).Find(x => x.beat > gameStartBeat); + gameEndBeat = firstEnd?.beat ?? gameEndBeat; + + + scheduledBalls.Clear(); + ballIndex = 0; + var events = EventCaller.GetAllInGameManagerList("bouncyRoad", new string[] { "ball" }).FindAll(x => x.beat >= gameStartBeat && x.beat < gameEndBeat); + foreach (var e in events) + { + if (e.length == 0) continue; + var ball = new ScheduledBall + { + beat = e.beat, + length = e.length, + goal = e["goal"], + color = e["color"], + }; + scheduledBalls.Add(ball); + } + scheduledBalls.Sort((x, y) => x.beat.CompareTo(y.beat)); + } + public override void OnPlay(double beat) + { + OnGameSwitch(beat); + } + void Update() { var cond = Conductor.instance; @@ -156,6 +195,26 @@ namespace HeavenStudio.Games { ThingsAnim[13].Play("podium", 0, 0); } + + UpdateBalls(); + } + + void UpdateBalls() + { + double beat = conductor.songPositionInBeatsAsDouble; + while(ballIndex < scheduledBalls.Count) + { + var ball = scheduledBalls[ballIndex]; + if (ball.beat - ball.length < beat + BALL_SEEK_TIME) + { + SpawnBall(ball.beat, ball.length, ball.goal, ball.color); + ballIndex++; + } + else + { + break; + } + } } public void SpawnBall(double beat, double length, bool goal, Color color)