Add new components: HealComponent, HitComponent, HomingMissileMotionComponent, LeverComponent, and TriggerLeverComponent
This commit is contained in:
75
scripts/components/HitComponent.cs
Normal file
75
scripts/components/HitComponent.cs
Normal file
@@ -0,0 +1,75 @@
|
||||
using Godot;
|
||||
|
||||
namespace Mr.BrickAdventures.scripts.components;
|
||||
|
||||
public partial class HitComponent : Node
|
||||
{
|
||||
[Export] public Sprite2D Sprite { get; set; }
|
||||
[Export] public HealthComponent Health { get; set; }
|
||||
[Export] public float HitDuration { get; set; } = 0.1f;
|
||||
[Export] public GpuParticles2D HitFx { get; set; }
|
||||
[Export] public bool FlashMode { get; set; } = true;
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
if (Health != null)
|
||||
{
|
||||
Health.HealthChanged += OnHealthChange;
|
||||
Health.Death += OnDeath;
|
||||
}
|
||||
|
||||
if (Sprite == null)
|
||||
{
|
||||
GD.PushError("HitComponent: Sprite is null");
|
||||
return;
|
||||
}
|
||||
|
||||
if (Sprite.Material != null && FlashMode)
|
||||
{
|
||||
Sprite.Material = (Material)Sprite.Material.Duplicate();
|
||||
}
|
||||
}
|
||||
|
||||
private void Activate()
|
||||
{
|
||||
if (!FlashMode) return;
|
||||
|
||||
Sprite.SetInstanceShaderParameter("enabled", true);
|
||||
}
|
||||
|
||||
private void Deactivate()
|
||||
{
|
||||
if (!FlashMode) return;
|
||||
|
||||
Sprite.SetInstanceShaderParameter("enabled", false);
|
||||
}
|
||||
|
||||
private async void OnHealthChange(float delta, float totalHealth)
|
||||
{
|
||||
if (!(delta < 0f)) return;
|
||||
|
||||
Activate();
|
||||
await ToSignal(GetTree().CreateTimer(HitDuration), Timer.SignalName.Timeout);
|
||||
Deactivate();
|
||||
|
||||
if (totalHealth > 0f && delta < 0f)
|
||||
{
|
||||
HandleHitFx();
|
||||
}
|
||||
}
|
||||
|
||||
private async void OnDeath()
|
||||
{
|
||||
Activate();
|
||||
await ToSignal(GetTree().CreateTimer(HitDuration), Timer.SignalName.Timeout);
|
||||
Deactivate();
|
||||
}
|
||||
|
||||
private void HandleHitFx()
|
||||
{
|
||||
if (HitFx == null) return;
|
||||
|
||||
HitFx.Restart();
|
||||
HitFx.Emitting = true;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user