Skip to content

Commit

Permalink
Add player_state dictionary to manage player state names for FSM demo
Browse files Browse the repository at this point in the history
  • Loading branch information
Yaxian committed Dec 3, 2024
1 parent 0fb1b4e commit 926d8e8
Show file tree
Hide file tree
Showing 10 changed files with 43 additions and 28 deletions.
13 changes: 13 additions & 0 deletions 2d/finite_state_machine/player/player_state.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
extends "res://state_machine/state.gd"

static var player_state := {
"previous": "previous",
"jump": "jump",
"idle": "idle",
"move": "move",
"stagger": "stagger",
"attack": "attack",
"die": "die",
"dead": "dead",
"walk": "walk",
}
20 changes: 11 additions & 9 deletions 2d/finite_state_machine/player/player_state_machine.gd
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
extends "res://state_machine/state_machine.gd"

var player_state = preload("res://player/player_state.gd").player_state

@onready var idle: Node = $Idle
@onready var move: Node = $Move
@onready var jump: Node = $Jump
Expand All @@ -8,21 +10,21 @@ extends "res://state_machine/state_machine.gd"

func _ready() -> void:
states_map = {
"idle": idle,
"move": move,
"jump": jump,
"stagger": stagger,
"attack": attack,
player_state.idle: idle,
player_state.move: move,
player_state.jump: jump,
player_state.stagger: stagger,
player_state.attack: attack,
}


func _change_state(state_name: String) -> void:
# The base state_machine interface this node extends does most of the work.
if not _active:
return
if state_name in ["stagger", "jump", "attack"]:
if state_name in [player_state.stagger, player_state.jump, player_state.attack]:
states_stack.push_front(states_map[state_name])
if state_name == "jump" and current_state == move:
if state_name == player_state.jump and current_state == move:
jump.initialize(move.speed, move.velocity)

super._change_state(state_name)
Expand All @@ -31,10 +33,10 @@ func _change_state(state_name: String) -> void:
func _unhandled_input(event: InputEvent) -> void:
# Here we only handle input that can interrupt states, attacking in this case,
# otherwise we let the state node handle it.
if event.is_action_pressed("attack"):
if event.is_action_pressed(player_state.attack):
if current_state in [attack, stagger]:
return
_change_state("attack")
_change_state(player_state.attack)
return

current_state.handle_input(event)
6 changes: 3 additions & 3 deletions 2d/finite_state_machine/player/states/combat/attack.gd
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
extends "res://state_machine/state.gd"
extends "res://player/player_state.gd"

func enter() -> void:
owner.get_node(^"AnimationPlayer").play("idle")
owner.get_node(^"AnimationPlayer").play(player_state.idle)


func _on_Sword_attack_finished() -> void:
finished.emit("previous")
finished.emit(player_state.previous)
8 changes: 4 additions & 4 deletions 2d/finite_state_machine/player/states/combat/stagger.gd
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
extends "res://state_machine/state.gd"
extends "res://player/player_state.gd"
# The stagger state end with the stagger animation from the AnimationPlayer.
# The animation only affects the Body Sprite2D's modulate property so it
# could stack with other animations if we had two AnimationPlayer nodes.

func enter() -> void:
owner.get_node(^"AnimationPlayer").play("stagger")
owner.get_node(^"AnimationPlayer").play(player_state.stagger)


func _on_animation_finished(anim_name: String) -> void:
assert(anim_name == "stagger")
finished.emit("previous")
assert(anim_name == player_state.stagger)
finished.emit(player_state.previous)
6 changes: 3 additions & 3 deletions 2d/finite_state_machine/player/states/die.gd
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
extends "res://state_machine/state.gd"
extends "res://player/player_state.gd"

# Initialize the state. E.g. change the animation.
func enter() -> void:
owner.set_dead(true)
owner.get_node(^"AnimationPlayer").play("die")
owner.get_node(^"AnimationPlayer").play(player_state.die)


func _on_animation_finished(_anim_name: String) -> void:
finished.emit("dead")
finished.emit(player_state.dead)
4 changes: 2 additions & 2 deletions 2d/finite_state_machine/player/states/motion/in_air/jump.gd
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func enter() -> void:
horizontal_velocity = Vector2()
vertical_speed = 600.0

owner.get_node(^"AnimationPlayer").play("idle")
owner.get_node(^"AnimationPlayer").play(player_state.idle)


func update(delta: float) -> void:
Expand All @@ -46,7 +46,7 @@ func update(delta: float) -> void:
move_horizontally(delta, input_direction)
animate_jump_height(delta)
if height <= 0.0:
finished.emit("previous")
finished.emit(player_state.previous)


func move_horizontally(delta: float, direction: Vector2) -> void:
Expand Down
4 changes: 2 additions & 2 deletions 2d/finite_state_machine/player/states/motion/motion.gd
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
extends "res://state_machine/state.gd"
extends "res://player/player_state.gd"
# Collection of important methods to handle direction and animation.

func handle_input(event: InputEvent) -> void:
if event.is_action_pressed("simulate_damage"):
finished.emit("stagger")
finished.emit(player_state.stagger)


func get_input_direction() -> Vector2:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
extends "on_ground.gd"

func enter() -> void:
owner.get_node(^"AnimationPlayer").play("idle")
owner.get_node(^"AnimationPlayer").play(player_state.idle)


func handle_input(event: InputEvent) -> void:
Expand All @@ -11,4 +11,4 @@ func handle_input(event: InputEvent) -> void:
func update(_delta: float) -> void:
var input_direction: Vector2 = get_input_direction()
if input_direction:
finished.emit("move")
finished.emit(player_state.move)
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ func enter() -> void:

var input_direction := get_input_direction()
update_look_direction(input_direction)
owner.get_node(^"AnimationPlayer").play("walk")
owner.get_node(^"AnimationPlayer").play(player_state.walk)


func handle_input(event: InputEvent) -> void:
Expand All @@ -19,7 +19,7 @@ func handle_input(event: InputEvent) -> void:
func update(_delta: float) -> void:
var input_direction := get_input_direction()
if input_direction.is_zero_approx():
finished.emit("idle")
finished.emit(player_state.idle)
update_look_direction(input_direction)

if Input.is_action_pressed("run"):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ var velocity := Vector2()

func handle_input(event: InputEvent) -> void:
if event.is_action_pressed("jump"):
finished.emit("jump")
finished.emit(player_state.jump)
return super.handle_input(event)

0 comments on commit 926d8e8

Please sign in to comment.