add bgm playback, scrolling based on bgm time

This commit is contained in:
msk
2023-09-29 16:16:44 -07:00
parent 02b7f023fd
commit 2a6e64dbfd
6 changed files with 131 additions and 44 deletions
+53 -41
View File
@@ -1,8 +1,10 @@
[gd_scene load_steps=16 format=3 uid="uid://bqh00ot0csqmk"] [gd_scene load_steps=18 format=3 uid="uid://bqh00ot0csqmk"]
[ext_resource type="Script" path="res://Scripts/Scenes/Play.cs" id="1_d6iv3"] [ext_resource type="Script" path="res://Scripts/Scenes/Play/Play.cs" id="1_asytu"]
[ext_resource type="PackedScene" uid="uid://cyetvgmwnoy8l" path="res://Things/Background.tscn" id="2_8g6gv"] [ext_resource type="PackedScene" uid="uid://cyetvgmwnoy8l" path="res://Things/Background.tscn" id="2_8g6gv"]
[ext_resource type="Shader" path="res://Shaders/Cutout2D.gdshader" id="3_rjbyl"] [ext_resource type="Shader" path="res://Shaders/Cutout2D.gdshader" id="3_rjbyl"]
[ext_resource type="Script" path="res://Scripts/Scenes/Play/Audio/BGM.cs" id="4_c2dke"]
[ext_resource type="Script" path="res://Scripts/Scenes/Play/Audio/SFX.cs" id="5_owrd5"]
[sub_resource type="Environment" id="Environment_nefjb"] [sub_resource type="Environment" id="Environment_nefjb"]
ambient_light_source = 1 ambient_light_source = 1
@@ -47,7 +49,7 @@ blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_40gjx") shadow_mesh = SubResource("ArrayMesh_40gjx")
[sub_resource type="ViewportTexture" id="ViewportTexture_ln6xl"] [sub_resource type="ViewportTexture" id="ViewportTexture_ln6xl"]
viewport_path = NodePath("ViewportView/2D Viewport") viewport_path = NodePath("2D Viewport")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3rv8i"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3rv8i"]
resource_local_to_scene = true resource_local_to_scene = true
@@ -59,7 +61,7 @@ uv1_scale = Vector3(-1, 1, 1)
[sub_resource type="ViewportTexture" id="ViewportTexture_w20vk"] [sub_resource type="ViewportTexture" id="ViewportTexture_w20vk"]
viewport_path = NodePath("Mask") viewport_path = NodePath("Mask")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_lf1uh"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_bs53h"]
resource_local_to_scene = true resource_local_to_scene = true
shader = ExtResource("3_rjbyl") shader = ExtResource("3_rjbyl")
shader_parameter/mask = SubResource("ViewportTexture_w20vk") shader_parameter/mask = SubResource("ViewportTexture_w20vk")
@@ -78,14 +80,16 @@ width = 1920
[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_27qpl"] [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_27qpl"]
blend_mode = 1 blend_mode = 1
[node name="Play" type="Node" node_paths=PackedStringArray("noteDisplay", "scrollDisplay", "background", "mainViewport", "leftViewport", "rightViewport")] [node name="Play" type="Node" node_paths=PackedStringArray("bgmController", "sfxController", "noteDisplay", "scrollDisplay", "background", "mainViewport", "leftViewport", "rightViewport")]
script = ExtResource("1_d6iv3") script = ExtResource("1_asytu")
noteDisplay = NodePath("ViewportView/2D Viewport/Viewport Control/Notes Scroll") bgmController = NodePath("AudioStreamPlayer BGM")
scrollDisplay = NodePath("ViewportView/2D Viewport/Viewport Control/Holds ViewportView/Holds Viewport/Holds Scroll") sfxController = NodePath("AudioStreamPlayer SFX")
background = NodePath("ViewportView/2D Viewport/Viewport Control/Background") noteDisplay = NodePath("2D Viewport/Viewport Control/Notes Scroll")
mainViewport = NodePath("ViewportView/2D Viewport") scrollDisplay = NodePath("2D Viewport/Viewport Control/Holds ViewportView/Holds Viewport/Holds Scroll")
leftViewport = NodePath("ViewportView/2D Viewport/Viewport Control/ViewportView Left/Viewport Left") background = NodePath("2D Viewport/Viewport Control/Background")
rightViewport = NodePath("ViewportView/2D Viewport/Viewport Control/ViewportView Right/Viewport Right") mainViewport = NodePath("2D Viewport")
leftViewport = NodePath("2D Viewport/Viewport Control/ViewportView Left/Viewport Left")
rightViewport = NodePath("2D Viewport/Viewport Control/ViewportView Right/Viewport Right")
[node name="WorldEnvironment" type="WorldEnvironment" parent="."] [node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_nefjb") environment = SubResource("Environment_nefjb")
@@ -112,20 +116,7 @@ mesh = SubResource("ArrayMesh_qc82q")
skeleton = NodePath("") skeleton = NodePath("")
surface_material_override/0 = SubResource("StandardMaterial3D_3rv8i") surface_material_override/0 = SubResource("StandardMaterial3D_3rv8i")
[node name="ViewportView" type="SubViewportContainer" parent="."] [node name="2D Viewport" type="SubViewport" parent="."]
modulate = Color(1, 1, 1, 0.329412)
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -960.0
offset_top = -1920.0
offset_right = 960.0
grow_horizontal = 2
grow_vertical = 0
[node name="2D Viewport" type="SubViewport" parent="ViewportView"]
disable_3d = true disable_3d = true
own_world_3d = true own_world_3d = true
transparent_bg = true transparent_bg = true
@@ -134,7 +125,7 @@ msaa_2d = 1
size = Vector2i(1920, 1920) size = Vector2i(1920, 1920)
render_target_update_mode = 4 render_target_update_mode = 4
[node name="Viewport Control" type="Control" parent="ViewportView/2D Viewport"] [node name="Viewport Control" type="Control" parent="2D Viewport"]
layout_mode = 3 layout_mode = 3
anchors_preset = 15 anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0
@@ -142,31 +133,31 @@ anchor_bottom = 1.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
[node name="Camera2D Main" type="Camera2D" parent="ViewportView/2D Viewport/Viewport Control"] [node name="Camera2D Main" type="Camera2D" parent="2D Viewport/Viewport Control"]
position = Vector2(0, -1920) position = Vector2(0, -1920)
offset = Vector2(0, 1920) offset = Vector2(0, 1920)
anchor_mode = 0 anchor_mode = 0
editor_draw_screen = false editor_draw_screen = false
[node name="Background" parent="ViewportView/2D Viewport/Viewport Control" instance=ExtResource("2_8g6gv")] [node name="Background" parent="2D Viewport/Viewport Control" instance=ExtResource("2_8g6gv")]
material = SubResource("ShaderMaterial_lf1uh") material = SubResource("ShaderMaterial_bs53h")
layout_mode = 1 layout_mode = 1
offset_top = -1920.0 offset_top = -1920.0
offset_right = 1920.0 offset_right = 1920.0
[node name="Holds ViewportView" type="SubViewportContainer" parent="ViewportView/2D Viewport/Viewport Control"] [node name="Holds ViewportView" type="SubViewportContainer" parent="2D Viewport/Viewport Control"]
layout_mode = 0 layout_mode = 0
offset_right = 1920.0 offset_right = 1920.0
offset_bottom = 1920.0 offset_bottom = 1920.0
[node name="Holds Viewport" type="SubViewport" parent="ViewportView/2D Viewport/Viewport Control/Holds ViewportView"] [node name="Holds Viewport" type="SubViewport" parent="2D Viewport/Viewport Control/Holds ViewportView"]
transparent_bg = true transparent_bg = true
handle_input_locally = false handle_input_locally = false
screen_space_aa = 1 screen_space_aa = 1
size = Vector2i(1920, 1920) size = Vector2i(1920, 1920)
render_target_update_mode = 4 render_target_update_mode = 4
[node name="Holds Scroll" type="Control" parent="ViewportView/2D Viewport/Viewport Control/Holds ViewportView/Holds Viewport"] [node name="Holds Scroll" type="Control" parent="2D Viewport/Viewport Control/Holds ViewportView/Holds Viewport"]
layout_mode = 3 layout_mode = 3
anchors_preset = 15 anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0
@@ -176,7 +167,7 @@ offset_bottom = 1920.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
[node name="Holds Filter" type="TextureRect" parent="ViewportView/2D Viewport/Viewport Control/Holds ViewportView/Holds Viewport"] [node name="Holds Filter" type="TextureRect" parent="2D Viewport/Viewport Control/Holds ViewportView/Holds Viewport"]
material = SubResource("CanvasItemMaterial_5ymar") material = SubResource("CanvasItemMaterial_5ymar")
custom_minimum_size = Vector2(1920, 1920) custom_minimum_size = Vector2(1920, 1920)
anchors_preset = 15 anchors_preset = 15
@@ -190,20 +181,22 @@ grow_vertical = 2
rotation = 1.5708 rotation = 1.5708
texture = SubResource("GradientTexture1D_pha5y") texture = SubResource("GradientTexture1D_pha5y")
[node name="Notes Scroll" type="Control" parent="ViewportView/2D Viewport/Viewport Control"] [node name="Notes Scroll" type="Control" parent="2D Viewport/Viewport Control"]
material = SubResource("CanvasItemMaterial_27qpl") material = SubResource("CanvasItemMaterial_27qpl")
layout_mode = 1 layout_mode = 1
anchors_preset = 2 anchors_preset = 2
anchor_top = 1.0 anchor_top = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
offset_top = -1820.0
offset_bottom = -1820.0
grow_vertical = 0 grow_vertical = 0
[node name="ViewportView Left" type="SubViewportContainer" parent="ViewportView/2D Viewport/Viewport Control"] [node name="ViewportView Left" type="SubViewportContainer" parent="2D Viewport/Viewport Control"]
layout_mode = 0 layout_mode = 0
offset_right = 1920.0 offset_right = 1920.0
offset_bottom = 1920.0 offset_bottom = 1920.0
[node name="Viewport Left" type="SubViewport" parent="ViewportView/2D Viewport/Viewport Control/ViewportView Left"] [node name="Viewport Left" type="SubViewport" parent="2D Viewport/Viewport Control/ViewportView Left"]
disable_3d = true disable_3d = true
own_world_3d = true own_world_3d = true
transparent_bg = true transparent_bg = true
@@ -212,12 +205,12 @@ msaa_2d = 1
size = Vector2i(1920, 1920) size = Vector2i(1920, 1920)
render_target_update_mode = 4 render_target_update_mode = 4
[node name="Camera2D Left" type="Camera2D" parent="ViewportView/2D Viewport/Viewport Control/ViewportView Left/Viewport Left"] [node name="Camera2D Left" type="Camera2D" parent="2D Viewport/Viewport Control/ViewportView Left/Viewport Left"]
position = Vector2(0, -1920) position = Vector2(0, -1920)
offset = Vector2(-1921, 1920) offset = Vector2(-1921, 1920)
anchor_mode = 0 anchor_mode = 0
[node name="ViewportView Right" type="SubViewportContainer" parent="ViewportView/2D Viewport/Viewport Control"] [node name="ViewportView Right" type="SubViewportContainer" parent="2D Viewport/Viewport Control"]
layout_mode = 1 layout_mode = 1
anchors_preset = -1 anchors_preset = -1
anchor_right = 1.0 anchor_right = 1.0
@@ -225,7 +218,7 @@ anchor_bottom = 1.0
grow_horizontal = 2 grow_horizontal = 2
grow_vertical = 2 grow_vertical = 2
[node name="Viewport Right" type="SubViewport" parent="ViewportView/2D Viewport/Viewport Control/ViewportView Right"] [node name="Viewport Right" type="SubViewport" parent="2D Viewport/Viewport Control/ViewportView Right"]
disable_3d = true disable_3d = true
own_world_3d = true own_world_3d = true
transparent_bg = true transparent_bg = true
@@ -234,7 +227,26 @@ msaa_2d = 1
size = Vector2i(1920, 1920) size = Vector2i(1920, 1920)
render_target_update_mode = 4 render_target_update_mode = 4
[node name="Camera2D Right" type="Camera2D" parent="ViewportView/2D Viewport/Viewport Control/ViewportView Right/Viewport Right"] [node name="Camera2D Right" type="Camera2D" parent="2D Viewport/Viewport Control/ViewportView Right/Viewport Right"]
position = Vector2(0, -1920) position = Vector2(0, -1920)
offset = Vector2(1921, 1920) offset = Vector2(1921, 1920)
anchor_mode = 0 anchor_mode = 0
[node name="ViewportView" type="SubViewportContainer" parent="."]
modulate = Color(1, 1, 1, 0.329412)
anchors_preset = 7
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -960.0
offset_top = -1920.0
offset_right = 960.0
grow_horizontal = 2
grow_vertical = 0
[node name="AudioStreamPlayer BGM" type="AudioStreamPlayer" parent="."]
script = ExtResource("4_c2dke")
[node name="AudioStreamPlayer SFX" type="AudioStreamPlayer" parent="."]
script = ExtResource("5_owrd5")
-1
View File
@@ -91,7 +91,6 @@ namespace WacK.Scenes
var songPath = $"user://songs/{songsButton.Text}"; var songPath = $"user://songs/{songsButton.Text}";
var chartPath = $"{songPath}/{difficultyButton.Selected}.mer"; var chartPath = $"{songPath}/{difficultyButton.Selected}.mer";
var soundPath = $"{songPath}/{soundButton.Text}"; var soundPath = $"{songPath}/{soundButton.Text}";
GD.Print($"Song: {songPath}\nChart: {chartPath}\nSound: {soundPath}");
// folder check // folder check
using var dir = DirAccess.Open(songPath); using var dir = DirAccess.Open(songPath);
+46
View File
@@ -0,0 +1,46 @@
using Godot;
using Godot.Collections;
using System;
public partial class BGM : AudioStreamPlayer
{
public void LoadFromUser(string path)
{
if (!path.StartsWith("user://"))
{
GD.Print("Tried to load audio that isn't in user directory.");
return;
}
var f = FileAccess.Open(path, FileAccess.ModeFlags.Read);
if (f == null)
{
GD.PrintErr($"Unable to open {path} for loading audio! {FileAccess.GetOpenError()}");
return;
}
GD.Print("hi");
var ext = path.Split('.')[^1].ToLower();
switch (ext)
{
case "mp3":
var mp3 = new AudioStreamMP3()
{
Data = f.GetBuffer((long)f.GetLength())
};
Stream = mp3;
break;
case "wav":
case "wave":
var wav = new AudioStreamWav()
{
Data = f.GetBuffer((long)f.GetLength())
};
Stream = wav;
break;
case "ogg":
// TODO: implement
GD.PrintErr("External OGGs not supported in Godot 4.1...");
break;
}
}
}
+15
View File
@@ -0,0 +1,15 @@
using Godot;
using System;
public partial class SFX : Node
{
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
}
// Called every frame. 'delta' is the elapsed time since the previous frame.
public override void _Process(double delta)
{
}
}
@@ -22,6 +22,7 @@ namespace WacK.Scenes
{ {
chartPath = chPath; chartPath = chPath;
soundPath = snPath; soundPath = snPath;
GD.Print($"Chart: {chartPath}\nSound: {soundPath}");
} }
} }
public partial class Play : Node public partial class Play : Node
@@ -34,6 +35,14 @@ namespace WacK.Scenes
public static PackedScene noteHold = GD.Load<PackedScene>("res://Things/TunnelObjects/Notes/NoteHold.tscn"); public static PackedScene noteHold = GD.Load<PackedScene>("res://Things/TunnelObjects/Notes/NoteHold.tscn");
public static PackedScene noteChain = GD.Load<PackedScene>("res://Things/TunnelObjects/Notes/NoteChain.tscn"); public static PackedScene noteChain = GD.Load<PackedScene>("res://Things/TunnelObjects/Notes/NoteChain.tscn");
[ExportCategory("Audio")]
[Export]
private BGM bgmController;
[Export]
private SFX sfxController;
[ExportCategory("2D")]
[ExportSubgroup("2D Things")]
[Export] [Export]
public Control noteDisplay; public Control noteDisplay;
[Export] [Export]
@@ -41,6 +50,7 @@ namespace WacK.Scenes
[Export] [Export]
public Background background; public Background background;
[ExportSubgroup("Out-of-bounds Viewports")]
[Export] [Export]
public Viewport mainViewport; public Viewport mainViewport;
[Export] [Export]
@@ -69,6 +79,10 @@ namespace WacK.Scenes
// parse mer and create chart for current play // parse mer and create chart for current play
chart = new(playParams.chartPath); chart = new(playParams.chartPath);
RealizeChart(); RealizeChart();
// audio setup
bgmController.LoadFromUser(playParams.soundPath);
bgmController.Play();
} }
/// <summary> /// <summary>
@@ -107,8 +121,10 @@ namespace WacK.Scenes
public override void _Process(double delta) public override void _Process(double delta)
{ {
double time = bgmController.GetPlaybackPosition() + AudioServer.GetTimeSinceLastMix() - AudioServer.GetOutputLatency();
var nPos = noteDisplay.Position; var nPos = noteDisplay.Position;
nPos.Y += (float)delta * scrollPxPerSec; nPos.Y = ((float)time * scrollPxPerSec) + 1920;
noteDisplay.Position = nPos; noteDisplay.Position = nPos;
scrollDisplay.Position = nPos; scrollDisplay.Position = nPos;
} }
@@ -25,7 +25,6 @@ namespace WacK.Things.TunnelObjects
holdScroll.AddChild(longThing); holdScroll.AddChild(longThing);
longThing.Position = new Vector2(0, (float)-holdNoteData.time * Play.scrollPxPerSec); longThing.Position = new Vector2(0, (float)-holdNoteData.time * Play.scrollPxPerSec);
GD.Print($"{holdNoteData.points.Count}");
if (holdNoteData.points.Count > 0) if (holdNoteData.points.Count > 0)
{ {
NotePlay lastHold = holdNoteData; NotePlay lastHold = holdNoteData;