batrix/scripts/player/player_animator.gd
2025-03-03 21:01:46 +10:00

66 lines
1.6 KiB
GDScript

extends AnimationTree
@export_group("Animation names")
@export var _suffix_left := "_L"
@export var _suffix_right := "_R"
@export var _idle_name := "+idle"
var _speed: float
var _has_input: bool
@onready var _player: Player = $"../" as Player
@onready var _attack: PlayerAttack = $"../Attack" as PlayerAttack
@onready var _locomotion_playback: AnimationNodeStateMachinePlayback = get(
"parameters/locomotion/playback"
)
func _ready() -> void:
assert(_player, "_player missing!")
Music.track_started.connect(_on_music_track_started)
_attack.attacked.connect(_on_player_attacked)
_set_bpm()
_set_side()
func _process(_delta: float) -> void:
advance(Music.audio_delta as float)
_speed = _player.velocity.length() / _player.movement.move_speed
_has_input = _player.movement.move_input.length() > 0
var velocity_relative := _player.to_local(
_player.global_position + _player.velocity
)
var velocity_blend := (
Vector2(-velocity_relative.x, velocity_relative.z) / _player.movement.move_speed
)
Debugger.text("velocity_blend", velocity_blend, 2)
set(&"parameters/locomotion/run_R/blend_position", velocity_blend)
func _is_left() -> bool:
return _attack.side == PlayerAttack.Side.LEFT
func _suffix(invert: bool = false) -> String:
if not invert:
return _suffix_left if _is_left() else _suffix_right
return _suffix_left if not _is_left() else _suffix_right
func _set_bpm() -> void:
set(&"parameters/main_time_scale/scale", Music.bpm_factor)
func _set_side() -> void:
_locomotion_playback.travel(_idle_name + _suffix())
func _on_music_track_started() -> void:
_set_bpm()
func _on_player_attacked() -> void:
_set_side()