From e2c77b05e36c15b5581cf23985ff34799ec611ca Mon Sep 17 00:00:00 2001 From: Dustin Date: Sun, 1 Jun 2025 17:10:04 -0700 Subject: [PATCH] SE manager working. Mushroom pew now pows. --- lib/singleton_autoloads/SoundEffectManager.gd | 53 +++++++++++++++++++ project.godot | 1 + src/classes/projectile.gd | 1 + src/components/PewMachine.gd | 2 + src/projectiles/MushroomPew.tscn | 4 +- 5 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 lib/singleton_autoloads/SoundEffectManager.gd diff --git a/lib/singleton_autoloads/SoundEffectManager.gd b/lib/singleton_autoloads/SoundEffectManager.gd new file mode 100644 index 0000000..f7aeb91 --- /dev/null +++ b/lib/singleton_autoloads/SoundEffectManager.gd @@ -0,0 +1,53 @@ +extends Node + +export (int) var player_count = 5 + +class SoundRequest: + var stream + var priority = 0 + + func _init(_stream: AudioStream, _priority: int = 0): + stream = _stream + priority = _priority + +var players := [] +var sound_queue := [] + +func _ready(): + ## Singletons don't run process unless explicitly enabled + set_process(true) + + for i in range(player_count): + var player = AudioStreamPlayer.new() + add_child(player) + players.append(player) + +func play_sound(stream: AudioStream, priority: int = 0): + # Try to find an available player + for i in range(player_count): + if not players[i].playing: + players[i].stream = stream + players[i].play() + return + + ##TODO: This may be slow, perhaps just a pop push front is good enough + # No player is available, add to queue + sound_queue.append(SoundRequest.new(stream, priority)) + # Sort queue by priority (descending) + sound_queue.sort_custom(self, "_sort_by_priority") + +func _process(_delta): + if sound_queue.empty(): + return + + for i in range(player_count): + if not players[i].playing: + var request = sound_queue.pop_front() + players[i].stream = request.stream + players[i].play() + # only play one queued sound per frame + break + +func _sort_by_priority(a: SoundRequest, b: SoundRequest) -> bool: + return a.priority > b.priority + diff --git a/project.godot b/project.godot index 4e534c8..031623a 100644 --- a/project.godot +++ b/project.godot @@ -224,6 +224,7 @@ PlayerInfo="*res://lib/singleton_autoloads/PlayerInfo.gd" UiManager="*res://lib/singleton_autoloads/UIManager.gd" LevelInfo="*res://lib/singleton_autoloads/LevelInfo.gd" NetworkManager="*res://lib/singleton_autoloads/NetworkManager.gd" +SoundEffectManager="*res://lib/singleton_autoloads/SoundEffectManager.gd" [debug] diff --git a/src/classes/projectile.gd b/src/classes/projectile.gd index 05f312c..d475e80 100644 --- a/src/classes/projectile.gd +++ b/src/classes/projectile.gd @@ -9,6 +9,7 @@ extends Area2D export var velocity_pps :float = 1 export var lifespan :float = -1 +export var sound_effect :AudioStream var direction_normal := Vector2(0,0) puppet var puppet_direction_normal :Vector2 puppet var puppet_position diff --git a/src/components/PewMachine.gd b/src/components/PewMachine.gd index 9618d08..16c2e6a 100644 --- a/src/components/PewMachine.gd +++ b/src/components/PewMachine.gd @@ -62,8 +62,10 @@ func shoot(direction = 1): bullet.set_as_toplevel(true) add_child(bullet) + # sound_shoot.play() timer.start() + SoundEffectManager.play_sound(bullet.sound_effect) NetworkManager.instance_on_peer_players(loaded_scene, self.get_path(), global_position , true) return true diff --git a/src/projectiles/MushroomPew.tscn b/src/projectiles/MushroomPew.tscn index d0c537f..119f2b7 100644 --- a/src/projectiles/MushroomPew.tscn +++ b/src/projectiles/MushroomPew.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=4 format=2] +[gd_scene load_steps=5 format=2] [ext_resource path="res://src/parent_scenes/projectile.tscn" type="PackedScene" id=1] [ext_resource path="res://assets/items/mushroom_icon.png" type="Texture" id=2] +[ext_resource path="res://assets_tmp/SE/pop.wav" type="AudioStream" id=3] [sub_resource type="CapsuleShape2D" id=1] radius = 6.0 @@ -10,6 +11,7 @@ height = 2.0 [node name="MushroomPew" groups=["world"] instance=ExtResource( 1 )] velocity_pps = 300.0 lifespan = 0.5 +sound_effect = ExtResource( 3 ) [node name="CollisionShape2D" type="CollisionShape2D" parent="." index="0"] shape = SubResource( 1 )