platformer-game-test/src/Singletons/AudioManager.gd

114 lines
3.7 KiB
GDScript

extends Node
onready var _current_music_player = $MusicPlayer1
onready var _next_music_player= $MusicPlayer2
var _SILENT = -40.0
var _DESIRED_VOLUME = -15.0
var _DESIRED_SFX_VOLUME = -10.0
var _DESIRED_PAUSE_VOLUME = -25.0
enum Music{
Intro,
Abandon,
PreGame
}
var _music_files := {
Music.Intro: load("res://assets/Audio/Dungeon - Altus Stratum.ogg"),
Music.Abandon: load("res://assets/Audio/Dungeon - Abandoned One.ogg"),
Music.PreGame: load("res://assets/Audio/Scene - Lucid Night.ogg")
}
enum Sfx{
COIN_COLLECTION,
PLAYER_JUMP,
PLAYER_LAND,
PLAYER_DASH,
PLAYER_ATTACK,
PLAYER_DIE,
UI_MOVE,
UI_SELECT
}
var _sfx_files := {
Sfx.COIN_COLLECTION : load("res://assets/Audio/SFX/coin.wav"),
Sfx.PLAYER_JUMP : load("res://assets/Audio/SFX/player_jump.wav"),
Sfx.PLAYER_LAND : load("res://assets/Audio/SFX/player_land.wav"),
Sfx.PLAYER_DASH : load("res://assets/Audio/SFX/player_dash.wav"),
Sfx.PLAYER_ATTACK : load("res://assets/Audio/SFX/player_attack.wav"),
Sfx.PLAYER_DIE : load("res://assets/Audio/SFX/player_die.wav"),
Sfx.UI_MOVE : load("res://assets/Audio/UI_Sounds/menu_move_sound.wav"),
Sfx.UI_SELECT : '',
}
var _current_music = null
var _next_music = null
func _ready() -> void:
_current_music_player.volume_db = _SILENT
_next_music_player.volume_db = _SILENT
var children = $SfxPlayers.get_children()
for child in children:
var player:AudioStreamPlayer = child
player.volume_db = _DESIRED_SFX_VOLUME
func play_music(music:int, transition_time:float = .5) -> void:
_transition_to(music, transition_time)
pass
func set_volume(duration:float=.2, volume:float = _DESIRED_PAUSE_VOLUME):
_current_music_player.get_node("Tween").stop_all()
_next_music_player.get_node("Tween").stop_all()
_current_music_player.get_node("Tween").interpolate_property(_current_music_player, 'volume_db', _current_music_player.volume_db, volume, duration)
_current_music_player.get_node("Tween").start()
func play_sfx(sfx:int, priority:int=0):
var sfx_player = _get_available_sfx_player()
if sfx_player != null:
sfx_player.stream = _sfx_files[sfx]
sfx_player.play()
pass
func _transition_to(music:int, duration:float):
if _current_music == null:
_play_first_music(music, duration)
return
_next_music = music
_next_music_player.stream = _music_files[music]
_next_music_player.play()
_current_music_player.get_node("Tween").stop_all()
_next_music_player.get_node("Tween").stop_all()
_current_music_player.get_node("Tween").interpolate_property(_current_music_player, 'volume_db', _current_music_player.volume_db, _SILENT, duration)
_next_music_player.get_node("Tween").interpolate_property(_next_music_player, 'volume_db', _next_music_player.volume_db, _DESIRED_VOLUME, duration)
_current_music_player.get_node("Tween").start()
_next_music_player.get_node("Tween").start()
func _play_first_music(music:int, duration:float):
_current_music = music
_current_music_player.stream = _music_files[music]
_current_music_player.play()
_current_music_player.get_node("Tween").interpolate_property(_current_music_player, 'volume_db', _current_music_player.volume_db, _DESIRED_VOLUME, duration)
_current_music_player.get_node("Tween").start()
func _get_available_sfx_player()->AudioStreamPlayer:
var children = $SfxPlayers.get_children()
for child in children:
var player:AudioStreamPlayer = child
if not player.playing: return player
return null
func _on_Tween_completed(object: Object, key: NodePath) -> void:
if object.volume_db == _DESIRED_VOLUME and _next_music != null:
var tmp = _current_music_player
_current_music_player = _next_music_player
_next_music_player = tmp
_next_music_player.stop()
_current_music = _next_music
_next_music = null
pass # Replace with function body.