Godot Version
4.2.2
Question
In my game, my character uses the velocity vector length in order to determine whether to use idle or walk animations. If length is 0 then it’ll use idle animations, else, the walk ones. The thing is, while sliding to some specific surfaces, the vector length decreases to 0, but the character still moves, and that makes my character move but with its idle pose. I don´t understand why this happens or if there is a better way to implement the animations.
I’d really appreciate if someone could help.
KingGD
June 14, 2024, 6:33am
2
I think it is not enough, if possible show the codes
1 Like
Not much more regarding to movement (yeah i’m pretty newbie)
Also, here is a link to a video that shows the issue:
And this is how I implemented animations
KingGD
June 14, 2024, 3:23pm
5
Try to use elif like:
if look == "right":
#...Codes
elif look == "left":
#...Codes
1 Like
Thanks, but looks like that’s not the problem, still happens
KingGD
June 14, 2024, 4:49pm
7
if possible, show full codes
extends CharacterBody2D
var direction:Vector2 = Vector2(0,0)
@export var speed:int = 300
var look:String
func _ready():
$AnimatedSprite2D.play(“down_idle”)
func _physics_process(delta):
#control
direction = Input.get_vector("left","right","up","down")
#movement
velocity = direction * speed
move_and_slide()
#look direction
if direction.x > 0:
look = "right"
if direction.x < 0:
look = "left"
if direction.y < 0 and direction.x == 0:
look = "up"
if direction.y > 0 and direction.x == 0:
look = "down"
#animations
if look == "right":
if not velocity.length() == 0:
$AnimatedSprite2D.play("right_walk")
else:
$AnimatedSprite2D.play("right_idle")
elif look == "up":
if not velocity.length() == 0:
$AnimatedSprite2D.play("up_walk")
else:
$AnimatedSprite2D.play("up_idle")
elif look == "down":
if not velocity.length() == 0:
$AnimatedSprite2D.play("down_walk")
else:
$AnimatedSprite2D.play("down_idle")
if look == "left":
$AnimatedSprite2D.flip_h = true
if not velocity.length() == 0:
$AnimatedSprite2D.play("right_walk")
else:
$AnimatedSprite2D.play("right_idle")
else:
$AnimatedSprite2D.flip_h = false
(Sorry I can’t send more than 1 screenshot)
KingGD
June 15, 2024, 6:42am
9
Do like that:
#animations
if look == "right":
if not velocity.length() == 0:
$AnimatedSprite2D.play("right_walk")
else:
$AnimatedSprite2D.play("right_idle")
elif look == "up":
if not velocity.length() == 0:
$AnimatedSprite2D.play("up_walk")
else:
$AnimatedSprite2D.play("up_idle")
elif look == "down":
if not velocity.length() == 0:
$AnimatedSprite2D.play("down_walk")
else:
$AnimatedSprite2D.play("down_idle")
elif look == "left":
if not velocity.length() == 0:
$AnimatedSprite2D.play("right_walk")
else:
$AnimatedSprite2D.play("right_idle")
$AnimatedSprite2D.flip_h = true if look == "left" else false
Doesn’t work, but at least the code is more organized now haha. I think it has something to do with the velocity vector, its values do not correspond to what’s happening in game. But thanks for the help so far!
KingGD
June 15, 2024, 9:38am
11
Yeah, something is wrong with the velocity, I watched the video again😅
1 Like