new file: .gitattributes new file: Charts/track.json new file: ProjectOnrinto.csproj new file: ProjectOnrinto.sln new file: Scenes/Audio/audio_stream_player.tscn new file: Scenes/Game/level.tscn new file: Scenes/Prefabs/beat.tscn new file: Scripts/Core/GameManager.cs new file: Scripts/Core/GameManager.cs.uid new file: Scripts/Core/MusicClock.cs new file: Scripts/Core/MusicClock.cs.uid new file: Scripts/Core/TrackGenerator.cs new file: Scripts/Core/TrackGenerator.cs.uid new file: Scripts/Data/ChartEvent.cs new file: Scripts/Data/ChartEvent.cs.uid new file: Scripts/Data/JsonConverter.cs new file: Scripts/Data/JsonConverter.cs.uid new file: Scripts/Data/TrackData.cs new file: Scripts/Data/TrackData.cs.uid new file: Scripts/GameObjects/NoteObject.cs new file: Scripts/GameObjects/NoteObject.cs.uid new file: icon.svg new file: icon.svg.import new file: project.godot
71 lines
2.2 KiB
C#
71 lines
2.2 KiB
C#
using Godot;
|
|
using Onrinto.Chart;
|
|
|
|
public partial class GameManager : Node3D
|
|
{
|
|
public TrackData CurrentTrack { get; private set; }
|
|
public static GameManager Instance { get; private set; }
|
|
|
|
public float CurrentAbsoluteSpeed { get; private set; }
|
|
public float CurrentAbsZ { get; private set; }
|
|
|
|
private int absoluteSpeedPointIndexArrow = 0;
|
|
|
|
private void UpdateAbsoluteState(double time)
|
|
{
|
|
var points = CurrentTrack.AbsoluteSpeedPoints;
|
|
if(points == null || points.Count == 0) return;
|
|
|
|
double firstPointTime = CurrentTrack.TickToSeconds(points[0].Tick);
|
|
if(time < firstPointTime)
|
|
{
|
|
CurrentAbsoluteSpeed = points[0].Speed;
|
|
return;
|
|
}
|
|
|
|
for(int i = absoluteSpeedPointIndexArrow; i < points.Count - 1; i++)
|
|
{
|
|
double pointTime_from = CurrentTrack.TickToSeconds(points[i].Tick);
|
|
double pointTime_to = CurrentTrack.TickToSeconds(points[i + 1].Tick);
|
|
|
|
if(time >= pointTime_from && time < pointTime_to)
|
|
{
|
|
absoluteSpeedPointIndexArrow = i;
|
|
|
|
if(points[i].IsLinear)
|
|
{
|
|
double t = (time - pointTime_from) / (pointTime_to - pointTime_from);
|
|
CurrentAbsoluteSpeed = Mathf.Lerp(points[i].Speed, points[i + 1].Speed, (float)t);
|
|
}
|
|
else
|
|
{
|
|
CurrentAbsoluteSpeed = points[i].Speed;
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
absoluteSpeedPointIndexArrow = points.Count - 1;
|
|
CurrentAbsoluteSpeed = points[^1].Speed;
|
|
}
|
|
|
|
// Called when the node enters the scene tree for the first time.
|
|
public override void _Ready()
|
|
{
|
|
if (Instance != null){ QueueFree(); return; }
|
|
Instance = this;
|
|
|
|
ProcessPriority = -100;
|
|
}
|
|
|
|
// Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
public override void _Process(double delta)
|
|
{
|
|
double tNow = MusicClock.Instance.CurrentTime;
|
|
|
|
if(CurrentTrack == null) return;
|
|
|
|
UpdateAbsoluteState(tNow);
|
|
CurrentAbsZ = CurrentTrack.GetZ(tNow, CurrentTrack.RelativeSpeedPoints, CurrentTrack.RelativeZTable);
|
|
}
|
|
} |