fix: scale labels directly with centered pivot for reliable zoom animation

This commit is contained in:
Eric Smith 2026-05-20 21:55:35 -04:00
parent 932e7b660c
commit 6c955da9de
2 changed files with 45 additions and 21 deletions

View file

@ -1,7 +1,9 @@
extends Control 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 @onready var transition_overlay: ColorRect = %TransitionOverlay
@ -9,14 +11,20 @@ func _ready() -> void:
if not Engine.is_editor_hint(): if not Engine.is_editor_hint():
get_window().mode = Window.MODE_FULLSCREEN get_window().mode = Window.MODE_FULLSCREEN
# Initial state: hidden text container, black overlay # Start with text invisible and overlay black
text_container.modulate = Color(1, 1, 1, 0) logo.modulate = Color(1, 1, 1, 0)
text_container.scale = Vector2(0.05, 0.05)
transition_overlay.color = Color(0, 0, 0, 1) 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().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) # Fade overlay away (reveal splash on a clean background)
var reveal := create_tween() var reveal := create_tween()
@ -26,8 +34,9 @@ func _ready() -> void:
# Phase 1: Dramatic zoom in + fade in # Phase 1: Dramatic zoom in + fade in
var zoom_in := create_tween() var zoom_in := create_tween()
zoom_in.set_parallel(true) 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(logo, "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(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 await zoom_in.finished
# Phase 2: Hold # Phase 2: Hold
@ -35,7 +44,7 @@ func _ready() -> void:
# Phase 3: Fade out # Phase 3: Fade out
var fade_out := create_tween() 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 await fade_out.finished
# Phase 4: Crossfade to dashboard # Phase 4: Crossfade to dashboard

View file

@ -30,22 +30,25 @@ anchor_bottom = 1.0
mouse_filter = 2 mouse_filter = 2
color = Color(0.08, 0.08, 0.12, 1.0) 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 anchors_preset = 15
anchor_right = 1.0 anchor_right = 1.0
anchor_bottom = 1.0 anchor_bottom = 1.0
mouse_filter = 2 mouse_filter = 2
[node name="TextContainer" type="VBoxContainer" parent="Center"] [node name="VLabel" type="Label" parent="Logo"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 1
size_flags_horizontal = 4 anchors_preset = 8
size_flags_vertical = 4 anchor_left = 0.5
theme_override_constants/separation = 0 anchor_top = 0.5
anchor_right = 0.5
[node name="VLabel" type="Label" parent="Center/TextContainer"] anchor_bottom = 0.5
unique_name_in_owner = true offset_left = -300.0
layout_mode = 2 offset_top = -260.0
offset_right = 300.0
offset_bottom = 0.0
theme_override_fonts/normal_font = SubResource("FontVariation_ijphb") theme_override_fonts/normal_font = SubResource("FontVariation_ijphb")
theme_override_font_sizes/normal_font_size = 256 theme_override_font_sizes/normal_font_size = 256
theme_override_colors/font_color = Color(0.933, 0.271, 0.376, 1.0) 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) theme_override_colors/font_outline_color = Color(0.0, 0.0, 0.0, 0.6)
text = "V" text = "V"
horizontal_alignment = 1 horizontal_alignment = 1
vertical_alignment = 1
[node name="PanelLabel" type="Label" parent="Center/TextContainer"] [node name="PanelLabel" type="Label" parent="Logo"]
layout_mode = 2 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_fonts/normal_font = SubResource("FontVariation_boeqg")
theme_override_font_sizes/normal_font_size = 144 theme_override_font_sizes/normal_font_size = 144
theme_override_colors/font_color = Color(0.7, 0.7, 0.8, 1.0) 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) theme_override_colors/font_outline_color = Color(0.0, 0.0, 0.0, 0.5)
text = "Panel" text = "Panel"
horizontal_alignment = 1 horizontal_alignment = 1
vertical_alignment = 1
[node name="TransitionOverlay" type="ColorRect" parent="."] [node name="TransitionOverlay" type="ColorRect" parent="."]
unique_name_in_owner = true unique_name_in_owner = true