fix: splash zoom via Node2D scale + proportional font sizes

This commit is contained in:
Eric Smith 2026-05-20 22:10:26 -04:00
parent bdddeeaf66
commit 9874d29cd8
2 changed files with 44 additions and 30 deletions

View file

@ -1,47 +1,61 @@
extends Control
@onready var vbox: VBoxContainer = %VBox
@onready var zoom_node: Node2D = %ZoomNode
@onready var wrapper: Control = %Wrapper
@onready var v_label: Label = %VLabel
@onready var panel_label: Label = %PanelLabel
@onready var transition_overlay: ColorRect = %TransitionOverlay
const V_START_SIZE: int = 48
const V_END_SIZE: int = 512
const P_START_SIZE: int = 28
const P_END_SIZE: int = 288
func _ready() -> void:
if not Engine.is_editor_hint():
get_window().mode = Window.MODE_FULLSCREEN
# Start invisible and at tiny font size
vbox.modulate = Color(1, 1, 1, 0)
v_label.add_theme_font_size_override("normal_font_size", V_START_SIZE)
panel_label.add_theme_font_size_override("normal_font_size", P_START_SIZE)
var screen_size: Vector2 = get_viewport_rect().size
# Position Node2D at screen center — its transform (scale) will
# zoom everything from this point, giving a proper zoom-in effect.
zoom_node.position = screen_size * 0.5
# Size wrapper to cover the screen, offset so its center aligns
# with the Node2D origin at screen center.
wrapper.size = screen_size
wrapper.position = -screen_size * 0.5
# Set font sizes proportional to viewport height so they look
# consistently large at any resolution.
var v_size: int = maxi(1, int(screen_size.y * 0.42))
var p_size: int = maxi(1, int(screen_size.y * 0.22))
v_label.add_theme_font_size_override("normal_font_size", v_size)
panel_label.add_theme_font_size_override("normal_font_size", p_size)
# Initial state: tiny + invisible inside the zoom node
zoom_node.scale = Vector2(0.01, 0.01)
zoom_node.modulate = Color(1, 1, 1, 0)
transition_overlay.color = Color(0, 0, 0, 1)
await get_tree().process_frame
# Fade overlay away
# Fade overlay away (reveal clean background)
var reveal := create_tween()
reveal.tween_property(transition_overlay, "color", Color(0, 0, 0, 0), 0.4)
await reveal.finished
# Phase 1: Grow font sizes + fade in (parallel)
var grow := create_tween()
grow.set_parallel(true)
grow.tween_method(_set_sizes, 0.0, 1.0, 2.0).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK)
grow.tween_property(vbox, "modulate", Color(1, 1, 1, 1), 1.8).set_ease(Tween.EASE_OUT)
await grow.finished
# Phase 1: Zoom in + fade in (parallel)
# Node2D scale produces a true zoom, not just font-size growth.
var zoom_in := create_tween()
zoom_in.set_parallel(true)
zoom_in.tween_property(zoom_node, "scale", Vector2(1.0, 1.0), 2.0).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK)
zoom_in.tween_property(zoom_node, "modulate", Color(1, 1, 1, 1), 1.8).set_ease(Tween.EASE_OUT)
await zoom_in.finished
# Phase 2: Hold
await get_tree().create_timer(1.0).timeout
# Phase 3: Fade out
var fade_out := create_tween()
fade_out.tween_property(vbox, "modulate", Color(1, 1, 1, 0), 0.8).set_ease(Tween.EASE_IN)
fade_out.tween_property(zoom_node, "modulate", Color(1, 1, 1, 0), 0.8).set_ease(Tween.EASE_IN)
await fade_out.finished
# Phase 4: Crossfade to dashboard
@ -59,10 +73,3 @@ func _ready() -> void:
remove_child(dashboard)
get_tree().root.add_child(dashboard)
queue_free()
func _set_sizes(progress: float) -> void:
var v_size: int = int(round(V_START_SIZE + progress * (V_END_SIZE - V_START_SIZE)))
var p_size: int = int(round(P_START_SIZE + progress * (P_END_SIZE - P_START_SIZE)))
v_label.add_theme_font_size_override("normal_font_size", v_size)
panel_label.add_theme_font_size_override("normal_font_size", p_size)

View file

@ -30,18 +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="ZoomNode" type="Node2D" parent="."]
unique_name_in_owner = true
[node name="Wrapper" type="Control" parent="ZoomNode"]
unique_name_in_owner = true
mouse_filter = 2
[node name="Center" type="CenterContainer" parent="ZoomNode/Wrapper"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
mouse_filter = 2
[node name="VBox" type="VBoxContainer" parent="Center"]
unique_name_in_owner = true
[node name="VBox" type="VBoxContainer" parent="ZoomNode/Wrapper/Center"]
layout_mode = 2
theme_override_constants/separation = 0
[node name="VLabel" type="Label" parent="Center/VBox"]
[node name="VLabel" type="Label" parent="ZoomNode/Wrapper/Center/VBox"]
unique_name_in_owner = true
layout_mode = 2
theme_override_fonts/normal_font = SubResource("FontVariation_ijphb")
@ -52,7 +59,7 @@ text = "V"
horizontal_alignment = 1
vertical_alignment = 1
[node name="PanelLabel" type="Label" parent="Center/VBox"]
[node name="PanelLabel" type="Label" parent="ZoomNode/Wrapper/Center/VBox"]
unique_name_in_owner = true
layout_mode = 2
theme_override_fonts/normal_font = SubResource("FontVariation_boeqg")