| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- extends Node
- ## Background music that carries on across scene changes. Scenes ask for a track; the
- ## player crossfades to it, or keeps playing if it is already on.
- ## Loaded on first use rather than preloaded, so this autoload never depends on the
- ## music having been imported yet. Looping is set in each track's .import file.
- const TRACKS := {
- menu = "res://assets/music/menu.ogg",
- game = "res://assets/music/game.ogg",
- }
- const VOLUME_DB := { menu = -6.0, game = -10.0 }
- const FADE_SECONDS := 0.8
- const SILENT_DB := -40.0
- var _player := AudioStreamPlayer.new()
- var _track := ""
- func _ready() -> void:
- process_mode = Node.PROCESS_MODE_ALWAYS
- add_child(_player)
- func play(track: String) -> void:
- if track == _track and _player.playing:
- return
- _track = track
- if not Progress.music_on():
- return
- var tween := create_tween()
- if _player.playing:
- tween.tween_property(_player, "volume_db", SILENT_DB, FADE_SECONDS / 2.0)
- tween.tween_callback(_start.bind(track))
- tween.tween_property(_player, "volume_db", VOLUME_DB[track], FADE_SECONDS / 2.0)
- func set_enabled(on: bool) -> void:
- Progress.set_music_on(on)
- if on:
- var track := _track
- _track = ""
- play(track if track != "" else "menu")
- else:
- _player.stop()
- func _start(track: String) -> void:
- _player.stream = load(TRACKS[track])
- _player.volume_db = SILENT_DB
- _player.play()
|