feat(*): Style the results screen and dock the heading tape under the scoreboard

This commit is contained in:
Josh Creek
2026-07-28 19:32:40 +01:00
parent a9b7b450d5
commit 09ea8d6fbc
2 changed files with 56 additions and 8 deletions
+26 -6
View File
@@ -1,4 +1,4 @@
[gd_scene load_steps=8 format=3 uid="uid://c8kak2l3m4n5"]
[gd_scene load_steps=9 format=3 uid="uid://c8kak2l3m4n5"]
[ext_resource type="Script" uid="uid://du7y176h5aaq4" path="res://scripts/HUDController.gd" id="1_hud_controller"]
[ext_resource type="Script" path="res://scripts/hud_attitude_indicator.gd" id="2_adi"]
@@ -22,6 +22,22 @@ content_margin_top = 8.0
content_margin_right = 20.0
content_margin_bottom = 8.0
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_result"]
bg_color = Color(0.05, 0.06, 0.09, 0.85)
border_width_left = 3
border_width_top = 3
border_width_right = 3
border_width_bottom = 3
border_color = Color(1, 1, 1, 0.2)
corner_radius_top_left = 20
corner_radius_top_right = 20
corner_radius_bottom_right = 20
corner_radius_bottom_left = 20
content_margin_left = 48.0
content_margin_top = 32.0
content_margin_right = 48.0
content_margin_bottom = 32.0
[node name="HUD" type="CanvasLayer"]
process_mode = 3
script = ExtResource("1_hud_controller")
@@ -134,19 +150,23 @@ anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="VBox" type="VBoxContainer" parent="Control/ResultOverlay/Center"]
[node name="ResultPanel" type="PanelContainer" parent="Control/ResultOverlay/Center"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxFlat_result")
[node name="VBox" type="VBoxContainer" parent="Control/ResultOverlay/Center/ResultPanel"]
layout_mode = 2
theme_override_constants/separation = 16
[node name="ResultLabel" type="Label" parent="Control/ResultOverlay/Center/VBox"]
[node name="ResultLabel" type="Label" parent="Control/ResultOverlay/Center/ResultPanel/VBox"]
layout_mode = 2
theme_override_font_sizes/font_size = 56
theme_override_font_sizes/font_size = 64
text = "Draw"
horizontal_alignment = 1
[node name="FinalScoreLabel" type="Label" parent="Control/ResultOverlay/Center/VBox"]
[node name="FinalScoreLabel" type="Label" parent="Control/ResultOverlay/Center/ResultPanel/VBox"]
layout_mode = 2
theme_override_font_sizes/font_size = 36
theme_override_font_sizes/font_size = 44
text = "0 - 0"
horizontal_alignment = 1
+30 -2
View File
@@ -13,8 +13,9 @@ class_name HUDController
@onready var team1_name_label = get_node_or_null("Control/ScoreboardPanel/ScoreRow/Team1Name")
@onready var kickoff_label = get_node_or_null("Control/KickoffLabel")
@onready var result_overlay = get_node_or_null("Control/ResultOverlay")
@onready var result_label = get_node_or_null("Control/ResultOverlay/Center/VBox/ResultLabel")
@onready var final_score_label = get_node_or_null("Control/ResultOverlay/Center/VBox/FinalScoreLabel")
@onready var result_panel = get_node_or_null("Control/ResultOverlay/Center/ResultPanel")
@onready var result_label = get_node_or_null("Control/ResultOverlay/Center/ResultPanel/VBox/ResultLabel")
@onready var final_score_label = get_node_or_null("Control/ResultOverlay/Center/ResultPanel/VBox/FinalScoreLabel")
@onready var heading_tape: HudHeadingTape = get_node_or_null("Control/Instruments/HeadingTape")
@onready var attitude_indicator: HudAttitudeIndicator = get_node_or_null("Control/Instruments/Cluster/Dials/AttitudeIndicator")
@@ -166,8 +167,35 @@ func _on_match_ended(winning_team: int, score: Dictionary):
if winning_team < 0:
result_label.text = "Draw"
result_label.remove_theme_color_override("font_color")
_set_result_panel_accent(Color(1, 1, 1, 0.2))
else:
result_label.text = "%s team wins!" % TEAM_NAMES[winning_team]
result_label.add_theme_color_override("font_color", TEAM_COLORS[winning_team])
_set_result_panel_accent(TEAM_COLORS[winning_team])
final_score_label.text = "%d - %d" % [score.get(0, 0), score.get(1, 0)]
result_overlay.visible = true
_animate_result_panel_in()
# Tints the result panel's border to match the winning team (neutral for a draw).
func _set_result_panel_accent(color: Color) -> void:
if not result_panel or not is_instance_valid(result_panel):
return
var style: StyleBoxFlat = result_panel.get_theme_stylebox("panel").duplicate()
style.border_color = color
result_panel.add_theme_stylebox_override("panel", style)
# Quick scale/fade pop so the results screen doesn't just snap into view.
func _animate_result_panel_in() -> void:
if not result_panel or not is_instance_valid(result_panel):
return
result_panel.scale = Vector2(0.85, 0.85)
result_panel.modulate.a = 0.0
# ResultOverlay was hidden since scene start, so ResultPanel's
# container-computed size isn't valid until the next layout pass.
await get_tree().process_frame
if not is_instance_valid(result_panel):
return
result_panel.pivot_offset = result_panel.size / 2.0
var tween := create_tween().set_parallel(true)
tween.tween_property(result_panel, "scale", Vector2.ONE, 0.25).set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT)
tween.tween_property(result_panel, "modulate:a", 1.0, 0.2)