1
0

music.gd 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. extends Node
  2. ## Background music that carries on across scene changes. Scenes ask for a track; the
  3. ## player crossfades to it, or keeps playing if it is already on.
  4. ## Loaded on first use rather than preloaded, so this autoload never depends on the
  5. ## music having been imported yet. Looping is set in each track's .import file.
  6. const TRACKS := {
  7. menu = "res://assets/music/menu.ogg",
  8. game = "res://assets/music/game.ogg",
  9. }
  10. const VOLUME_DB := { menu = -6.0, game = -10.0 }
  11. const FADE_SECONDS := 0.8
  12. const SILENT_DB := -40.0
  13. var _player := AudioStreamPlayer.new()
  14. var _track := ""
  15. func _ready() -> void:
  16. process_mode = Node.PROCESS_MODE_ALWAYS
  17. add_child(_player)
  18. func play(track: String) -> void:
  19. if track == _track and _player.playing:
  20. return
  21. _track = track
  22. if not Progress.music_on():
  23. return
  24. var tween := create_tween()
  25. if _player.playing:
  26. tween.tween_property(_player, "volume_db", SILENT_DB, FADE_SECONDS / 2.0)
  27. tween.tween_callback(_start.bind(track))
  28. tween.tween_property(_player, "volume_db", VOLUME_DB[track], FADE_SECONDS / 2.0)
  29. func set_enabled(on: bool) -> void:
  30. Progress.set_music_on(on)
  31. if on:
  32. var track := _track
  33. _track = ""
  34. play(track if track != "" else "menu")
  35. else:
  36. _player.stop()
  37. func _start(track: String) -> void:
  38. _player.stream = load(TRACKS[track])
  39. _player.volume_db = SILENT_DB
  40. _player.play()