From 5878a2efd5f7729f4485f04a8a1fbc1d593380c9 Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Tue, 19 Nov 2024 11:51:05 -0700 Subject: [PATCH] Players have separate HUDs --- .../scenery/beach/sailboat/Sailboat.tres | 2 +- src/player/shot_setup/shot_setup.gd | 15 ++-- src/ui/shot_hud/shot_hud.gd | 24 +++---- src/ui/shot_hud/shot_hud.tscn | 72 ++++++++++++++----- src/ui/world_ui.gd | 6 +- src/world/play_manager/round_robin_manager.gd | 1 - src/world/world.tscn | 10 ++- 7 files changed, 84 insertions(+), 46 deletions(-) diff --git a/assets/models/scenery/beach/sailboat/Sailboat.tres b/assets/models/scenery/beach/sailboat/Sailboat.tres index 0fc70b0..9ce3a7b 100644 --- a/assets/models/scenery/beach/sailboat/Sailboat.tres +++ b/assets/models/scenery/beach/sailboat/Sailboat.tres @@ -6,5 +6,5 @@ resource_name = "Sailboat" cull_mode = 2 albedo_texture = ExtResource("1_k68kk") -roughness = 0.5 +roughness = 0.43 texture_filter = 2 diff --git a/src/player/shot_setup/shot_setup.gd b/src/player/shot_setup/shot_setup.gd index b60c903..bc87e2d 100644 --- a/src/player/shot_setup/shot_setup.gd +++ b/src/player/shot_setup/shot_setup.gd @@ -79,9 +79,7 @@ var phase: Phase = Phase.FINISHED: _on_phase_change(value) phase = value -var hud: ShotHUD: - get: - return world.ui.shot_hud if world and world.ui else null +var hud: ShotHUD var club: Club.Type: set(value): @@ -155,13 +153,11 @@ var _tracking_camera: OrbitalCamera static var scene := preload("res://src/player/shot_setup/shot_setup.tscn") -func _init_deferred() -> void: - # Set up HUD - club = initial_club - - func _ready() -> void: - _init_deferred.call_deferred() + # Create & set up HUD + hud = ShotHUD.create(player) + world.ui.add_player_hud(hud) + club = initial_club func _set_camera_distance(value: float) -> void: @@ -356,7 +352,6 @@ func _on_phase_change(new_phase: Phase) -> void: print_debug("Player ", player.name, ": change to ", Phase.keys()[new_phase]) match new_phase: Phase.AIM: - hud.set_state_for_player(player) hud.show_hud() if not arrow.visible: arrow_animation.play("show") diff --git a/src/ui/shot_hud/shot_hud.gd b/src/ui/shot_hud/shot_hud.gd index fb77e21..028a1a4 100644 --- a/src/ui/shot_hud/shot_hud.gd +++ b/src/ui/shot_hud/shot_hud.gd @@ -6,7 +6,7 @@ const LIFE_BAR_DAMAGE_RUMBLE_SCALE := 0.2 ## Time it takes to dampen the life bar rumble on taking damage, in seconds const LIFE_BAR_DAMAGE_RUMBLE_TIME := 0.2 -var _life_signal: Signal +var player: WorldPlayer @onready var power_bar: TextureProgressBar = %PowerBar @onready var curve_bar: ProgressBar = %CurveBar @@ -28,23 +28,16 @@ var _life_signal: Signal @onready var _state: AnimationNodeStateMachinePlayback = hud_state_machine["parameters/playback"] +static var scene: PackedScene = preload("res://src/ui/shot_hud/shot_hud.tscn") -## Set any HUD state specific to the player. -func set_state_for_player(player: WorldPlayer) -> void: - print_debug("Setting HUD for player ", player.name) + +func _ready() -> void: club_selector.set_state_for_player(player) _player_name.text = player.name - # TODO animate on life loss? life_bar.value = player.life life_bar.tint_progress = player.color - # TODO this is soooooo wack... - # TODO we should just revert to having distinct ShotHUDs for each player - if _life_signal and _life_signal.is_connected(set_life_value): - _life_signal.disconnect(set_life_value) - _life_signal = player.on_life_changed - _life_signal.connect(set_life_value) - + player.on_life_changed.connect(set_life_value) # TODO special equipment # TODO abilities @@ -108,3 +101,10 @@ func set_life_value(new_value: float) -> void: # TODO: something for this? pass life_bar.value = new_value + + +static func create(player: WorldPlayer) -> ShotHUD: + var instance: ShotHUD = scene.instantiate() + instance.player = player + + return instance diff --git a/src/ui/shot_hud/shot_hud.tscn b/src/ui/shot_hud/shot_hud.tscn index 0c19b9e..293d80c 100644 --- a/src/ui/shot_hud/shot_hud.tscn +++ b/src/ui/shot_hud/shot_hud.tscn @@ -390,6 +390,18 @@ tracks/0/keys = { "update": 0, "values": [0.0] } +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SouthWest:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 982)] +} [sub_resource type="Animation" id="Animation_dt1yq"] resource_name = "hide" @@ -407,6 +419,18 @@ tracks/0/keys = { "update": 0, "values": [0.0, 0.0872665, -1.5708] } +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SouthWest:position") +tracks/1/interp = 2 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.4), +"transitions": PackedFloat32Array(1.618, 1.618, 1), +"update": 0, +"values": [Vector2(0, 982), Vector2(0, 960), Vector2(0, 1100)] +} [sub_resource type="Animation" id="Animation_0maif"] resource_name = "show" @@ -424,6 +448,18 @@ tracks/0/keys = { "update": 0, "values": [-1.5708, 0.0872665, 0.0] } +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("SouthWest:position") +tracks/1/interp = 2 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.34, 0.4), +"transitions": PackedFloat32Array(1.618, 1.618, 1), +"update": 0, +"values": [Vector2(0, 1100), Vector2(0, 960), Vector2(0, 982)] +} [sub_resource type="AnimationLibrary" id="AnimationLibrary_c3i4w"] _data = { @@ -438,21 +474,21 @@ animation = &"hide" [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_v05eu"] animation = &"show" -[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_28a4x"] -advance_mode = 2 - [sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_bj7v0"] switch_mode = 2 [sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_xpwgd"] switch_mode = 2 +[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_3o88y"] +advance_mode = 2 + [sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_osrbp"] states/hidden/node = SubResource("AnimationNodeAnimation_8uxnp") -states/hidden/position = Vector2(592, 100) +states/hidden/position = Vector2(378, 100) states/visible/node = SubResource("AnimationNodeAnimation_v05eu") -states/visible/position = Vector2(364, 100) -transitions = ["Start", "visible", SubResource("AnimationNodeStateMachineTransition_28a4x"), "visible", "hidden", SubResource("AnimationNodeStateMachineTransition_bj7v0"), "hidden", "visible", SubResource("AnimationNodeStateMachineTransition_xpwgd")] +states/visible/position = Vector2(597, 100) +transitions = ["visible", "hidden", SubResource("AnimationNodeStateMachineTransition_bj7v0"), "hidden", "visible", SubResource("AnimationNodeStateMachineTransition_xpwgd"), "Start", "hidden", SubResource("AnimationNodeStateMachineTransition_3o88y")] graph_offset = Vector2(-309, -132) [node name="ShotHUD" type="Control"] @@ -650,24 +686,13 @@ grow_horizontal = 1 grow_vertical = 1 pivot_offset = Vector2(-400, 0) -[node name="HUDAnimation" type="AnimationPlayer" parent="."] -libraries = { -"": SubResource("AnimationLibrary_c3i4w") -} - -[node name="HUDStateMachine" type="AnimationTree" parent="."] -unique_name_in_owner = true -root_node = NodePath("%HUDStateMachine/..") -tree_root = SubResource("AnimationNodeStateMachine_osrbp") -anim_player = NodePath("../HUDAnimation") - [node name="SouthWest" type="MarginContainer" parent="."] layout_mode = 1 anchors_preset = -1 anchor_top = 1.0 anchor_right = 0.333 anchor_bottom = 1.0 -offset_top = -40.0 +offset_top = -98.0 offset_right = 40.0 grow_vertical = 0 theme_override_constants/margin_left = 16 @@ -709,3 +734,14 @@ script = ExtResource("3_6groq") [node name="LifeBar" parent="SouthWest/VBoxContainer/MarginContainer/LifeBarRumbler" instance=ExtResource("9_w1fiw")] unique_name_in_owner = true layout_mode = 1 + +[node name="HUDAnimation" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_c3i4w") +} + +[node name="HUDStateMachine" type="AnimationTree" parent="."] +unique_name_in_owner = true +root_node = NodePath("%HUDStateMachine/..") +tree_root = SubResource("AnimationNodeStateMachine_osrbp") +anim_player = NodePath("../HUDAnimation") diff --git a/src/ui/world_ui.gd b/src/ui/world_ui.gd index 6f4f80e..8155e76 100644 --- a/src/ui/world_ui.gd +++ b/src/ui/world_ui.gd @@ -1,4 +1,8 @@ class_name WorldUI extends Control ## Container & accessor for the world UI. -@onready var shot_hud: ShotHUD = %ShotHUD +@onready var hud_container: Control = %HUDContainer + + +func add_player_hud(hud: ShotHUD) -> void: + hud_container.add_child(hud) diff --git a/src/world/play_manager/round_robin_manager.gd b/src/world/play_manager/round_robin_manager.gd index fafd5f5..7a224b4 100644 --- a/src/world/play_manager/round_robin_manager.gd +++ b/src/world/play_manager/round_robin_manager.gd @@ -3,7 +3,6 @@ class_name RoundRobinManager extends PlayManager func on_initialization() -> void: - print("IN ON_INITIALIZATION") # Set first player as active players[0].shot_setup.phase = ShotSetup.Phase.AIM diff --git a/src/world/world.tscn b/src/world/world.tscn index 4c94106..08f5c93 100644 --- a/src/world/world.tscn +++ b/src/world/world.tscn @@ -1,8 +1,7 @@ -[gd_scene load_steps=9 format=3 uid="uid://cwnwcd8kushl3"] +[gd_scene load_steps=8 format=3 uid="uid://cwnwcd8kushl3"] [ext_resource type="Script" path="res://src/world/world.gd" id="1_ybjyx"] [ext_resource type="PackedScene" uid="uid://bm2o3mex10v11" path="res://levels/debug_level/debug_level.tscn" id="2_0xu5a"] -[ext_resource type="PackedScene" uid="uid://c4ifdiohng830" path="res://src/ui/shot_hud/shot_hud.tscn" id="2_5b7qb"] [ext_resource type="Script" path="res://src/player/world_player.gd" id="2_e743i"] [ext_resource type="Script" path="res://src/ui/world_ui.gd" id="2_imewa"] [ext_resource type="Resource" uid="uid://crock3revdn73" path="res://src/player/debug_player.tres" id="3_pyw81"] @@ -31,6 +30,11 @@ grow_vertical = 2 mouse_filter = 1 script = ExtResource("2_imewa") -[node name="ShotHUD" parent="UI" instance=ExtResource("2_5b7qb")] +[node name="HUDContainer" type="Control" parent="UI"] unique_name_in_owner = true layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2