From 6c955da9de02e988b5f7ef5fd9cf8ef8da84026d Mon Sep 17 00:00:00 2001 From: Eric Smith <5d@fifthdread.com> Date: Wed, 20 May 2026 21:55:35 -0400 Subject: [PATCH] fix: scale labels directly with centered pivot for reliable zoom animation --- scenes/splash.gd | 27 ++++++++++++++++++--------- scenes/splash.tscn | 39 +++++++++++++++++++++++++++------------ 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/scenes/splash.gd b/scenes/splash.gd index c520af1..3d21650 100644 --- a/scenes/splash.gd +++ b/scenes/splash.gd @@ -1,7 +1,9 @@ extends Control -@onready var text_container: VBoxContainer = %TextContainer +@onready var logo: Control = %Logo +@onready var v_label: Label = %VLabel +@onready var panel_label: Label = %PanelLabel @onready var transition_overlay: ColorRect = %TransitionOverlay @@ -9,14 +11,20 @@ func _ready() -> void: if not Engine.is_editor_hint(): get_window().mode = Window.MODE_FULLSCREEN - # Initial state: hidden text container, black overlay - text_container.modulate = Color(1, 1, 1, 0) - text_container.scale = Vector2(0.05, 0.05) + # Start with text invisible and overlay black + logo.modulate = Color(1, 1, 1, 0) transition_overlay.color = Color(0, 0, 0, 1) - # Let the layout settle + # Wait one frame for layout to resolve await get_tree().process_frame - await get_tree().create_timer(0.2).timeout + + # Set pivot to center of each label so scale is centered + v_label.pivot_offset = v_label.size * 0.5 + panel_label.pivot_offset = panel_label.size * 0.5 + + # Set initial tiny scale — done after layout so pivot_offset is valid + v_label.scale = Vector2(0.05, 0.05) + panel_label.scale = Vector2(0.05, 0.05) # Fade overlay away (reveal splash on a clean background) var reveal := create_tween() @@ -26,8 +34,9 @@ func _ready() -> void: # Phase 1: Dramatic zoom in + fade in var zoom_in := create_tween() zoom_in.set_parallel(true) - zoom_in.tween_property(text_container, "modulate", Color(1, 1, 1, 1), 1.8).set_ease(Tween.EASE_OUT) - zoom_in.tween_property(text_container, "scale", Vector2(1.0, 1.0), 2.0).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) + zoom_in.tween_property(logo, "modulate", Color(1, 1, 1, 1), 1.8).set_ease(Tween.EASE_OUT) + zoom_in.tween_property(v_label, "scale", Vector2(1.0, 1.0), 2.0).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) + zoom_in.tween_property(panel_label, "scale", Vector2(1.0, 1.0), 2.0).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) await zoom_in.finished # Phase 2: Hold @@ -35,7 +44,7 @@ func _ready() -> void: # Phase 3: Fade out var fade_out := create_tween() - fade_out.tween_property(text_container, "modulate", Color(1, 1, 1, 0), 0.8).set_ease(Tween.EASE_IN) + fade_out.tween_property(logo, "modulate", Color(1, 1, 1, 0), 0.8).set_ease(Tween.EASE_IN) await fade_out.finished # Phase 4: Crossfade to dashboard diff --git a/scenes/splash.tscn b/scenes/splash.tscn index b80a06d..9d2a8a6 100644 --- a/scenes/splash.tscn +++ b/scenes/splash.tscn @@ -30,22 +30,25 @@ anchor_bottom = 1.0 mouse_filter = 2 color = Color(0.08, 0.08, 0.12, 1.0) -[node name="Center" type="CenterContainer" parent="."] +[node name="Logo" type="Control" parent="."] +unique_name_in_owner = true anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 mouse_filter = 2 -[node name="TextContainer" type="VBoxContainer" parent="Center"] +[node name="VLabel" type="Label" parent="Logo"] unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 4 -size_flags_vertical = 4 -theme_override_constants/separation = 0 - -[node name="VLabel" type="Label" parent="Center/TextContainer"] -unique_name_in_owner = true -layout_mode = 2 +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -300.0 +offset_top = -260.0 +offset_right = 300.0 +offset_bottom = 0.0 theme_override_fonts/normal_font = SubResource("FontVariation_ijphb") theme_override_font_sizes/normal_font_size = 256 theme_override_colors/font_color = Color(0.933, 0.271, 0.376, 1.0) @@ -53,9 +56,20 @@ theme_override_constants/outline_size = 6 theme_override_colors/font_outline_color = Color(0.0, 0.0, 0.0, 0.6) text = "V" horizontal_alignment = 1 +vertical_alignment = 1 -[node name="PanelLabel" type="Label" parent="Center/TextContainer"] -layout_mode = 2 +[node name="PanelLabel" type="Label" parent="Logo"] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -300.0 +offset_top = 0.0 +offset_right = 300.0 +offset_bottom = 220.0 theme_override_fonts/normal_font = SubResource("FontVariation_boeqg") theme_override_font_sizes/normal_font_size = 144 theme_override_colors/font_color = Color(0.7, 0.7, 0.8, 1.0) @@ -63,6 +77,7 @@ theme_override_constants/outline_size = 4 theme_override_colors/font_outline_color = Color(0.0, 0.0, 0.0, 0.5) text = "Panel" horizontal_alignment = 1 +vertical_alignment = 1 [node name="TransitionOverlay" type="ColorRect" parent="."] unique_name_in_owner = true