From 071c4c16e4a702cf70149a57cf98bdad8f9885e9 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Sat, 27 Jun 2026 18:02:21 +0300 Subject: [PATCH] Added state machine --- game/state_machine/abstract_state.gd | 28 +++++++++++++++ game/state_machine/abstract_state.gd.uid | 1 + game/state_machine/abstract_state.tscn | 6 ++++ game/state_machine/state_machine.gd | 43 ++++++++++++++++++++++++ game/state_machine/state_machine.gd.uid | 1 + game/state_machine/state_machine.tscn | 6 ++++ 6 files changed, 85 insertions(+) create mode 100644 game/state_machine/abstract_state.gd create mode 100644 game/state_machine/abstract_state.gd.uid create mode 100644 game/state_machine/abstract_state.tscn create mode 100644 game/state_machine/state_machine.gd create mode 100644 game/state_machine/state_machine.gd.uid create mode 100644 game/state_machine/state_machine.tscn diff --git a/game/state_machine/abstract_state.gd b/game/state_machine/abstract_state.gd new file mode 100644 index 0000000..d833e57 --- /dev/null +++ b/game/state_machine/abstract_state.gd @@ -0,0 +1,28 @@ +class_name AbstractState +extends Node + + +@warning_ignore("unused_signal") +signal switch_state(state: AbstractState) + + +func init() -> void: + pass + + +func enter() -> void: + pass + + +func exit() -> void: + pass + + +@warning_ignore("unused_parameter") +func process(delta: float) -> void: + pass + + +@warning_ignore("unused_parameter") +func physics_process(delta: float) -> void: + pass diff --git a/game/state_machine/abstract_state.gd.uid b/game/state_machine/abstract_state.gd.uid new file mode 100644 index 0000000..b476f7c --- /dev/null +++ b/game/state_machine/abstract_state.gd.uid @@ -0,0 +1 @@ +uid://ofqdyeqbeg4i diff --git a/game/state_machine/abstract_state.tscn b/game/state_machine/abstract_state.tscn new file mode 100644 index 0000000..f6a2f14 --- /dev/null +++ b/game/state_machine/abstract_state.tscn @@ -0,0 +1,6 @@ +[gd_scene format=3 uid="uid://cxdirjlkyccs4"] + +[ext_resource type="Script" uid="uid://ofqdyeqbeg4i" path="res://game/state_machine/abstract_state.gd" id="1_80326"] + +[node name="AbstractState" type="Node" unique_id=836520368] +script = ExtResource("1_80326") diff --git a/game/state_machine/state_machine.gd b/game/state_machine/state_machine.gd new file mode 100644 index 0000000..ba670c4 --- /dev/null +++ b/game/state_machine/state_machine.gd @@ -0,0 +1,43 @@ +class_name StateMachine +extends Node + + +@export var initial_state: AbstractState + + +var current_state : AbstractState + + +func init() -> void: + _init_states() + if initial_state: + _change_state(initial_state) + + +func process(delta: float) -> void: + if current_state: + current_state.process(delta) + + +func physics_process(delta: float) -> void: + if current_state: + current_state.physics_process(delta) + + +func _change_state(new_state: AbstractState) -> void: + if new_state == null: return + if new_state == current_state: return + + if current_state: + current_state.exit() + current_state = new_state + current_state.enter() + + +func _init_states() -> void: + for child in get_children(): + if not child is AbstractState: continue + var state := child as AbstractState + state.init() + state.switch_state.connect(_change_state) + diff --git a/game/state_machine/state_machine.gd.uid b/game/state_machine/state_machine.gd.uid new file mode 100644 index 0000000..0e9a58f --- /dev/null +++ b/game/state_machine/state_machine.gd.uid @@ -0,0 +1 @@ +uid://cwd731cnbgann diff --git a/game/state_machine/state_machine.tscn b/game/state_machine/state_machine.tscn new file mode 100644 index 0000000..1a8c4d5 --- /dev/null +++ b/game/state_machine/state_machine.tscn @@ -0,0 +1,6 @@ +[gd_scene format=3 uid="uid://blxgfix54dxq3"] + +[ext_resource type="Script" uid="uid://cwd731cnbgann" path="res://game/state_machine/state_machine.gd" id="1_ncw1q"] + +[node name="StateMachine" type="Node" unique_id=560273456] +script = ExtResource("1_ncw1q")