mirror of
https://gitlab.com/MaddoScientisto/cirnogodot.git
synced 2026-06-06 11:05:53 +00:00
Enemy blinking
This commit is contained in:
parent
79cac3ebae
commit
e5a60a6ccd
11 changed files with 172 additions and 30 deletions
|
|
@ -27,7 +27,7 @@ public partial class AnimatedShaderSprite3D : AnimatedSprite3D
|
|||
FrameChanged += HandleFrameChanged;
|
||||
}
|
||||
|
||||
private void HandleFrameChanged()
|
||||
protected void HandleFrameChanged()
|
||||
{
|
||||
_shaderMaterial.SetShaderParameter("tex", SpriteFrames.GetFrameTexture(Animation, Frame));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -116,8 +116,12 @@ public partial class PlayerAnimationProvider3D : Node3D
|
|||
|
||||
public void Blink()
|
||||
{
|
||||
if (BlinkMaterial == null) return;
|
||||
AnimatedSprite.MaterialOverride = BlinkMaterial;
|
||||
if (AnimatedSprite.MaterialOverride is null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
//if (BlinkMaterial == null) return;
|
||||
//AnimatedSprite.MaterialOverride = BlinkMaterial;
|
||||
|
||||
var material = ((ShaderMaterial)AnimatedSprite.MaterialOverride);
|
||||
|
||||
|
|
@ -133,8 +137,12 @@ public partial class PlayerAnimationProvider3D : Node3D
|
|||
|
||||
public void PlayTeleportAnimation()
|
||||
{
|
||||
if (BlinkMaterial == null) return;
|
||||
AnimatedSprite.MaterialOverride = BlinkMaterial;
|
||||
if (AnimatedSprite.MaterialOverride is null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
//if (BlinkMaterial == null) return;
|
||||
//AnimatedSprite.MaterialOverride = BlinkMaterial;
|
||||
var material = ((ShaderMaterial)AnimatedSprite.MaterialOverride);
|
||||
_blinkTween?.Kill();
|
||||
_blinkTween = GTweenSequenceBuilder.New()
|
||||
|
|
@ -149,8 +157,12 @@ public partial class PlayerAnimationProvider3D : Node3D
|
|||
|
||||
public void PlayUnteleportAnimation()
|
||||
{
|
||||
if (BlinkMaterial == null) return;
|
||||
AnimatedSprite.MaterialOverride = BlinkMaterial;
|
||||
if (AnimatedSprite.MaterialOverride is null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
//if (BlinkMaterial == null) return;
|
||||
//AnimatedSprite.MaterialOverride = BlinkMaterial;
|
||||
var material = ((ShaderMaterial)AnimatedSprite.MaterialOverride);
|
||||
_blinkTween?.Kill();
|
||||
_blinkTween = GTweenSequenceBuilder.New()
|
||||
|
|
|
|||
61
Scripts/Components/FSM/Enemy/3D/EnemyAnimationModule3D.cs
Normal file
61
Scripts/Components/FSM/Enemy/3D/EnemyAnimationModule3D.cs
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
using Cirno.Scripts.Components.Actors;
|
||||
using Cirno.Scripts.Components.Actors._3D;
|
||||
using Cirno.Scripts.Enums;
|
||||
using Godot;
|
||||
|
||||
namespace Cirno.Scripts.Components.FSM.Enemy._3D;
|
||||
|
||||
public partial class EnemyAnimationModule3D : ModuleBase<EnemyState, CharacterBody3D>
|
||||
{
|
||||
private IStateMachine<EnemyState, CharacterBody3D> _machine;
|
||||
|
||||
[Export] public PlayerAnimationProvider3D AnimationProvider { get; private set; }
|
||||
|
||||
[Export] public EnemyStorage3D Storage { get; private set; }
|
||||
|
||||
[Export] public ActorResourceProvider HealthProvider { get; private set; }
|
||||
|
||||
public override void EnterState(EnemyState state)
|
||||
{
|
||||
AnimationProvider.SetAnimation(Storage.AimingDirection);
|
||||
AnimationProvider.SetAnimation(Vector2.Zero);
|
||||
if (HealthProvider is not null)
|
||||
{
|
||||
HealthProvider.ResourceDecreased += HealthProviderOnResourceDecreased;
|
||||
}
|
||||
}
|
||||
|
||||
private void HealthProviderOnResourceDecreased(float oldValue, float newValue, float maxValue)
|
||||
{
|
||||
AnimationProvider?.Blink();
|
||||
}
|
||||
|
||||
public override void ExitState(EnemyState state)
|
||||
{
|
||||
AnimationProvider.SetAnimation(Vector2.Zero);
|
||||
if (HealthProvider is not null)
|
||||
{
|
||||
HealthProvider.ResourceDecreased -= HealthProviderOnResourceDecreased;
|
||||
}
|
||||
}
|
||||
|
||||
public override void Init(IStateMachine<EnemyState, CharacterBody3D> machine)
|
||||
{
|
||||
_machine = machine;
|
||||
}
|
||||
|
||||
public override void Process(double delta)
|
||||
{
|
||||
AnimationProvider.SetAnimation(Storage.AimingDirection);
|
||||
|
||||
if (_machine.MainObject.Velocity == Vector3.Zero)
|
||||
{
|
||||
AnimationProvider.SetAnimation(Vector2.Zero);
|
||||
}
|
||||
}
|
||||
|
||||
public override void PhysicsProcess(double delta)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
uid://ts64slgd7twt
|
||||
|
|
@ -1,4 +1,5 @@
|
|||
using Cirno.Scripts.Components.Actors;
|
||||
using Cirno.Scripts.Components.Actors._3D;
|
||||
using Cirno.Scripts.Enums;
|
||||
using Godot;
|
||||
|
||||
|
|
@ -8,6 +9,8 @@ public partial class EnemyDamageModule3D : ModuleBase<EnemyState, CharacterBody3
|
|||
{
|
||||
[Export] public DamageReceiver3D DamageReceiver { get; private set; }
|
||||
[Export] public EnemyStorage3D StorageModule { get; private set; }
|
||||
|
||||
[Export] public PlayerAnimationProvider3D AnimationProvider { get; private set; }
|
||||
|
||||
private IStateMachine<EnemyState, CharacterBody3D> _machine;
|
||||
public override void EnterState(EnemyState state)
|
||||
|
|
@ -15,14 +18,14 @@ public partial class EnemyDamageModule3D : ModuleBase<EnemyState, CharacterBody3
|
|||
DamageReceiver.ChangeState(true);
|
||||
DamageReceiver.HealthProvider.ResourceDepleted += HealthProviderOnResourceDepleted;
|
||||
|
||||
// DamageReceiver.HealthProvider.ResourceDecreased += HealthProviderOnResourceDecreased;
|
||||
DamageReceiver.HealthProvider.ResourceDecreased += HealthProviderOnResourceDecreased;
|
||||
}
|
||||
|
||||
public override void ExitState(EnemyState state)
|
||||
{
|
||||
DamageReceiver.HealthProvider.ResourceDepleted -= HealthProviderOnResourceDepleted;
|
||||
|
||||
// DamageReceiver.HealthProvider.ResourceDecreased -= HealthProviderOnResourceDecreased;
|
||||
DamageReceiver.HealthProvider.ResourceDecreased -= HealthProviderOnResourceDecreased;
|
||||
DamageReceiver.ChangeState(false);
|
||||
}
|
||||
|
||||
|
|
@ -43,8 +46,13 @@ public partial class EnemyDamageModule3D : ModuleBase<EnemyState, CharacterBody3
|
|||
|
||||
private void HealthProviderOnResourceDecreased(float oldvalue, float newvalue, float maxvalue)
|
||||
{
|
||||
StorageModule.AiState = AiState.Enabled;
|
||||
_machine.SetState(EnemyState.Alert);
|
||||
if (_machine.GetState() is EnemyState.Idle)
|
||||
{
|
||||
StorageModule.AiState = AiState.Enabled;
|
||||
_machine.SetState(EnemyState.Alert);
|
||||
}
|
||||
|
||||
AnimationProvider.Blink();
|
||||
}
|
||||
|
||||
private void HealthProviderOnResourceDepleted()
|
||||
|
|
|
|||
|
|
@ -1,20 +1,30 @@
|
|||
using Cirno.Scripts.Resources;
|
||||
using Cirno.Scripts.Components.Actors._3D;
|
||||
using Cirno.Scripts.Resources;
|
||||
using Godot;
|
||||
|
||||
namespace Cirno.Scripts.Components.FSM.Enemy._3D;
|
||||
|
||||
public partial class EnemyFSMAnimatedSprite3D : AnimatedSprite3D
|
||||
[Tool]
|
||||
public partial class EnemyFSMAnimatedSprite3D : AnimatedShaderSprite3D
|
||||
{
|
||||
[Export] public EnemyProxy3D EnemyProxy { get; private set; }
|
||||
//[Export] public EnemyProxy3D EnemyProxy { get; private set; }
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
base._Ready();
|
||||
//EnemyProxy.Initialized += EnemyFsmProxyOnInitialized;
|
||||
this.SpriteFrames = EnemyProxy.EnemyResource.AnimationFrames;
|
||||
if (!Engine.IsEditorHint())
|
||||
{
|
||||
var enemyProxy = GetParent<EnemyProxy3D>();
|
||||
this.SpriteFrames = enemyProxy.EnemyResource.AnimationFrames;
|
||||
|
||||
HandleFrameChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private void EnemyFsmProxyOnInitialized(EnemyResource resource)
|
||||
{
|
||||
if (Engine.IsEditorHint()) return;
|
||||
this.SpriteFrames = resource.AnimationFrames;
|
||||
}
|
||||
}
|
||||
|
|
@ -12,6 +12,7 @@ public interface IStateMachine<TKey, [MustBeVariant] TType>
|
|||
public IState<TKey, TType> CurrentState { get; }
|
||||
public TKey InitialState { get; }
|
||||
public void SetState(TKey stateId);
|
||||
public TKey GetState();
|
||||
|
||||
public TType MainObject { get; }
|
||||
}
|
||||
|
|
@ -30,7 +30,12 @@ public abstract partial class IsoStateMachineBase<TKey, TType> : Node, IStateMac
|
|||
}
|
||||
SetState(InitialState);
|
||||
}
|
||||
|
||||
|
||||
public TKey GetState()
|
||||
{
|
||||
return CurrentState.StateId;
|
||||
}
|
||||
|
||||
public void SetState(TKey stateId)
|
||||
{
|
||||
if (CurrentStateIndex is not null)
|
||||
|
|
|
|||
|
|
@ -31,6 +31,11 @@ public abstract partial class StateMachineBase<TKey, TType> : Node, IStateMachin
|
|||
SetState(InitialState);
|
||||
}
|
||||
|
||||
public TKey GetState()
|
||||
{
|
||||
return CurrentState.StateId;
|
||||
}
|
||||
|
||||
public void SetState(TKey stateId)
|
||||
{
|
||||
if (CurrentStateIndex is not null)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue