68 lines
1.6 KiB
GDScript
68 lines
1.6 KiB
GDScript
extends CharacterBody2D
|
|
|
|
@onready var stm := $StateMachine
|
|
@onready var detect_box := $DetectBox
|
|
|
|
@onready var run := $StateMachine/Run
|
|
@onready var air := $StateMachine/Air
|
|
@onready var idle := $StateMachine/Idle
|
|
@onready var follow := $StateMachine/Follow
|
|
|
|
@export var wait_low: float
|
|
@export var wait_high: float
|
|
var wait_tmp: float
|
|
|
|
@export var walk_range: float
|
|
|
|
var random := RandomNumberGenerator.new()
|
|
var original_pos: Vector2
|
|
|
|
func current_state():
|
|
return stm.state
|
|
|
|
func _ready():
|
|
original_pos = position
|
|
if random.randi_range(0, 1) == 0:
|
|
run.direction = -1
|
|
original_pos.x += walk_range/2
|
|
else:
|
|
run.direction = 1
|
|
original_pos.x -= walk_range/2
|
|
|
|
func start_wait():
|
|
wait_tmp = random.randf_range(wait_low, wait_high)
|
|
stm.transition(idle)
|
|
|
|
func _physics_process(delta):
|
|
if current_state() in [run] && !is_on_floor():
|
|
stm.transition(air)
|
|
if current_state() in [air] && is_on_floor():
|
|
stm.transition(run)
|
|
if current_state() in [run]:
|
|
if position.x < original_pos.x - walk_range:
|
|
run.direction = 1
|
|
start_wait()
|
|
return
|
|
if position.x > original_pos.x + walk_range:
|
|
run.direction = -1
|
|
start_wait()
|
|
return
|
|
if current_state() in [idle]:
|
|
if wait_tmp <= 0:
|
|
original_pos = position
|
|
stm.transition(run)
|
|
return
|
|
else:
|
|
wait_tmp -= delta
|
|
if current_state() in [run, idle]:
|
|
if detect_box.tracked != null:
|
|
stm.transition(follow, detect_box.tracked)
|
|
if current_state() in [follow] && !is_on_floor():
|
|
stm.transition(air)
|
|
if current_state() in [follow] && detect_box.tracked == null:
|
|
stm.transition(air)
|
|
current_state().update(delta)
|
|
|
|
func _on_hurt_box_hurt(_data):
|
|
print("ouch")
|