From c0aed38065407209eb0eb13dbd6fb6fd004600f5 Mon Sep 17 00:00:00 2001 From: Taevas Date: Mon, 24 Mar 2025 18:13:08 +0100 Subject: [PATCH] properly fade out the music when finishing a level --- icon.svg | 1 - icon.svg.import | 37 ---------------------- index.tscn | 14 +++------ levels/base/level.tscn | 2 +- levels/base/music.tscn | 3 +- levels/demo_level.tscn | 2 +- levels/forest/level.tscn | 2 +- levels/forest/music.tscn | 3 +- levels/level.gd | 32 +++++-------------- levels/music.gd | 66 +++++++++++++++++++++++++++++++++++----- levels/night/level.tscn | 2 +- levels/night/music.tscn | 3 +- 12 files changed, 80 insertions(+), 87 deletions(-) delete mode 100644 icon.svg delete mode 100644 icon.svg.import diff --git a/icon.svg b/icon.svg deleted file mode 100644 index 9d8b7fa..0000000 --- a/icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icon.svg.import b/icon.svg.import deleted file mode 100644 index 9a07b08..0000000 --- a/icon.svg.import +++ /dev/null @@ -1,37 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c4nwhhum2vht5" -path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://icon.svg" -dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/index.tscn b/index.tscn index 1588f15..814531d 100644 --- a/index.tscn +++ b/index.tscn @@ -48,19 +48,13 @@ func stop_level() -> void: $Timer.paused = true changing_level = true - AudioServer.set_bus_volume_db(0, -5) - await get_tree().create_timer(0.5).timeout - AudioServer.set_bus_volume_db(0, -10) - await get_tree().create_timer(0.5).timeout - AudioServer.set_bus_volume_db(0, -30) - await get_tree().create_timer(0.5).timeout - AudioServer.set_bus_volume_db(0, -50) - await get_tree().create_timer(0.5).timeout - var next_level: PackedScene var current_levels = $Levels.get_children(true) if len(current_levels): - var current_level = current_levels[0] + var current_level: Level = current_levels[0] + current_level.music.fadeOut(2) + await get_tree().create_timer(2).timeout + if current_level.get_meta(\"name\") == \"Base\": next_level = forest elif current_level.get_meta(\"name\") == \"Forest\": diff --git a/levels/base/level.tscn b/levels/base/level.tscn index 9973e76..faa000e 100644 --- a/levels/base/level.tscn +++ b/levels/base/level.tscn @@ -6,7 +6,7 @@ [ext_resource type="PackedScene" uid="uid://cnnvwotv33u1b" path="res://elements/player.tscn" id="2_b00jj"] [ext_resource type="PackedScene" uid="uid://cpm3laywhlbq5" path="res://elements/ring.tscn" id="3_hel5x"] [ext_resource type="PackedScene" uid="uid://c77bli40240nk" path="res://elements/sign.tscn" id="4_atq6y"] -[ext_resource type="PackedScene" uid="uid://cgt5st4qacruw" path="res://levels/base/music.tscn" id="4_uq42r"] +[ext_resource type="PackedScene" uid="uid://dnuakh7n3fuij" path="res://levels/base/music.tscn" id="4_uq42r"] [node name="Base" type="Node3D"] script = ExtResource("1_rj40i") diff --git a/levels/base/music.tscn b/levels/base/music.tscn index a562ee8..f6a2329 100644 --- a/levels/base/music.tscn +++ b/levels/base/music.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3 uid="uid://cgt5st4qacruw"] +[gd_scene load_steps=8 format=3 uid="uid://dnuakh7n3fuij"] [ext_resource type="AudioStream" uid="uid://b46a7y6vdqd4n" path="res://levels/base/music/hihat-closed.ogg" id="1_shxcq"] [ext_resource type="Script" uid="uid://dgpjhli3hpn0u" path="res://levels/music.gd" id="1_y1f1r"] @@ -10,6 +10,7 @@ [node name="Music" type="Node"] script = ExtResource("1_y1f1r") +metadata/_custom_type_script = "uid://dgpjhli3hpn0u" [node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] stream = ExtResource("1_shxcq") diff --git a/levels/demo_level.tscn b/levels/demo_level.tscn index d5f31aa..493312b 100644 --- a/levels/demo_level.tscn +++ b/levels/demo_level.tscn @@ -2,7 +2,7 @@ [ext_resource type="Script" uid="uid://w3fetao1pegm" path="res://levels/level.gd" id="1_ifscd"] [ext_resource type="PackedScene" uid="uid://b6gnffoboc5j5" path="res://levels/night/environment.tscn" id="2_v6rg2"] -[ext_resource type="PackedScene" uid="uid://q7frlnx37gv6" path="res://levels/night/music.tscn" id="3_fb0ct"] +[ext_resource type="PackedScene" uid="uid://drfy3vhe6skp1" path="res://levels/night/music.tscn" id="3_fb0ct"] [ext_resource type="PackedScene" uid="uid://cnnvwotv33u1b" path="res://elements/player.tscn" id="4_ge8id"] [ext_resource type="PackedScene" uid="uid://cpm3laywhlbq5" path="res://elements/ring.tscn" id="5_j060p"] diff --git a/levels/forest/level.tscn b/levels/forest/level.tscn index 52a620c..deffdc1 100644 --- a/levels/forest/level.tscn +++ b/levels/forest/level.tscn @@ -3,7 +3,7 @@ [ext_resource type="PackedScene" uid="uid://w4h8ip754qnb" path="res://levels/forest/environment.tscn" id="1_7clrg"] [ext_resource type="Script" uid="uid://w3fetao1pegm" path="res://levels/level.gd" id="1_fdxcj"] [ext_resource type="PackedScene" uid="uid://cnnvwotv33u1b" path="res://elements/player.tscn" id="2_mjogx"] -[ext_resource type="PackedScene" uid="uid://dp8nvfm55te85" path="res://levels/forest/music.tscn" id="3_n1xsx"] +[ext_resource type="PackedScene" uid="uid://cakmsiye3hjfe" path="res://levels/forest/music.tscn" id="3_n1xsx"] [ext_resource type="PackedScene" uid="uid://cpm3laywhlbq5" path="res://elements/ring.tscn" id="4_p8yhq"] [ext_resource type="PackedScene" uid="uid://da6lkdiskdh8v" path="res://elements/tree.tscn" id="6_1e514"] [ext_resource type="PackedScene" uid="uid://c77bli40240nk" path="res://elements/sign.tscn" id="6_ifogr"] diff --git a/levels/forest/music.tscn b/levels/forest/music.tscn index bb697e1..5d3d541 100644 --- a/levels/forest/music.tscn +++ b/levels/forest/music.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3 uid="uid://dp8nvfm55te85"] +[gd_scene load_steps=8 format=3 uid="uid://cakmsiye3hjfe"] [ext_resource type="Script" uid="uid://dgpjhli3hpn0u" path="res://levels/music.gd" id="1_whsrg"] [ext_resource type="AudioStream" uid="uid://pn2b2f3egpck" path="res://levels/forest/music/dong2.ogg" id="2_pm2p2"] @@ -10,6 +10,7 @@ [node name="Music" type="Node"] script = ExtResource("1_whsrg") +metadata/_custom_type_script = "uid://dgpjhli3hpn0u" [node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] stream = ExtResource("2_pm2p2") diff --git a/levels/level.gd b/levels/level.gd index 025014a..7950043 100644 --- a/levels/level.gd +++ b/levels/level.gd @@ -1,20 +1,19 @@ +class_name Level extends Node3D +var music: Music var velocity: float = 0.0 var rings_count = 72727 var finished_rings_count = 0 var rings: Array[Node] = [] -var stream_players: Array[AudioStreamPlayer] = [] - func _ready() -> void: - var music_node = get_node("Music") - assert(is_instance_valid(music_node), self.name + " has no music!") - var music = music_node.get_children() - for music_player in music: - if music_player is AudioStreamPlayer: - stream_players.push_back(music_player) + var children = get_children() + for child in children: + if is_instance_of(child, Music): + music = child + assert(is_instance_valid(music), self.name + " has no music!") var rings_node = get_node("Rings") assert(is_instance_valid(rings_node), self.name + " has no rings!") @@ -33,19 +32,4 @@ func do_we_end_yet(): func _process(delta: float) -> void: var sphere = $Player/Sphere velocity = abs(sphere.linear_velocity.x) + abs(sphere.linear_velocity.y) - var instruments_needed = floor(velocity / 8) - var instruments_playing = stream_players.filter(func(p: AudioStreamPlayer): return p.volume_db > -50) - - for index_p in len(instruments_playing): - var playing = instruments_playing[index_p] - if index_p + 1 > instruments_needed: - playing.volume_db = max(playing.volume_db - (delta * 32), -50) - elif playing.volume_db <= 0: - playing.volume_db = min(playing.volume_db + (delta * 8), 0) - - if instruments_needed > len(instruments_playing): - var instruments_not_playing = stream_players.filter(func(p: AudioStreamPlayer): return p.volume_db <= -50) - if len(instruments_not_playing): - var to_play = instruments_not_playing.pick_random() - if is_instance_valid(to_play): - to_play.volume_db = min(to_play.volume_db + (delta * 16), 0) + music.adaptInstrumentsToVelocity(velocity, delta) diff --git a/levels/music.gd b/levels/music.gd index 801fb3e..a98710a 100644 --- a/levels/music.gd +++ b/levels/music.gd @@ -1,15 +1,65 @@ +class_name Music extends Node +## While the instruments are manipulated individually to match the gameplay, +## they are all regrouped in a single bus dedicated to this specific music. +## So we also manipulate the bus itself for the purposes of applying +## audio balance and settings and the such more efficiently. + +var bus_index: int = -1 +var instruments: Array[AudioStreamPlayer] = [] + func _ready() -> void: - var players = get_children() - for player in players: - if player is AudioStreamPlayer: - player.volume_db = -50 - var stream: AudioStreamOggVorbis = player.stream + bus_index = AudioServer.get_bus_index(self.name) + if bus_index == -1: + AudioServer.add_bus() + AudioServer.set_bus_name(AudioServer.bus_count - 1, self.name) + bus_index = AudioServer.get_bus_index(self.name) + + var current_effects = AudioServer.get_bus_effect_count(bus_index) + for i in current_effects: + AudioServer.remove_bus_effect(bus_index, i) + + var children = get_children() + for child in children: + if child is AudioStreamPlayer: + instruments.push_back(child) + child.bus = AudioServer.get_bus_name(bus_index) + child.volume_db = -50 + var stream: AudioStreamOggVorbis = child.stream if stream is AudioStreamOggVorbis: stream.loop = true stream.bpm = 124 - for player in players: - if player is AudioStreamPlayer: - player.play() + for instrument in instruments: + if instrument is AudioStreamPlayer: + instrument.play() + +func changeVolume(db: float) -> void: + AudioServer.set_bus_volume_db(bus_index, db) + +func adaptInstrumentsToVelocity(velocity: float, delta: float) -> void: + var instruments_needed = floor(velocity / 8) + var instruments_playing = instruments.filter(func(i: AudioStreamPlayer): return i.volume_db > -50) + + for index_p in len(instruments_playing): + var playing = instruments_playing[index_p] + if index_p + 1 > instruments_needed: + playing.volume_db = max(playing.volume_db - (delta * 32), -50) + elif playing.volume_db <= 0: + playing.volume_db = min(playing.volume_db + (delta * 8), 0) + + if instruments_needed > len(instruments_playing): + var instruments_not_playing = instruments.filter(func(i: AudioStreamPlayer): return i.volume_db <= -50) + if len(instruments_not_playing): + var to_play = instruments_not_playing.pick_random() + if is_instance_valid(to_play): + to_play.volume_db = min(to_play.volume_db + (delta * 16), 0) + +func fadeOut(seconds: float) -> void: + var tween: Tween = create_tween() + # https://github.com/godotengine/godot/issues/32882 + AudioServer.add_bus_effect(bus_index, AudioEffectAmplify.new()) + var effect_index: int = AudioServer.get_bus_effect_count(bus_index) - 1 + var effect: AudioEffectAmplify = AudioServer.get_bus_effect(bus_index, effect_index) + tween.tween_property(effect, "volume_linear", 0, seconds) diff --git a/levels/night/level.tscn b/levels/night/level.tscn index 53c873a..595b988 100644 --- a/levels/night/level.tscn +++ b/levels/night/level.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=9 format=3 uid="uid://c2rlx31om4gey"] [ext_resource type="Script" uid="uid://w3fetao1pegm" path="res://levels/level.gd" id="1_3m1pa"] -[ext_resource type="PackedScene" uid="uid://q7frlnx37gv6" path="res://levels/night/music.tscn" id="1_npc74"] +[ext_resource type="PackedScene" uid="uid://drfy3vhe6skp1" path="res://levels/night/music.tscn" id="1_npc74"] [ext_resource type="PackedScene" uid="uid://cnnvwotv33u1b" path="res://elements/player.tscn" id="2_bc1ig"] [ext_resource type="PackedScene" uid="uid://b6gnffoboc5j5" path="res://levels/night/environment.tscn" id="2_wintp"] [ext_resource type="PackedScene" uid="uid://cpm3laywhlbq5" path="res://elements/ring.tscn" id="4_brcr0"] diff --git a/levels/night/music.tscn b/levels/night/music.tscn index 72c4cee..ee2b7be 100644 --- a/levels/night/music.tscn +++ b/levels/night/music.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3 uid="uid://q7frlnx37gv6"] +[gd_scene load_steps=8 format=3 uid="uid://drfy3vhe6skp1"] [ext_resource type="Script" uid="uid://dgpjhli3hpn0u" path="res://levels/music.gd" id="1_ok6lg"] [ext_resource type="AudioStream" uid="uid://dcgmuddvkcw6" path="res://levels/night/music/hihat-closed.ogg" id="2_oeg0c"] @@ -10,6 +10,7 @@ [node name="Music" type="Node"] script = ExtResource("1_ok6lg") +metadata/_custom_type_script = "uid://dgpjhli3hpn0u" [node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] stream = ExtResource("2_oeg0c")