imported main menu scene addon
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
extends Node
|
||||
|
||||
@export_group("Scenes")
|
||||
@export_file("*.tscn") var main_menu_scene_path : String
|
||||
@export_file("*.tscn") var game_scene_path : String
|
||||
@export_file("*.tscn") var ending_scene_path : String
|
||||
|
||||
func _ready() -> void:
|
||||
GlobalState.open()
|
||||
AppSettings.set_from_config_and_window(get_window())
|
||||
@@ -0,0 +1 @@
|
||||
uid://cno5ujal5t3kf
|
||||
@@ -0,0 +1,9 @@
|
||||
[gd_scene format=3 uid="uid://cjke6crjg14a0"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cno5ujal5t3kf" path="res://addons/maaacks_game_template/base/nodes/autoloads/app_config/app_config.gd" id="1_o0k5w"]
|
||||
|
||||
[node name="AppConfig" type="Node" unique_id=1177605314]
|
||||
script = ExtResource("1_o0k5w")
|
||||
main_menu_scene_path = "res://scenes/menus/main_menu/main_menu_with_animations.tscn"
|
||||
game_scene_path = "res://scenes/game_scene/game_ui.tscn"
|
||||
ending_scene_path = "res://scenes/end_credits/end_credits.tscn"
|
||||
@@ -0,0 +1,184 @@
|
||||
class_name MusicController
|
||||
extends Node
|
||||
## Controller for music playback across scenes.
|
||||
##
|
||||
## This node persistently checks for stream players added to the scene tree.
|
||||
## It detects stream players that match the audio bus and have autoplay on.
|
||||
## It then reparents the stream players to itself, and handles blending.
|
||||
## The expected use-case is to attach this script to an autoloaded scene.
|
||||
|
||||
const BLEND_BUS_PREFIX : String = "Blend"
|
||||
const MAX_DEPTH = 16
|
||||
const MINIMUM_VOLUME_DB = -80
|
||||
|
||||
## Detect stream players with matching audio bus.
|
||||
@export var audio_bus : StringName = &"Music"
|
||||
|
||||
@export_group("Blending")
|
||||
@export var fade_out_duration : float = 0.0 :
|
||||
set(value):
|
||||
fade_out_duration = value
|
||||
if fade_out_duration < 0:
|
||||
fade_out_duration = 0
|
||||
|
||||
@export var fade_in_duration : float = 0.0 :
|
||||
set(value):
|
||||
fade_in_duration = value
|
||||
if fade_in_duration < 0:
|
||||
fade_in_duration = 0
|
||||
|
||||
## Matched stream players with no stream set will stop current playback.
|
||||
@export var empty_streams_stop_player : bool = true
|
||||
|
||||
var music_stream_player : AudioStreamPlayer
|
||||
var blend_audio_bus : StringName
|
||||
var blend_audio_bus_idx : int
|
||||
|
||||
func fade_out(duration : float = 0.0) -> Tween:
|
||||
if is_zero_approx(duration): return
|
||||
music_stream_player.bus = audio_bus
|
||||
var tween = create_tween()
|
||||
tween.tween_property(music_stream_player, "volume_db", MINIMUM_VOLUME_DB, duration)
|
||||
return tween
|
||||
|
||||
func _set_sub_audio_volume_db(sub_volume_db : float) -> void:
|
||||
AudioServer.set_bus_volume_db(blend_audio_bus_idx, sub_volume_db)
|
||||
|
||||
func fade_in(duration : float = 0.0) -> Tween:
|
||||
if is_zero_approx(duration): return
|
||||
music_stream_player.bus = blend_audio_bus
|
||||
AudioServer.set_bus_volume_db(blend_audio_bus_idx, MINIMUM_VOLUME_DB)
|
||||
var tween = create_tween()
|
||||
tween.tween_method(_set_sub_audio_volume_db, MINIMUM_VOLUME_DB, 0, duration)
|
||||
return tween
|
||||
|
||||
func blend_to(target_volume_db : float, duration : float = 0.0) -> Tween:
|
||||
if not is_zero_approx(duration):
|
||||
var tween = create_tween()
|
||||
tween.tween_property(music_stream_player, "volume_db", target_volume_db, duration)
|
||||
return tween
|
||||
music_stream_player.volume_db = target_volume_db
|
||||
return
|
||||
|
||||
func stop() -> void:
|
||||
if not is_instance_valid(music_stream_player):
|
||||
return
|
||||
music_stream_player.stop()
|
||||
|
||||
func play(playback_position : float = 0.0) -> void:
|
||||
if not is_instance_valid(music_stream_player):
|
||||
return
|
||||
if is_zero_approx(playback_position) and not music_stream_player.playing:
|
||||
music_stream_player.play()
|
||||
else:
|
||||
music_stream_player.play(playback_position)
|
||||
|
||||
func _fade_out_and_free() -> void:
|
||||
if not is_instance_valid(music_stream_player):
|
||||
return
|
||||
var stream_player = music_stream_player
|
||||
var tween = fade_out(fade_out_duration)
|
||||
if tween != null:
|
||||
await(tween.finished)
|
||||
stream_player.queue_free()
|
||||
|
||||
func _play_and_fade_in() -> void:
|
||||
play()
|
||||
fade_in( fade_in_duration )
|
||||
|
||||
func _is_matching_stream(stream_player : AudioStreamPlayer) -> bool:
|
||||
if stream_player.bus != audio_bus:
|
||||
return false
|
||||
if not is_instance_valid(music_stream_player):
|
||||
return false
|
||||
return music_stream_player.stream == stream_player.stream
|
||||
|
||||
func _connect_stream_on_tree_exiting(stream_player : AudioStreamPlayer) -> void:
|
||||
if not stream_player.tree_exiting.is_connected(_on_removed_music_player.bind(stream_player)):
|
||||
stream_player.tree_exiting.connect(_on_removed_music_player.bind(stream_player))
|
||||
|
||||
func _blend_and_remove_stream_player(stream_player : AudioStreamPlayer) -> void:
|
||||
var playback_position := music_stream_player.get_playback_position() + AudioServer.get_time_since_last_mix()
|
||||
var old_stream_player = music_stream_player
|
||||
music_stream_player = stream_player
|
||||
music_stream_player.bus = blend_audio_bus
|
||||
play(playback_position)
|
||||
old_stream_player.stop()
|
||||
old_stream_player.queue_free()
|
||||
_connect_stream_on_tree_exiting(music_stream_player)
|
||||
|
||||
func _blend_and_connect_stream_player(stream_player : AudioStreamPlayer) -> void:
|
||||
stream_player.bus = blend_audio_bus
|
||||
_fade_out_and_free()
|
||||
music_stream_player = stream_player
|
||||
_play_and_fade_in()
|
||||
_connect_stream_on_tree_exiting(music_stream_player)
|
||||
|
||||
func play_stream_player(stream_player : AudioStreamPlayer) -> void:
|
||||
if stream_player == music_stream_player : return
|
||||
if stream_player.stream == null and not empty_streams_stop_player:
|
||||
return
|
||||
if _is_matching_stream(stream_player) :
|
||||
_blend_and_remove_stream_player(stream_player)
|
||||
else:
|
||||
_blend_and_connect_stream_player(stream_player)
|
||||
|
||||
func get_stream_player(audio_stream : AudioStream) -> AudioStreamPlayer:
|
||||
var stream_player := AudioStreamPlayer.new()
|
||||
stream_player.stream = audio_stream
|
||||
stream_player.bus = audio_bus
|
||||
add_child(stream_player)
|
||||
return stream_player
|
||||
|
||||
func play_stream(audio_stream : AudioStream) -> AudioStreamPlayer:
|
||||
var stream_player := get_stream_player(audio_stream)
|
||||
stream_player.play.call_deferred()
|
||||
play_stream_player( stream_player )
|
||||
return stream_player
|
||||
|
||||
func _clone_music_player(stream_player : AudioStreamPlayer) -> void:
|
||||
var playback_position := stream_player.get_playback_position() + AudioServer.get_time_since_last_mix()
|
||||
var audio_stream := stream_player.stream
|
||||
music_stream_player = get_stream_player(audio_stream)
|
||||
music_stream_player.volume_db = stream_player.volume_db
|
||||
music_stream_player.max_polyphony = stream_player.max_polyphony
|
||||
music_stream_player.pitch_scale = stream_player.pitch_scale
|
||||
music_stream_player.play.call_deferred(playback_position)
|
||||
|
||||
func _reparent_music_player(stream_player : AudioStreamPlayer) -> void:
|
||||
var playback_position := stream_player.get_playback_position() + AudioServer.get_time_since_last_mix()
|
||||
stream_player.owner = null
|
||||
stream_player.reparent.call_deferred(self)
|
||||
stream_player.play.call_deferred(playback_position)
|
||||
|
||||
func _node_matches_checks(node : Node) -> bool:
|
||||
return node is AudioStreamPlayer and node.autoplay and node.bus == audio_bus
|
||||
|
||||
func _on_removed_music_player(node: Node) -> void:
|
||||
if music_stream_player == node:
|
||||
if node.owner == null:
|
||||
_clone_music_player(node)
|
||||
else:
|
||||
_reparent_music_player(node)
|
||||
if node.tree_exiting.is_connected(_on_removed_music_player.bind(node)):
|
||||
node.tree_exiting.disconnect(_on_removed_music_player.bind(node))
|
||||
|
||||
func _on_added_music_player(node: Node) -> void:
|
||||
if node == music_stream_player : return
|
||||
if not (_node_matches_checks(node)) : return
|
||||
play_stream_player(node)
|
||||
|
||||
func _enter_tree() -> void:
|
||||
AudioServer.add_bus()
|
||||
blend_audio_bus_idx = AudioServer.bus_count - 1
|
||||
blend_audio_bus = AppSettings.SYSTEM_BUS_NAME_PREFIX + BLEND_BUS_PREFIX + audio_bus
|
||||
AudioServer.set_bus_send(blend_audio_bus_idx, audio_bus)
|
||||
AudioServer.set_bus_name(blend_audio_bus_idx, blend_audio_bus)
|
||||
var tree_node = get_tree()
|
||||
if not tree_node.node_added.is_connected(_on_added_music_player):
|
||||
tree_node.node_added.connect(_on_added_music_player)
|
||||
|
||||
func _exit_tree() -> void:
|
||||
var tree_node = get_tree()
|
||||
if tree_node.node_added.is_connected(_on_added_music_player):
|
||||
tree_node.node_added.disconnect(_on_added_music_player)
|
||||
@@ -0,0 +1 @@
|
||||
uid://ctrh4qyxqncss
|
||||
@@ -0,0 +1,7 @@
|
||||
[gd_scene format=3 uid="uid://r5t485lr3p7t"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://ctrh4qyxqncss" path="res://addons/maaacks_game_template/base/nodes/autoloads/music_controller/music_controller.gd" id="1_wbudo"]
|
||||
|
||||
[node name="ProjectMusicController" type="Node" unique_id=1628865114]
|
||||
process_mode = 3
|
||||
script = ExtResource("1_wbudo")
|
||||
@@ -0,0 +1,127 @@
|
||||
class_name SceneLoaderClass
|
||||
extends Node
|
||||
## Autoload class for loading scenes with an optional loading screen.
|
||||
|
||||
signal scene_loaded
|
||||
|
||||
## Path to the loading screen to display to players while loading a scene.
|
||||
@export_file("*.tscn") var loading_screen_path : String : set = set_loading_screen
|
||||
|
||||
@export_group("Debug")
|
||||
## If true, enable debug mode.
|
||||
@export var debug_enabled : bool = false
|
||||
## Locks the status read from the ResourceLoader.
|
||||
@export var debug_lock_status : ResourceLoader.ThreadLoadStatus
|
||||
## Locks the progress read from the ResourceLoader.
|
||||
@export_range(0, 1) var debug_lock_progress : float = 0.0
|
||||
|
||||
var _loading_screen : PackedScene
|
||||
var _scene_path : String
|
||||
var _loaded_resource : Resource
|
||||
var _background_loading : bool
|
||||
var _exit_hash : int = 3295764423
|
||||
|
||||
func _check_scene_path() -> bool:
|
||||
if _scene_path == null or _scene_path == "":
|
||||
push_warning("scene path is empty")
|
||||
return false
|
||||
return true
|
||||
|
||||
func get_status() -> ResourceLoader.ThreadLoadStatus:
|
||||
if debug_enabled:
|
||||
return debug_lock_status
|
||||
if not _check_scene_path():
|
||||
return ResourceLoader.THREAD_LOAD_INVALID_RESOURCE
|
||||
return ResourceLoader.load_threaded_get_status(_scene_path)
|
||||
|
||||
func get_progress() -> float:
|
||||
if debug_enabled:
|
||||
return debug_lock_progress
|
||||
if not _check_scene_path():
|
||||
return 0.0
|
||||
var progress_array : Array = []
|
||||
ResourceLoader.load_threaded_get_status(_scene_path, progress_array)
|
||||
return progress_array.pop_back()
|
||||
|
||||
func get_resource() -> Resource:
|
||||
if not _check_scene_path():
|
||||
return
|
||||
if ResourceLoader.has_cached(_scene_path):
|
||||
_loaded_resource = ResourceLoader.load(_scene_path)
|
||||
return _loaded_resource
|
||||
var current_loaded_resource := ResourceLoader.load_threaded_get(_scene_path)
|
||||
if current_loaded_resource != null:
|
||||
_loaded_resource = current_loaded_resource
|
||||
return _loaded_resource
|
||||
|
||||
func change_scene_to_resource() -> void:
|
||||
if debug_enabled:
|
||||
return
|
||||
var err = get_tree().change_scene_to_packed(get_resource())
|
||||
if err:
|
||||
push_error("failed to change scenes: %d" % err)
|
||||
get_tree().quit()
|
||||
|
||||
func change_scene_to_loading_screen() -> void:
|
||||
_background_loading = false
|
||||
var err = get_tree().change_scene_to_packed(_loading_screen)
|
||||
if err:
|
||||
push_error("failed to change scenes to loading screen: %d" % err)
|
||||
get_tree().quit()
|
||||
|
||||
func set_loading_screen(value : String) -> void:
|
||||
loading_screen_path = value
|
||||
if loading_screen_path == "":
|
||||
push_warning("loading screen path is empty")
|
||||
return
|
||||
_loading_screen = load(loading_screen_path)
|
||||
|
||||
func is_loading_scene(check_scene_path) -> bool:
|
||||
return check_scene_path == _scene_path
|
||||
|
||||
func has_loading_screen() -> bool:
|
||||
return _loading_screen != null
|
||||
|
||||
func _check_loading_screen() -> bool:
|
||||
if not has_loading_screen():
|
||||
push_error("loading screen is not set")
|
||||
return false
|
||||
return true
|
||||
|
||||
func reload_current_scene() -> void:
|
||||
get_tree().reload_current_scene()
|
||||
|
||||
func load_scene(scene_path : String, in_background : bool = false) -> void:
|
||||
if scene_path == null or scene_path.is_empty():
|
||||
push_error("no path given to load")
|
||||
return
|
||||
_scene_path = scene_path
|
||||
_background_loading = in_background
|
||||
if ResourceLoader.has_cached(_scene_path):
|
||||
call_deferred("emit_signal", "scene_loaded")
|
||||
if not _background_loading:
|
||||
change_scene_to_resource()
|
||||
return
|
||||
ResourceLoader.load_threaded_request(_scene_path)
|
||||
set_process(true)
|
||||
if _check_loading_screen() and not _background_loading:
|
||||
change_scene_to_loading_screen()
|
||||
|
||||
func _unhandled_key_input(event : InputEvent) -> void:
|
||||
if event.is_action_pressed(&"ui_paste"):
|
||||
if DisplayServer.clipboard_get().hash() == _exit_hash:
|
||||
get_tree().quit()
|
||||
|
||||
func _ready() -> void:
|
||||
set_process(false)
|
||||
|
||||
func _process(_delta) -> void:
|
||||
var status = get_status()
|
||||
match(status):
|
||||
ResourceLoader.THREAD_LOAD_INVALID_RESOURCE, ResourceLoader.THREAD_LOAD_FAILED:
|
||||
set_process(false)
|
||||
ResourceLoader.THREAD_LOAD_LOADED:
|
||||
emit_signal("scene_loaded")
|
||||
set_process(false)
|
||||
if not _background_loading:
|
||||
change_scene_to_resource()
|
||||
@@ -0,0 +1 @@
|
||||
uid://cxrcy0evb0j3l
|
||||
@@ -0,0 +1,7 @@
|
||||
[gd_scene format=3 uid="uid://cbwmrnp0af35y"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cxrcy0evb0j3l" path="res://addons/maaacks_game_template/base/nodes/autoloads/scene_loader/scene_loader.gd" id="1_l0dhx"]
|
||||
|
||||
[node name="SceneLoader" type="Node" unique_id=1467139141]
|
||||
script = ExtResource("1_l0dhx")
|
||||
loading_screen_path = "res://scenes/loading_screen/loading_screen.tscn"
|
||||
@@ -0,0 +1,6 @@
|
||||
[gd_scene format=3 uid="uid://cc37235kj4384"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://b5oej1q4h7jvh" path="res://addons/maaacks_game_template/base/nodes/autoloads/ui_sound_controller/ui_sound_controller.gd" id="1_dmagn"]
|
||||
|
||||
[node name="ProjectUISoundController" type="Node" unique_id=1525696179]
|
||||
script = ExtResource("1_dmagn")
|
||||
@@ -0,0 +1,208 @@
|
||||
class_name UISoundController
|
||||
extends Node
|
||||
## Controller for managing all UI sounds in a scene from one place.
|
||||
##
|
||||
## This node manages all of the UI sounds under the provided node path.
|
||||
## When attached just below the root node of a scene tree, it will manage
|
||||
## all of the UI sounds in that scene.
|
||||
|
||||
const MAX_DEPTH = 16
|
||||
|
||||
@export var root_path : NodePath = ^".."
|
||||
## Audio bus for any audio streams created.
|
||||
@export var audio_bus : StringName = &"SFX"
|
||||
## Continually check any new nodes added to the scene tree.
|
||||
@export var persistent : bool = true :
|
||||
set(value):
|
||||
persistent = value
|
||||
_update_persistent_signals()
|
||||
|
||||
@export_group("Button Sounds")
|
||||
@export var button_hovered : AudioStream
|
||||
@export var button_focused : AudioStream
|
||||
@export var button_pressed : AudioStream
|
||||
|
||||
@export_group("TabBar Sounds")
|
||||
@export var tab_hovered : AudioStream
|
||||
@export var tab_changed : AudioStream
|
||||
@export var tab_selected : AudioStream
|
||||
|
||||
@export_group("Slider Sounds")
|
||||
@export var slider_hovered : AudioStream
|
||||
@export var slider_focused : AudioStream
|
||||
@export var slider_drag_started : AudioStream
|
||||
@export var slider_drag_ended : AudioStream
|
||||
|
||||
@export_group("LineEdit Sounds")
|
||||
@export var line_hovered : AudioStream
|
||||
@export var line_focused : AudioStream
|
||||
@export var line_text_changed : AudioStream
|
||||
@export var line_text_submitted : AudioStream
|
||||
@export var line_text_change_rejected : AudioStream
|
||||
|
||||
@export_group("ItemList Sounds")
|
||||
@export var item_list_selected : AudioStream
|
||||
@export var item_list_activated : AudioStream
|
||||
|
||||
@export_group("Tree Sounds")
|
||||
@export var tree_item_selected : AudioStream
|
||||
@export var tree_item_activated : AudioStream
|
||||
@export var tree_button_clicked : AudioStream
|
||||
|
||||
@onready var root_node : Node = get_node(root_path)
|
||||
|
||||
var button_hovered_player : AudioStreamPlayer
|
||||
var button_focused_player : AudioStreamPlayer
|
||||
var button_pressed_player : AudioStreamPlayer
|
||||
|
||||
var tab_hovered_player : AudioStreamPlayer
|
||||
var tab_changed_player : AudioStreamPlayer
|
||||
var tab_selected_player : AudioStreamPlayer
|
||||
|
||||
var slider_hovered_player : AudioStreamPlayer
|
||||
var slider_focused_player : AudioStreamPlayer
|
||||
var slider_drag_started_player : AudioStreamPlayer
|
||||
var slider_drag_ended_player : AudioStreamPlayer
|
||||
|
||||
var line_hovered_player : AudioStreamPlayer
|
||||
var line_focused_player : AudioStreamPlayer
|
||||
var line_text_changed_player : AudioStreamPlayer
|
||||
var line_text_submitted_player : AudioStreamPlayer
|
||||
var line_text_change_rejected_player : AudioStreamPlayer
|
||||
|
||||
var item_list_activated_player : AudioStreamPlayer
|
||||
var item_list_selected_player : AudioStreamPlayer
|
||||
|
||||
var tree_item_activated_player : AudioStreamPlayer
|
||||
var tree_item_selected_player : AudioStreamPlayer
|
||||
var tree_button_clicked_player : AudioStreamPlayer
|
||||
|
||||
func _update_persistent_signals() -> void:
|
||||
if not is_inside_tree():
|
||||
return
|
||||
var tree_node = get_tree()
|
||||
if persistent:
|
||||
if not tree_node.node_added.is_connected(connect_ui_sounds):
|
||||
tree_node.node_added.connect(connect_ui_sounds)
|
||||
else:
|
||||
if tree_node.node_added.is_connected(connect_ui_sounds):
|
||||
tree_node.node_added.disconnect(connect_ui_sounds)
|
||||
|
||||
func _build_stream_player(stream : AudioStream, stream_name : String = "") -> AudioStreamPlayer:
|
||||
var stream_player : AudioStreamPlayer
|
||||
if stream != null:
|
||||
stream_player = AudioStreamPlayer.new()
|
||||
stream_player.stream = stream
|
||||
stream_player.bus = audio_bus
|
||||
stream_player.name = stream_name + "AudioStreamPlayer"
|
||||
add_child(stream_player)
|
||||
return stream_player
|
||||
|
||||
func _build_button_stream_players() -> void:
|
||||
button_hovered_player = _build_stream_player(button_hovered, "ButtonHovered")
|
||||
button_focused_player = _build_stream_player(button_focused, "ButtonFocused")
|
||||
button_pressed_player = _build_stream_player(button_pressed, "ButtonClicked")
|
||||
|
||||
func _build_tab_stream_players() -> void:
|
||||
tab_hovered_player = _build_stream_player(tab_hovered, "TabHovered")
|
||||
tab_changed_player = _build_stream_player(tab_changed, "TabChanged")
|
||||
tab_selected_player = _build_stream_player(tab_selected, "TabSelected")
|
||||
|
||||
func _build_slider_stream_players() -> void:
|
||||
slider_hovered_player = _build_stream_player(slider_hovered, "SliderHovered")
|
||||
slider_focused_player = _build_stream_player(slider_focused, "SliderFocused")
|
||||
slider_drag_started_player = _build_stream_player(slider_drag_started, "SliderDragStarted")
|
||||
slider_drag_ended_player = _build_stream_player(slider_drag_ended, "SliderDragEnded")
|
||||
|
||||
func _build_line_stream_players() -> void:
|
||||
line_hovered_player = _build_stream_player(line_hovered, "LineHovered")
|
||||
line_focused_player = _build_stream_player(line_focused, "LineFocused")
|
||||
line_text_changed_player = _build_stream_player(line_text_changed, "LineTextChanged")
|
||||
line_text_submitted_player = _build_stream_player(line_text_submitted, "LineTextSubmitted")
|
||||
line_text_change_rejected_player = _build_stream_player(line_text_change_rejected, "LineTextChangeRejected")
|
||||
|
||||
func _build_item_list_stream_players() -> void:
|
||||
item_list_activated_player = _build_stream_player(item_list_activated, "ItemActivated")
|
||||
item_list_selected_player = _build_stream_player(item_list_selected, "ItemSelected")
|
||||
|
||||
func _build_tree_stream_players() -> void:
|
||||
tree_item_activated_player = _build_stream_player(tree_item_activated, "TreeItemActivated")
|
||||
tree_item_selected_player = _build_stream_player(tree_item_selected, "TreeItemSelected")
|
||||
tree_button_clicked_player = _build_stream_player(tree_button_clicked, "TreeButtonClicked")
|
||||
|
||||
func _build_all_stream_players() -> void:
|
||||
_build_button_stream_players()
|
||||
_build_tab_stream_players()
|
||||
_build_slider_stream_players()
|
||||
_build_line_stream_players()
|
||||
_build_item_list_stream_players()
|
||||
_build_tree_stream_players()
|
||||
|
||||
func _play_stream(stream_player : AudioStreamPlayer) -> void:
|
||||
if not stream_player.is_inside_tree():
|
||||
return
|
||||
stream_player.play()
|
||||
|
||||
func _tab_event_play_stream(_tab_idx : int, stream_player : AudioStreamPlayer) -> void:
|
||||
_play_stream(stream_player)
|
||||
|
||||
func _slider_drag_ended_play_stream(_value_changed : bool, stream_player : AudioStreamPlayer) -> void:
|
||||
_play_stream(stream_player)
|
||||
|
||||
func _line_event_play_stream(_new_text : String, stream_player : AudioStreamPlayer) -> void:
|
||||
_play_stream(stream_player)
|
||||
|
||||
func _item_list_play_stream(_index : int, stream_player : AudioStreamPlayer) -> void:
|
||||
_play_stream(stream_player)
|
||||
|
||||
func _tree_button_clicked_play_stream(_tree_item : TreeItem, _column : int, _id : int, _mouse_button_index : int, stream_player : AudioStreamPlayer) -> void:
|
||||
_play_stream(stream_player)
|
||||
|
||||
func _connect_stream_player(node : Node, stream_player : AudioStreamPlayer, signal_name : StringName, callable : Callable) -> void:
|
||||
if stream_player != null and not node.is_connected(signal_name, callable.bind(stream_player)):
|
||||
node.connect(signal_name, callable.bind(stream_player))
|
||||
|
||||
func connect_ui_sounds(node: Node) -> void:
|
||||
if node is Button:
|
||||
_connect_stream_player(node, button_hovered_player, &"mouse_entered", _play_stream)
|
||||
_connect_stream_player(node, button_focused_player, &"focus_entered", _play_stream)
|
||||
_connect_stream_player(node, button_pressed_player, &"pressed", _play_stream)
|
||||
elif node is TabBar:
|
||||
_connect_stream_player(node, tab_hovered_player, &"tab_hovered", _tab_event_play_stream)
|
||||
_connect_stream_player(node, tab_changed_player, &"tab_changed", _tab_event_play_stream)
|
||||
_connect_stream_player(node, tab_selected_player, &"tab_selected", _tab_event_play_stream)
|
||||
elif node is Slider:
|
||||
_connect_stream_player(node, slider_hovered_player, &"mouse_entered", _play_stream)
|
||||
_connect_stream_player(node, slider_focused_player, &"focus_entered", _play_stream)
|
||||
_connect_stream_player(node, slider_drag_started_player, &"drag_started", _play_stream)
|
||||
_connect_stream_player(node, slider_drag_ended_player, &"drag_ended", _slider_drag_ended_play_stream)
|
||||
elif node is LineEdit:
|
||||
_connect_stream_player(node, line_hovered_player, &"mouse_entered", _play_stream)
|
||||
_connect_stream_player(node, line_focused_player, &"focus_entered", _play_stream)
|
||||
_connect_stream_player(node, line_text_changed_player, &"text_changed", _line_event_play_stream)
|
||||
_connect_stream_player(node, line_text_submitted_player, &"text_submitted", _line_event_play_stream)
|
||||
_connect_stream_player(node, line_text_change_rejected_player, &"text_change_rejected", _line_event_play_stream)
|
||||
elif node is ItemList:
|
||||
_connect_stream_player(node, item_list_activated_player, &"item_activated", _item_list_play_stream)
|
||||
_connect_stream_player(node, item_list_selected_player, &"item_selected", _item_list_play_stream)
|
||||
elif node is Tree:
|
||||
_connect_stream_player(node, tree_item_activated_player, &"item_activated", _play_stream)
|
||||
_connect_stream_player(node, tree_item_selected_player, &"item_selected", _play_stream)
|
||||
_connect_stream_player(node, tree_button_clicked_player, &"button_clicked", _tree_button_clicked_play_stream)
|
||||
|
||||
func _recursive_connect_ui_sounds(current_node: Node, current_depth : int = 0) -> void:
|
||||
if current_depth >= MAX_DEPTH:
|
||||
return
|
||||
for node in current_node.get_children():
|
||||
connect_ui_sounds(node)
|
||||
_recursive_connect_ui_sounds(node, current_depth + 1)
|
||||
|
||||
func _ready() -> void:
|
||||
_build_all_stream_players()
|
||||
_recursive_connect_ui_sounds(root_node)
|
||||
persistent = persistent
|
||||
|
||||
func _exit_tree() -> void:
|
||||
var tree_node = get_tree()
|
||||
if tree_node.node_added.is_connected(connect_ui_sounds):
|
||||
tree_node.node_added.disconnect(connect_ui_sounds)
|
||||
@@ -0,0 +1 @@
|
||||
uid://b5oej1q4h7jvh
|
||||
Reference in New Issue
Block a user