Hi!
I’m having trouble switching from walking to running. My code is working perfectly right now, but I want to add the ability to run by pressing Shift + WASD. When I press those keys, I want to increase the character’s speed and play a special running animation using AnimationPlayer.
But I’m a little confused about how to properly handle the input. Currently, the Player.gd script reads WASD key inputs in the _physics_process function to control the character’s walking. And the PlayerWalkState.gd state detects movement if it’s not equal to 0.
How can I implement running? Am I correct in thinking that I need to add new Shift + WASD values to the InputMap? But in that case, how do I detect movement in Player.gd? What should I pass to Input.get_vector()?
I would be very grateful if someone could offer some advice!
Player.gd
class_name Player extends CharacterBody2D
@onready var player_animation_manager: AnimationPlayer = $PlayerAnimationManager
var speed: float = 65.0
var direction: Vector2 = Vector2.ZERO
var last_direction: Vector2 = Vector2.DOWN
func _physics_process(_delta: float) -> void:
direction = Input.get_vector("move_left", "move_right", "move_up", "move_down")
if direction != Vector2.ZERO:
last_direction = get_abs_last_direction()
func get_abs_last_direction() -> Vector2:
var abs_direction: Vector2
if abs(direction.x) > abs(direction.y):
abs_direction = Vector2.RIGHT if direction.x > 0 else Vector2.LEFT
else:
abs_direction = Vector2.DOWN if direction.y > 0 else Vector2.UP
return abs_direction
PlayerWalkState.gd
class_name PlayerWalkState extends PlayerState
const WALK_ANIMATION_PREFIX: String = 'walk'
func physics_update(_delta: float) -> void:
update_state_animation(WALK_ANIMATION_PREFIX, player.last_direction)
player.velocity = player.direction * player.speed
player.move_and_slide()
if player.direction == Vector2.ZERO:
transitioned.emit(PLAYER_STATES_NAMES.get('IDLE'))
PlayerIdleState.gd
class_name PlayerIdleState extends PlayerState
const IDLE_ANIMATION_PREFIX: String = 'idle'
func enter() -> void:
update_state_animation(IDLE_ANIMATION_PREFIX, player.last_direction)
func physics_update(_delta: float) -> void:
if player.direction != Vector2.ZERO:
transitioned.emit(PLAYER_STATES_NAMES.get('WALK'))