Music to my ears.
This commit is contained in:
parent
884f49fed3
commit
1570f6986f
15 changed files with 168 additions and 25 deletions
46
addons/capri_tools/global_music_selector.gd
Normal file
46
addons/capri_tools/global_music_selector.gd
Normal file
|
@ -0,0 +1,46 @@
|
|||
extends EditorProperty
|
||||
|
||||
|
||||
var _dropdown_button := Button.new()
|
||||
|
||||
var _popup_menu := PopupMenu.new()
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
_dropdown_button.pressed.connect(_show_popup)
|
||||
_dropdown_button.icon = EditorInterface.get_editor_theme().get_icon("AudioStreamWAV", "EditorIcons")
|
||||
|
||||
_popup_menu.index_pressed.connect(_on_song_selected)
|
||||
|
||||
add_child(_dropdown_button)
|
||||
add_child(_popup_menu)
|
||||
add_focusable(_dropdown_button)
|
||||
|
||||
|
||||
func _update_property() -> void:
|
||||
var new_value: StringName = get_edited_object()[get_edited_property()]
|
||||
_dropdown_button.text = new_value.capitalize()
|
||||
|
||||
|
||||
func _show_popup() -> void:
|
||||
var songs = Music.songs.keys()
|
||||
|
||||
_popup_menu.clear()
|
||||
for sound: StringName in songs:
|
||||
_popup_menu.add_icon_item(
|
||||
EditorInterface.get_editor_theme().get_icon("AudioStreamWAV", "EditorIcons"),
|
||||
sound.capitalize()
|
||||
)
|
||||
|
||||
var button_rect = _dropdown_button.get_global_rect()
|
||||
_popup_menu.reset_size()
|
||||
var popup_pos = button_rect.position + Vector2(DisplayServer.window_get_position())
|
||||
_popup_menu.position = popup_pos
|
||||
_popup_menu.min_size.x = button_rect.size.x
|
||||
_popup_menu.popup()
|
||||
|
||||
|
||||
func _on_song_selected(index: int) -> void:
|
||||
var sound = Music.songs.keys()[index]
|
||||
_dropdown_button.grab_focus()
|
||||
emit_changed(get_edited_property(), sound)
|
1
addons/capri_tools/global_music_selector.gd.uid
Normal file
1
addons/capri_tools/global_music_selector.gd.uid
Normal file
|
@ -0,0 +1 @@
|
|||
uid://uc6u3ls6jx3y
|
|
@ -2,6 +2,7 @@ extends EditorInspectorPlugin
|
|||
|
||||
|
||||
const GlobalSoundSelector = preload("global_sound_selector.gd")
|
||||
const GlobalMusicSelector = preload("global_music_selector.gd")
|
||||
|
||||
|
||||
func _can_handle(object: Object) -> bool:
|
||||
|
@ -9,8 +10,11 @@ func _can_handle(object: Object) -> bool:
|
|||
|
||||
|
||||
func _parse_property(object: Object, type: Variant.Type, name: String, hint_type: PropertyHint, hint_string: String, usage_flags: int, wide: bool) -> bool:
|
||||
if type == TYPE_STRING_NAME and hint_string == "global_sound":
|
||||
add_property_editor(name, GlobalSoundSelector.new())
|
||||
return true
|
||||
else:
|
||||
return false
|
||||
if type == TYPE_STRING_NAME:
|
||||
if hint_string == "global_sound":
|
||||
add_property_editor(name, GlobalSoundSelector.new())
|
||||
return true
|
||||
if hint_string == "global_music":
|
||||
add_property_editor(name, GlobalMusicSelector.new())
|
||||
return true
|
||||
return false
|
||||
|
|
BIN
assets/music/bug_music.ogg
Normal file
BIN
assets/music/bug_music.ogg
Normal file
Binary file not shown.
19
assets/music/bug_music.ogg.import
Normal file
19
assets/music/bug_music.ogg.import
Normal file
|
@ -0,0 +1,19 @@
|
|||
[remap]
|
||||
|
||||
importer="oggvorbisstr"
|
||||
type="AudioStreamOggVorbis"
|
||||
uid="uid://dmctaba7v1rgu"
|
||||
path="res://.godot/imported/bug_music.ogg-4e14ca93037a40f8bd3b8d23ee565dcc.oggvorbisstr"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/music/bug_music.ogg"
|
||||
dest_files=["res://.godot/imported/bug_music.ogg-4e14ca93037a40f8bd3b8d23ee565dcc.oggvorbisstr"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=true
|
||||
loop_offset=28.0
|
||||
bpm=0.0
|
||||
beat_count=0
|
||||
bar_beats=4
|
|
@ -14,7 +14,6 @@ sounds = {
|
|||
[node name="SoggyAmbience" type="AudioStreamPlayer" parent="."]
|
||||
stream = ExtResource("2_3njyb")
|
||||
volume_db = -10.0
|
||||
autoplay = true
|
||||
bus = &"Background Sound"
|
||||
|
||||
[node name="WinSound" type="AudioStreamPlayer" parent="."]
|
||||
|
|
53
autoloads/music.gd
Normal file
53
autoloads/music.gd
Normal file
|
@ -0,0 +1,53 @@
|
|||
@tool
|
||||
extends Node
|
||||
|
||||
|
||||
@export_dir var songs_dir: String
|
||||
@export_tool_button("Update Songs") var _update_songs_action = _update_songs
|
||||
@export var songs: Dictionary[StringName, AudioStream]
|
||||
|
||||
@export var player_a: AudioStreamPlayer
|
||||
@export var player_b: AudioStreamPlayer
|
||||
|
||||
|
||||
@onready var _active_player: AudioStreamPlayer = player_a
|
||||
@onready var _tween: Tween = null
|
||||
|
||||
|
||||
func play_song(id: StringName, crossfade_time: float = 0.0, restart: bool = false) -> void:
|
||||
var new_stream = songs.get(id) as AudioStream
|
||||
if new_stream:
|
||||
if not restart and _active_player.stream == new_stream:
|
||||
return
|
||||
var new_player = player_b if _active_player == player_a else player_a
|
||||
new_player.stream = new_stream
|
||||
new_player.play()
|
||||
|
||||
if crossfade_time > 0.0:
|
||||
new_player.volume_linear = 0.0
|
||||
if _tween:
|
||||
_tween.kill()
|
||||
_tween = create_tween().set_parallel()
|
||||
_tween.tween_property(new_player, ^"volume_linear", 1.0, crossfade_time)
|
||||
_tween.tween_property(_active_player, ^"volume_linear", 0.0, crossfade_time)
|
||||
_tween.chain().tween_callback(_active_player.stop)
|
||||
else:
|
||||
new_player.volume_linear = 1.0
|
||||
_active_player.stop()
|
||||
|
||||
_active_player = new_player
|
||||
|
||||
|
||||
func _update_songs() -> void:
|
||||
songs.clear()
|
||||
var dir = DirAccess.open(songs_dir)
|
||||
if dir:
|
||||
dir.list_dir_begin()
|
||||
var file = dir.get_next()
|
||||
while file != "":
|
||||
if not dir.current_is_dir() and not file.ends_with(".import"):
|
||||
var stream := load(songs_dir + "/" + file) as AudioStream
|
||||
if stream:
|
||||
songs[file.get_basename()] = stream
|
||||
file = dir.get_next()
|
||||
notify_property_list_changed()
|
1
autoloads/music.gd.uid
Normal file
1
autoloads/music.gd.uid
Normal file
|
@ -0,0 +1 @@
|
|||
uid://dgi1v18r8dx4q
|
19
autoloads/music.tscn
Normal file
19
autoloads/music.tscn
Normal file
|
@ -0,0 +1,19 @@
|
|||
[gd_scene load_steps=3 format=3 uid="uid://cxrhw5ic2vunh"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dgi1v18r8dx4q" path="res://autoloads/music.gd" id="1_16wm1"]
|
||||
[ext_resource type="AudioStream" uid="uid://dmctaba7v1rgu" path="res://assets/music/bug_music.ogg" id="2_kl0u4"]
|
||||
|
||||
[node name="Music" type="Node" node_paths=PackedStringArray("player_a", "player_b")]
|
||||
script = ExtResource("1_16wm1")
|
||||
songs_dir = "res://assets/music"
|
||||
songs = Dictionary[StringName, AudioStream]({
|
||||
&"bug_music": ExtResource("2_kl0u4")
|
||||
})
|
||||
player_a = NodePath("MusicPlayerA")
|
||||
player_b = NodePath("MusicPlayerB")
|
||||
|
||||
[node name="MusicPlayerA" type="AudioStreamPlayer" parent="."]
|
||||
bus = &"Music"
|
||||
|
||||
[node name="MusicPlayerB" type="AudioStreamPlayer" parent="."]
|
||||
bus = &"Music"
|
|
@ -1,8 +1,6 @@
|
|||
[gd_scene load_steps=4 format=3 uid="uid://ckgsfhfpg00ys"]
|
||||
[gd_scene load_steps=2 format=3 uid="uid://ckgsfhfpg00ys"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://crlo6ow7fo6ca" path="res://autoloads/scene_manager.gd" id="1_1hxm1"]
|
||||
[ext_resource type="AudioStream" uid="uid://sci5aqar0oyx" path="res://assets/audio/bgs/amb_sog.wav" id="2_dr7pa"]
|
||||
[ext_resource type="AudioStream" uid="uid://flc817bekeh6" path="res://assets/audio/sfx/level_win.ogg" id="3_8ri5f"]
|
||||
|
||||
[node name="SceneManager" type="Node" node_paths=PackedStringArray("viewport", "viewport_holder")]
|
||||
script = ExtResource("1_1hxm1")
|
||||
|
@ -49,14 +47,3 @@ handle_input_locally = false
|
|||
canvas_item_default_texture_filter = 0
|
||||
size = Vector2i(288, 216)
|
||||
render_target_update_mode = 4
|
||||
|
||||
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."]
|
||||
stream = ExtResource("2_dr7pa")
|
||||
volume_db = -10.0
|
||||
autoplay = true
|
||||
bus = &"Background Sound"
|
||||
|
||||
[node name="WinSound" type="AudioStreamPlayer" parent="."]
|
||||
stream = ExtResource("3_8ri5f")
|
||||
volume_db = -6.558
|
||||
bus = &"Sound Effects"
|
||||
|
|
|
@ -10,23 +10,29 @@ spread = 0.3
|
|||
wet = 0.1
|
||||
|
||||
[resource]
|
||||
bus/1/name = &"Capri"
|
||||
bus/1/name = &"Music"
|
||||
bus/1/solo = false
|
||||
bus/1/mute = false
|
||||
bus/1/bypass_fx = false
|
||||
bus/1/volume_db = 0.0
|
||||
bus/1/send = &"Master"
|
||||
bus/1/effect/0/effect = SubResource("AudioEffectReverb_rn7sq")
|
||||
bus/1/effect/0/enabled = true
|
||||
bus/2/name = &"Background Sound"
|
||||
bus/2/name = &"Capri"
|
||||
bus/2/solo = false
|
||||
bus/2/mute = false
|
||||
bus/2/bypass_fx = false
|
||||
bus/2/volume_db = 0.0
|
||||
bus/2/send = &"Master"
|
||||
bus/3/name = &"Sound Effects"
|
||||
bus/2/effect/0/effect = SubResource("AudioEffectReverb_rn7sq")
|
||||
bus/2/effect/0/enabled = true
|
||||
bus/3/name = &"Background Sound"
|
||||
bus/3/solo = false
|
||||
bus/3/mute = false
|
||||
bus/3/bypass_fx = false
|
||||
bus/3/volume_db = 0.0
|
||||
bus/3/send = &"Master"
|
||||
bus/4/name = &"Sound Effects"
|
||||
bus/4/solo = false
|
||||
bus/4/mute = false
|
||||
bus/4/bypass_fx = false
|
||||
bus/4/volume_db = 0.0
|
||||
bus/4/send = &"Master"
|
||||
|
|
|
@ -21,6 +21,7 @@ shader_parameter/fps = 15.0
|
|||
script = ExtResource("1_8bygc")
|
||||
title = "Obligatory Tutorial Level"
|
||||
id = "tutorial"
|
||||
music = &"bug_music"
|
||||
|
||||
[node name="Sprite2D" type="Sprite2D" parent="."]
|
||||
material = SubResource("ShaderMaterial_sf5kh")
|
||||
|
|
|
@ -13,6 +13,7 @@ script = ExtResource("1_hcs1r")
|
|||
title = "Test Level Z"
|
||||
id = "z-level"
|
||||
order = 2
|
||||
music = &"bug_music"
|
||||
|
||||
[node name="Background" type="Sprite2D" parent="."]
|
||||
modulate = Color(0.996924, 0.421436, 0, 1)
|
||||
|
|
|
@ -20,6 +20,7 @@ config/icon="res://icon.svg"
|
|||
SceneManager="*res://autoloads/scene_manager.tscn"
|
||||
Levels="*res://autoloads/levels.tscn"
|
||||
GlobalSounds="*res://autoloads/global_sounds.tscn"
|
||||
Music="*res://autoloads/music.tscn"
|
||||
|
||||
[display]
|
||||
|
||||
|
|
|
@ -5,3 +5,8 @@ extends Node2D
|
|||
@export var title: String
|
||||
@export var id: String
|
||||
@export_range(0,1,1,"or_greater") var order: int
|
||||
@export_custom(0, "global_music") var music: StringName
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
Music.play_song(music)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue