Audio manager implementation
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
extends Node
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# AudioManager — singleton for playing sound effects
|
||||
# Uses a pool of AudioStreamPlayers to allow overlapping sounds
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
const POOL_SIZE := 8
|
||||
|
||||
# Preloaded sound effects
|
||||
var _sounds: Dictionary = {
|
||||
"enemy_hit": preload("res://assets/audio/sfx/enemy_hit.wav"),
|
||||
"player_hit": preload("res://assets/audio/sfx/player_hit.wav"),
|
||||
"player_shoot": preload("res://assets/audio/sfx/player_shoot.wav"),
|
||||
"explosion": preload("res://assets/audio/sfx/explosion.wav"),
|
||||
"pickup_scrap": preload("res://assets/audio/sfx/pickup_scrap.wav"),
|
||||
"item_pickup": preload("res://assets/audio/sfx/item_pickup.wav"),
|
||||
"ui_click": preload("res://assets/audio/sfx/ui_click.wav"),
|
||||
"ui_select": preload("res://assets/audio/sfx/ui_select.wav"),
|
||||
}
|
||||
|
||||
var _pool: Array[AudioStreamPlayer] = []
|
||||
var _pool_index: int = 0
|
||||
|
||||
func _ready() -> void:
|
||||
process_mode = Node.PROCESS_MODE_ALWAYS
|
||||
for i in POOL_SIZE:
|
||||
var player := AudioStreamPlayer.new()
|
||||
player.bus = "Master"
|
||||
add_child(player)
|
||||
_pool.append(player)
|
||||
|
||||
func play(sound_name: String) -> void:
|
||||
if not _sounds.has(sound_name):
|
||||
push_warning("AudioManager: Unknown sound '%s'" % sound_name)
|
||||
return
|
||||
|
||||
var player := _pool[_pool_index]
|
||||
_pool_index = (_pool_index + 1) % POOL_SIZE
|
||||
|
||||
player.stream = _sounds[sound_name]
|
||||
player.play()
|
||||
Reference in New Issue
Block a user