diff --git a/scenes/splash.gd b/scenes/splash.gd index ddfeab8..a7fab4a 100644 --- a/scenes/splash.gd +++ b/scenes/splash.gd @@ -1,11 +1,13 @@ extends Control -@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 +@onready var vbox: VBoxContainer = %VBox + +var _v_end_size: int +var _p_end_size: int func _ready() -> void: @@ -14,48 +16,37 @@ func _ready() -> void: 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 + # Enormous end font sizes — a large fraction of screen height. + _v_end_size = maxi(1, int(screen_size.y * 0.55)) + _p_end_size = maxi(1, int(screen_size.y * 0.30)) - # 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) + # Start tiny and invisible + v_label.add_theme_font_size_override("normal_font_size", 4) + panel_label.add_theme_font_size_override("normal_font_size", 4) + vbox.modulate = Color(1, 1, 1, 0) transition_overlay.color = Color(0, 0, 0, 1) await get_tree().process_frame - # Fade overlay away (reveal clean background) + # Reveal background var reveal := create_tween() reveal.tween_property(transition_overlay, "color", Color(0, 0, 0, 0), 0.4) await reveal.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 1: Grow font sizes + fade in (parallel) + # Pure font-size animation — no transforms, no containers to fight. + 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 2: Hold await get_tree().create_timer(1.0).timeout # Phase 3: Fade out var fade_out := create_tween() - fade_out.tween_property(zoom_node, "modulate", Color(1, 1, 1, 0), 0.8).set_ease(Tween.EASE_IN) + fade_out.tween_property(vbox, "modulate", Color(1, 1, 1, 0), 0.8).set_ease(Tween.EASE_IN) await fade_out.finished # Phase 4: Crossfade to dashboard @@ -73,3 +64,10 @@ func _ready() -> void: remove_child(dashboard) get_tree().root.add_child(dashboard) queue_free() + + +func _set_sizes(progress: float) -> void: + var v_size: int = maxi(1, int(round(4 + progress * (_v_end_size - 4)))) + var p_size: int = maxi(1, int(round(4 + progress * (_p_end_size - 4)))) + v_label.add_theme_font_size_override("normal_font_size", v_size) + panel_label.add_theme_font_size_override("normal_font_size", p_size) diff --git a/scenes/splash.tscn b/scenes/splash.tscn index 1d2f85c..129abc9 100644 --- a/scenes/splash.tscn +++ b/scenes/splash.tscn @@ -30,25 +30,18 @@ anchor_bottom = 1.0 mouse_filter = 2 color = Color(0.08, 0.08, 0.12, 1.0) -[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 +[node name="Center" type="CenterContainer" parent="."] anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 mouse_filter = 2 -[node name="VBox" type="VBoxContainer" parent="ZoomNode/Wrapper/Center"] +[node name="VBox" type="VBoxContainer" parent="Center"] +unique_name_in_owner = true layout_mode = 2 theme_override_constants/separation = 0 -[node name="VLabel" type="Label" parent="ZoomNode/Wrapper/Center/VBox"] +[node name="VLabel" type="Label" parent="Center/VBox"] unique_name_in_owner = true layout_mode = 2 theme_override_fonts/normal_font = SubResource("FontVariation_ijphb") @@ -59,7 +52,7 @@ text = "V" horizontal_alignment = 1 vertical_alignment = 1 -[node name="PanelLabel" type="Label" parent="ZoomNode/Wrapper/Center/VBox"] +[node name="PanelLabel" type="Label" parent="Center/VBox"] unique_name_in_owner = true layout_mode = 2 theme_override_fonts/normal_font = SubResource("FontVariation_boeqg")