Add health bar to remote players

This commit is contained in:
Sofia 2026-07-24 22:31:11 +03:00
parent 4a443b8075
commit 9535227e6f
3 changed files with 104 additions and 2 deletions

View File

@ -5,7 +5,34 @@
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1cgct"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1cgct"]
[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "collider", "effects", "spectator_camera", "camera_origin", "name_label")] [sub_resource type="ViewportTexture" id="ViewportTexture_1cgct"]
viewport_path = NodePath("health_bar_sprite/health_bar_viewport")
[sub_resource type="Curve" id="Curve_yli5f"]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_3g557"]
width = 70
curve = SubResource("Curve_yli5f")
[sub_resource type="Curve" id="Curve_dmbod"]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_1cgct"]
width = 70
curve = SubResource("Curve_dmbod")
[sub_resource type="Curve" id="Curve_qn18y"]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_840kl"]
width = 70
curve = SubResource("Curve_qn18y")
[node name="player" type="RemotePlayer" unique_id=845968872 node_paths=PackedStringArray("soldier_mesh", "collider", "effects", "spectator_camera", "camera_origin", "name_label", "health_bar", "health_bar_sprite")]
move_speed = 5.0 move_speed = 5.0
soldier_mesh = NodePath("soldier_m") soldier_mesh = NodePath("soldier_m")
collider = NodePath("collision_shape_3d") collider = NodePath("collision_shape_3d")
@ -14,6 +41,8 @@ health = 100
spectator_camera = NodePath("spectate_root/spectate_camera") spectator_camera = NodePath("spectate_root/spectate_camera")
camera_origin = NodePath("camera_origin") camera_origin = NodePath("camera_origin")
name_label = NodePath("name_label") name_label = NodePath("name_label")
health_bar = NodePath("health_bar_sprite/health_bar_viewport/health_bar")
health_bar_sprite = NodePath("health_bar_sprite")
collision_layer = 2 collision_layer = 2
collision_mask = 4 collision_mask = 4
@ -42,3 +71,27 @@ pixel_size = 0.002
billboard = 1 billboard = 1
text = "asd" text = "asd"
font_size = 64 font_size = 64
[node name="health_bar_sprite" type="Sprite3D" parent="." unique_id=1478315510]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.1606798, 0)
billboard = 1
texture = SubResource("ViewportTexture_1cgct")
[node name="health_bar_viewport" type="SubViewport" parent="health_bar_sprite" unique_id=1819065918]
disable_3d = true
transparent_bg = true
size = Vector2i(70, 10)
size_2d_override = Vector2i(70, 10)
size_2d_override_stretch = true
[node name="health_bar" type="TextureProgressBar" parent="health_bar_sprite/health_bar_viewport" unique_id=121411216]
offset_right = 70.0
offset_bottom = 1.0
scale = Vector2(1, 5)
value = 100.0
texture_under = SubResource("CurveTexture_3g557")
texture_over = SubResource("CurveTexture_1cgct")
texture_progress = SubResource("CurveTexture_840kl")
tint_under = Color(0, 0, 0, 0.3647059)
tint_over = Color(1, 1, 1, 0)
tint_progress = Color(0.5660922, 1.7688051e-06, 3.3691526e-07, 1)

View File

@ -0,0 +1,37 @@
[gd_scene format=3 uid="uid://bxudpgjj5q0o2"]
[sub_resource type="Curve" id="Curve_yli5f"]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_3g557"]
width = 70
curve = SubResource("Curve_yli5f")
[sub_resource type="Curve" id="Curve_dmbod"]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_1cgct"]
width = 70
curve = SubResource("Curve_dmbod")
[sub_resource type="Curve" id="Curve_qn18y"]
_data = [Vector2(0, 1), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_840kl"]
width = 70
curve = SubResource("Curve_qn18y")
[node name="texture_progress_bar" type="TextureProgressBar" unique_id=121411216]
offset_right = 70.0
offset_bottom = 1.0
scale = Vector2(1, 5)
value = 50.0
texture_under = SubResource("CurveTexture_3g557")
texture_over = SubResource("CurveTexture_1cgct")
texture_progress = SubResource("CurveTexture_840kl")
tint_under = Color(0, 0, 0, 0.3647059)
tint_over = Color(1, 1, 1, 0)
tint_progress = Color(0.5660922, 1.7688051e-06, 3.3691526e-07, 1)

View File

@ -3,7 +3,8 @@ use std::{f32::consts::PI, ops::Neg};
use godot::{ use godot::{
classes::{ classes::{
Button, Camera3D, CharacterBody3D, CollisionShape3D, ICharacterBody3D, Input, InputEvent, Button, Camera3D, CharacterBody3D, CollisionShape3D, ICharacterBody3D, Input, InputEvent,
InputEventMouseMotion, Label, Label3D, Panel, PanelContainer, input::MouseMode, InputEventMouseMotion, Label, Label3D, Panel, PanelContainer, Sprite3D, TextureProgressBar,
input::MouseMode,
}, },
obj::WithBaseField, obj::WithBaseField,
prelude::*, prelude::*,
@ -789,6 +790,10 @@ pub struct RemotePlayer {
camera_origin: Option<Gd<Node3D>>, camera_origin: Option<Gd<Node3D>>,
#[export] #[export]
name_label: Option<Gd<Label3D>>, name_label: Option<Gd<Label3D>>,
#[export]
health_bar: Option<Gd<TextureProgressBar>>,
#[export]
health_bar_sprite: Option<Gd<Sprite3D>>,
pub player_id: Option<u16>, pub player_id: Option<u16>,
@ -899,6 +904,10 @@ impl IPlayer for RemotePlayer {
s.kill(source); s.kill(source);
} }
} }
if let Some(health_bar) = &mut s.health_bar {
let value = (s.health as f64 / 100.).clamp(0., 1.) * 100.;
health_bar.set_value(value);
}
}); });
} }
@ -927,6 +936,9 @@ impl IPlayer for RemotePlayer {
if let Some(mut name) = self.name_label.take() { if let Some(mut name) = self.name_label.take() {
name.queue_free(); name.queue_free();
} }
if let Some(healthbar_sprit) = &mut self.health_bar_sprite {
healthbar_sprit.set_visible(false);
}
self.is_dead = true; self.is_dead = true;
} }