Platformer 2.0
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
extends CharacterBody2D
|
||||
|
||||
@export var gravity = 900.0
|
||||
|
||||
var movement_fsm: StateMachine
|
||||
@onready var animation_player: AnimationPlayer = $AnimationPlayer
|
||||
|
||||
var FSMSetup = preload("res://player/setup_state.gd")
|
||||
var movement_states: Array[State] = []
|
||||
var movement_transitions: Array[StateTransition] = []
|
||||
var movement_init_state: StringName = &"idle"
|
||||
|
||||
func _ready() -> void:
|
||||
movement_states = FSMSetup.build_states()
|
||||
movement_transitions = FSMSetup.build_transitions()
|
||||
|
||||
movement_fsm = StateMachine.new()
|
||||
movement_fsm.setup(movement_states, movement_transitions, movement_init_state)
|
||||
if movement_fsm.current_state:
|
||||
movement_fsm.current_state.enter(self)
|
||||
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
if(movement_fsm):
|
||||
movement_fsm.process(self, delta)
|
||||
print("Current state: %s" % movement_fsm.current_state.id)
|
||||
|
||||
func play_animation(anim_name: String) -> void:
|
||||
if animation_player == null:
|
||||
push_warning("State '%s': player_anims is null, cannot play '%s'" % [movement_fsm.current_state.id, anim_name])
|
||||
return
|
||||
# TODO:
|
||||
# null checks: no sprite frames
|
||||
# no animation by name
|
||||
|
||||
if animation_player.current_animation != anim_name:
|
||||
animation_player.play(anim_name)
|
||||
@@ -0,0 +1 @@
|
||||
uid://bcipombqbxffa
|
||||
@@ -0,0 +1,37 @@
|
||||
extends Resource
|
||||
|
||||
static var IdleState = preload("res://player/states/idle.gd")
|
||||
static var FallState = preload("res://player/states/fall.gd")
|
||||
|
||||
static func build_states() -> Array[State]:
|
||||
var list: Array[State] = []
|
||||
list.append(_named(IdleState.new(), &"idle"))
|
||||
list.append(_named(FallState.new(), &"fall"))
|
||||
return list
|
||||
|
||||
static func build_transitions() -> Array[StateTransition]:
|
||||
var list: Array[StateTransition] = []
|
||||
|
||||
var t_is_on_floor = TransitionCondition.new(func(data):
|
||||
return data.is_on_floor()
|
||||
)
|
||||
var t_n_is_on_floor = TransitionCondition.new(func(data):
|
||||
return !data.is_on_floor()
|
||||
)
|
||||
|
||||
list.append(_edge(&"idle", &"fall", t_n_is_on_floor, 10))
|
||||
list.append(_edge(&"fall", &"idle", t_is_on_floor, 10))
|
||||
|
||||
return list
|
||||
|
||||
static func _named(state: State, id: StringName) -> State:
|
||||
state.id = id
|
||||
return state
|
||||
|
||||
static func _edge(from: StringName, to: StringName, condition: TransitionCondition, priority: int) -> StateTransition:
|
||||
var t:= StateTransition.new()
|
||||
t.from = from
|
||||
t.to = to
|
||||
t.condition = condition
|
||||
t.priority = priority
|
||||
return t
|
||||
@@ -0,0 +1 @@
|
||||
uid://d3vpouroevnpp
|
||||
@@ -0,0 +1,8 @@
|
||||
extends State
|
||||
|
||||
func enter(char: Object) -> void:
|
||||
char.play_animation("fall")
|
||||
|
||||
func process(char: Object, delta: float) -> void:
|
||||
char.velocity.y += 900.0 * delta
|
||||
char.move_and_slide()
|
||||
@@ -0,0 +1 @@
|
||||
uid://c1dkyfrnd4mcu
|
||||
@@ -0,0 +1,8 @@
|
||||
extends State
|
||||
|
||||
func enter(char: Object) -> void:
|
||||
char.play_animation("idle")
|
||||
char.velocity.x = 0.0
|
||||
|
||||
func process(char: Object, delta: float) -> void:
|
||||
char.move_and_slide()
|
||||
@@ -0,0 +1 @@
|
||||
uid://bq7nhigvlxpq5
|
||||
Reference in New Issue
Block a user