using Godot; using System; using System.Collections.Generic; public abstract partial class StateMachine : Node { [Export] public CharacterBody2D npc; [Export] public NodePath initialState; // Start tilstand skal angives... private Dictionary _states; // alle tilstande i denne datastruktur private State _currentState; // nuværende tilstand public override void _Ready() { if (npc == null) { GD.Print("You forgot to set NPC..export"); } if (initialState == null) { GD.Print("You forgot to set initialState..export"); } _states = new Dictionary(); foreach (Node node in this.GetChildren()) { if (node is State s) { _states[node.Name] = s; s.fsm = this; s.Ready(); s.Exit(); } } _currentState = GetNode(initialState); _currentState.Enter(); GD.Print("StateMachine is ready."); } // Der der skiftes tilstand public void TransitionTo(string stateName){ // sikkerheds tjeck at tilstand eksisterer, eller at den allerede er valgt if (!_states.ContainsKey(stateName) || _currentState == _states[stateName]) { return; } // Der skiftes tilstand _currentState.Exit(); // vi rydder op efter os ! _currentState = _states[stateName]; // Vi skifter til den nye tilstands _currentState.Enter(); // initialisering.. } public override void _Process(double delta) { _currentState.Update((float) delta); } public override void _PhysicsProcess(double delta) { _currentState.PhysicsUpdate((float)delta); } // Sender ikke håndterede events videre til nuværende tilstand (State) public override void _UnhandledInput(InputEvent @event) { _currentState.HandleInput(@event); } }