54 lines
1.5 KiB
GDScript
54 lines
1.5 KiB
GDScript
extends Node
|
|
|
|
var sfx_players = [] as Array[AudioStreamPlayer]
|
|
var idx = 0
|
|
var bgm_dict = {}
|
|
|
|
|
|
func _ready() -> void:
|
|
for i in range(5):
|
|
var sfx_player = RandomAudioStreamPlayer.new()
|
|
sfx_players.append(sfx_player)
|
|
sfx_player.bus = "game_sfx"
|
|
add_child(sfx_player)
|
|
|
|
|
|
func play_sfx(sfx: AudioStream, db := 1.0) -> void:
|
|
sfx_players[idx].stream = sfx
|
|
sfx_players[idx].volume_db = db
|
|
sfx_players[idx].play()
|
|
idx = wrapi(idx + 1, 0, 5)
|
|
|
|
|
|
# 挂载并循环播放 bgm 音效
|
|
func loop_bgm_music(music_name: StringName, stream: AudioStream, db := 0.0, loop := true) -> void:
|
|
var audio_player = bgm_dict.get(music_name) as AudioStreamPlayer
|
|
if audio_player:
|
|
bgm_dict.erase(music_name)
|
|
audio_player.queue_free()
|
|
audio_player.stop()
|
|
audio_player = AudioStreamPlayer.new()
|
|
add_child(audio_player)
|
|
bgm_dict[music_name] = audio_player
|
|
audio_player.stream = stream
|
|
audio_player.volume_db = db
|
|
audio_player.bus = "game_music"
|
|
audio_player.play()
|
|
if loop and stream.get_length() > 0:
|
|
audio_player.finished.connect(audio_player.play)
|
|
|
|
|
|
func stop_bgm_music(music_name: StringName, ease_duration:= 3.0) -> void:
|
|
var audio_player = bgm_dict.get(music_name) as AudioStreamPlayer
|
|
if audio_player:
|
|
if ease_duration <= 0:
|
|
remove_child(audio_player)
|
|
audio_player.queue_free()
|
|
else:
|
|
var tween = create_tween()
|
|
tween.tween_property(audio_player, "volume_db", -80.0, ease_duration)
|
|
tween.tween_callback(audio_player.queue_free)
|
|
bgm_dict.erase(music_name)
|
|
else:
|
|
print("music bgm not found: ", music_name)
|