Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add player_state dictionary to manage player state names for FSM demo #1143

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)