basic healthbars for enemies
This commit is contained in:
@@ -5,7 +5,7 @@ using Movementtests.interfaces;
|
||||
[GlobalClass]
|
||||
public partial class CHealth : Node, IHealthable
|
||||
{
|
||||
public event Action<IHealthable, float> HealthChanged;
|
||||
public event Action<IHealthable, HealthChangedRecord> HealthChanged;
|
||||
public event Action<IHealthable> HealthDepleted;
|
||||
|
||||
[Export]
|
||||
@@ -18,15 +18,18 @@ public partial class CHealth : Node, IHealthable
|
||||
CurrentHealth = RHealth.StartingHealth;
|
||||
}
|
||||
|
||||
public void ReduceHealth(IDamageable source, DamageRecord damageRecord)
|
||||
public HealthChangedRecord ReduceHealth(IDamageable source, DamageRecord damageRecord)
|
||||
{
|
||||
var previousHealth = CurrentHealth;
|
||||
CurrentHealth -= damageRecord.Damage.DamageDealt;
|
||||
HealthChanged?.Invoke(this, CurrentHealth);
|
||||
var record = new HealthChangedRecord(CurrentHealth, previousHealth, RHealth.StartingHealth);
|
||||
HealthChanged?.Invoke(this, record);
|
||||
|
||||
if (CurrentHealth <= 0)
|
||||
{
|
||||
CurrentHealth = 0;
|
||||
HealthDepleted?.Invoke(this);
|
||||
}
|
||||
return record;
|
||||
}
|
||||
}
|
||||
|
||||
26
components/health/CHealthbar.cs
Normal file
26
components/health/CHealthbar.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using Godot;
|
||||
using System;
|
||||
using Movementtests.interfaces;
|
||||
|
||||
[GlobalClass]
|
||||
public partial class CHealthbar : Node3D
|
||||
{
|
||||
private Sprite3D _currentHealth;
|
||||
private float _initialXScale;
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
Visible = false;
|
||||
_currentHealth = GetNode<Sprite3D>("Health");
|
||||
_initialXScale = _currentHealth.Scale.X;
|
||||
}
|
||||
|
||||
public void OnHealthChanged(HealthChangedRecord healthChanged)
|
||||
{
|
||||
if (healthChanged.MaxHealth == 0) return;
|
||||
|
||||
Visible = true;
|
||||
var healthPercentage = healthChanged.CurrentHealth / healthChanged.MaxHealth;
|
||||
_currentHealth.Scale = new Vector3(_initialXScale * healthPercentage, _currentHealth.Scale.Y, _currentHealth.Scale.Z);
|
||||
}
|
||||
}
|
||||
1
components/health/CHealthbar.cs.uid
Normal file
1
components/health/CHealthbar.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dve6vg6yvg4y8
|
||||
27
components/health/CHealthbar.tscn
Normal file
27
components/health/CHealthbar.tscn
Normal file
@@ -0,0 +1,27 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://bwx2um43k0ou4"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://vpcxswwn1mt6" path="res://assets/ui/white-square-100px.png" id="1_jlvej"]
|
||||
[ext_resource type="Script" uid="uid://dve6vg6yvg4y8" path="res://components/health/CHealthbar.cs" id="1_w5itk"]
|
||||
|
||||
[node name="CHealthBar" type="Node3D"]
|
||||
script = ExtResource("1_w5itk")
|
||||
|
||||
[node name="Bar" type="Sprite3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.1, 0, 0, 0, 1, 0, 0, 0)
|
||||
cast_shadow = 0
|
||||
billboard = 1
|
||||
transparent = false
|
||||
double_sided = false
|
||||
no_depth_test = true
|
||||
texture = ExtResource("1_jlvej")
|
||||
|
||||
[node name="Health" type="Sprite3D" parent="."]
|
||||
transform = Transform3D(0.99, 0, 0, 0, 0.09, 0, 0, 0, 1, 0, 0, 0)
|
||||
cast_shadow = 0
|
||||
modulate = Color(0.7191989, 0.19340843, 1.92523e-07, 1)
|
||||
billboard = 1
|
||||
transparent = false
|
||||
double_sided = false
|
||||
no_depth_test = true
|
||||
render_priority = 10
|
||||
texture = ExtResource("1_jlvej")
|
||||
Reference in New Issue
Block a user