new file: .editorconfig

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
This commit is contained in:
2026-04-05 00:07:28 +08:00
commit 0e6bf1dcad
25 changed files with 634 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
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);
}
}