mirror of
https://gitlab.com/MaddoScientisto/cirnogodot.git
synced 2026-06-01 09:55:35 +00:00
Modules for FSM
This commit is contained in:
parent
5a09b7fcd1
commit
bdc310d204
9 changed files with 74 additions and 23 deletions
|
|
@ -1,4 +1,4 @@
|
|||
[gd_scene load_steps=43 format=4 uid="uid://dqyfnby0t7gu1"]
|
||||
[gd_scene load_steps=42 format=4 uid="uid://dqyfnby0t7gu1"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://doxmbokehw8ci" path="res://Scripts/GameManager.cs" id="1_c3v4x"]
|
||||
[ext_resource type="Resource" uid="uid://cs3ihltcn2166" path="res://Resources/Items/IcicleGun.tres" id="3_6314l"]
|
||||
|
|
@ -32,9 +32,9 @@
|
|||
[ext_resource type="Resource" uid="uid://dau0s8ob7qnpc" path="res://Resources/Items/IceShotgun.tres" id="22_4gtx8"]
|
||||
[ext_resource type="Resource" uid="uid://ct1fa2huvy34n" path="res://Resources/Items/Ammo1.tres" id="23_1ajuh"]
|
||||
[ext_resource type="PackedScene" uid="uid://bjskkeb3ppcs8" path="res://Scenes/Actors/Turret360.tscn" id="24_rff8l"]
|
||||
[ext_resource type="Script" uid="uid://ht8lw77ouq1k" path="res://Scripts/Components/FSM/NodeClassTest.cs" id="33_k6t8d"]
|
||||
[ext_resource type="Script" uid="uid://bgertv72tq1dt" path="res://Scripts/Components/FSM/NewPlayerStateMachine.cs" id="34_2vu2h"]
|
||||
[ext_resource type="Script" uid="uid://btwuahxvreivs" path="res://Scripts/Components/FSM/Player/NewInit.cs" id="35_mpb62"]
|
||||
[ext_resource type="Script" uid="uid://dl50bcl8dx3k8" path="res://Scripts/Components/FSM/TestModule.cs" id="36_4rfvg"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_6wo78"]
|
||||
script = ExtResource("4_u1i8n")
|
||||
|
|
@ -53,8 +53,6 @@ colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 1)
|
|||
[sub_resource type="GradientTexture1D" id="GradientTexture1D_4gtx8"]
|
||||
gradient = SubResource("Gradient_2vu2h")
|
||||
|
||||
[sub_resource type="CircleShape2D" id="CircleShape2D_2vu2h"]
|
||||
|
||||
[sub_resource type="CircleShape2D" id="CircleShape2D_mpb62"]
|
||||
|
||||
[node name="GameScene" type="Node2D"]
|
||||
|
|
@ -203,12 +201,6 @@ autoplay = true
|
|||
|
||||
[node name="Nodetest" type="Node2D" parent="."]
|
||||
|
||||
[node name="CharacterBody2D" type="CharacterBody2D" parent="Nodetest"]
|
||||
script = ExtResource("33_k6t8d")
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Nodetest/CharacterBody2D"]
|
||||
shape = SubResource("CircleShape2D_2vu2h")
|
||||
|
||||
[node name="Body" type="CharacterBody2D" parent="Nodetest"]
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Nodetest/Body"]
|
||||
|
|
@ -217,5 +209,9 @@ shape = SubResource("CircleShape2D_mpb62")
|
|||
[node name="FSM" type="Node2D" parent="Nodetest/Body"]
|
||||
script = ExtResource("34_2vu2h")
|
||||
|
||||
[node name="Init" type="Node2D" parent="Nodetest/Body/FSM"]
|
||||
[node name="Init" type="Node2D" parent="Nodetest/Body/FSM" node_paths=PackedStringArray("_moduleNodes")]
|
||||
script = ExtResource("35_mpb62")
|
||||
_moduleNodes = [NodePath("../../TestModule")]
|
||||
|
||||
[node name="TestModule" type="Node2D" parent="Nodetest/Body"]
|
||||
script = ExtResource("36_4rfvg")
|
||||
|
|
|
|||
|
|
@ -1,4 +1,7 @@
|
|||
using Godot;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using Godot;
|
||||
using Godot.Collections;
|
||||
|
||||
namespace Cirno.Scripts.Components.FSM;
|
||||
|
||||
|
|
@ -6,23 +9,43 @@ public abstract partial class BaseState<TKey, TType> : Node2D, IState<TKey, TTyp
|
|||
where TKey : notnull
|
||||
where TType : Node
|
||||
{
|
||||
public TKey StateId { get; }
|
||||
public virtual TKey StateId { get; }
|
||||
public IStateMachine<TKey, TType> StateMachine => _stateMachine;
|
||||
|
||||
private IStateMachine<TKey, TType> _stateMachine;
|
||||
|
||||
public TType MainObject => _stateMachine.MainObject;
|
||||
|
||||
[Export]
|
||||
private Array<Node> _moduleNodes = [];
|
||||
|
||||
private readonly List<IModule<TKey, TType>> _modules = [];
|
||||
|
||||
public virtual void Init(IStateMachine<TKey, TType> machine)
|
||||
{
|
||||
_stateMachine = machine;
|
||||
|
||||
foreach (var node in _moduleNodes)
|
||||
{
|
||||
if (node is IModule<TKey, TType> module)
|
||||
{
|
||||
_modules.Add(module);
|
||||
module.Init(_stateMachine);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public abstract void EnterState();
|
||||
|
||||
public abstract void ExitState();
|
||||
|
||||
public abstract void ProcessState(double delta);
|
||||
public virtual void ProcessState(double delta)
|
||||
{
|
||||
_modules.ForEach(module => module.Process(delta));
|
||||
}
|
||||
|
||||
public abstract void PhysicsProcessState(double delta);
|
||||
public virtual void PhysicsProcessState(double delta)
|
||||
{
|
||||
_modules.ForEach(module => module.PhysicsProcess(delta));
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,12 @@
|
|||
namespace Cirno.Scripts.Components.FSM;
|
||||
using Godot;
|
||||
|
||||
public interface IModule
|
||||
namespace Cirno.Scripts.Components.FSM;
|
||||
|
||||
public interface IModule<TKey, TType>
|
||||
where TKey : notnull
|
||||
where TType : Node
|
||||
{
|
||||
|
||||
public void Init(IStateMachine<TKey, TType> machine);
|
||||
public void Process(double delta);
|
||||
public void PhysicsProcess(double delta);
|
||||
}
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
namespace Cirno.Scripts.Components.FSM;
|
||||
|
||||
public interface IState<TKey, TType>
|
||||
public interface IState<TKey, [MustBeVariant] TType>
|
||||
where TKey : notnull
|
||||
where TType : Node
|
||||
{
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ using Godot;
|
|||
|
||||
namespace Cirno.Scripts.Components.FSM;
|
||||
|
||||
public interface IStateMachine<TKey, TType>
|
||||
public interface IStateMachine<TKey, [MustBeVariant] TType>
|
||||
where TKey : notnull
|
||||
where TType : Node
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2,7 +2,11 @@
|
|||
|
||||
namespace Cirno.Scripts.Components.FSM;
|
||||
|
||||
public partial class ModuleBase : Node2D, IModule
|
||||
public abstract partial class ModuleBase<TKey, TType> : Node2D, IModule<TKey, TType>
|
||||
where TKey : notnull
|
||||
where TType : Node
|
||||
{
|
||||
|
||||
public abstract void Init(IStateMachine<TKey, TType> machine);
|
||||
public abstract void Process(double delta);
|
||||
public abstract void PhysicsProcess(double delta);
|
||||
}
|
||||
|
|
@ -4,7 +4,7 @@ namespace Cirno.Scripts.Components.FSM.Player;
|
|||
|
||||
public partial class NewInit : BaseState<PlayerState, CharacterBody2D>
|
||||
{
|
||||
public PlayerState StateId => PlayerState.Init;
|
||||
public override PlayerState StateId => PlayerState.Init;
|
||||
|
||||
public override void Init(IStateMachine<PlayerState, CharacterBody2D> machine)
|
||||
{
|
||||
|
|
|
|||
21
Scripts/Components/FSM/TestModule.cs
Normal file
21
Scripts/Components/FSM/TestModule.cs
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
using Godot;
|
||||
|
||||
namespace Cirno.Scripts.Components.FSM;
|
||||
|
||||
public partial class TestModule : ModuleBase<PlayerState, CharacterBody2D>
|
||||
{
|
||||
public override void Init(IStateMachine<PlayerState, CharacterBody2D> machine)
|
||||
{
|
||||
GD.Print($"Module Init {Name}");
|
||||
}
|
||||
|
||||
public override void Process(double delta)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void PhysicsProcess(double delta)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
1
Scripts/Components/FSM/TestModule.cs.uid
Normal file
1
Scripts/Components/FSM/TestModule.cs.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://dl50bcl8dx3k8
|
||||
Loading…
Add table
Add a link
Reference in a new issue