动画只播放第一帧 Godot

Animation plays only the first frame Godot

我正在制作一个简单的平台游戏。我有 3 个玩家可以做的动作,运行,跳跃和行走。行走和跳跃功能 运行 很好,但我对 运行 功能有问题,它似乎可以工作,但动画只播放第一帧,其他任何动画都不会发生这种情况。

extends KinematicBody2D

var speed : int = 200
var jumpforce: int = 500
var gravity: int = 1000

var vel: Vector2 = Vector2()

onready var sprite: Sprite = get_node("Sprite")
onready var anim = get_node("AnimationPlayer").get_animation("walk")
onready var anim2 = get_node("AnimationPlayer").get_animation("run")

func _physics_process(delta):
    vel.x = 0
    #movement
    if Input.is_action_pressed("move_left"):
        vel.x -= speed
        anim.set_loop(true)
        get_node("AnimationPlayer").play("walk")
        
    
    if Input.is_action_pressed("move_right"):
        vel.x += speed
        anim.set_loop(true)
        get_node("AnimationPlayer").play("walk")
        
        #return to idle
    if Input.is_action_just_released("move_right") or Input.is_action_just_released("move_left"):
        $AnimationPlayer.play("idle")
        #run
    if Input.is_action_pressed("move_left") and Input.is_action_pressed("shift"):
        vel.x -= speed
        anim2.set_loop(true)
        get_node("AnimationPlayer").play("run")
        
    if Input.is_action_pressed("move_right") and Input.is_action_pressed("shift"):
        vel.x += speed
        anim2.set_loop(true)
        get_node("AnimationPlayer").play("run")
    #physic and jump
    vel.y += gravity * delta
        
    if Input.is_action_pressed("jump") and is_on_floor():
        vel.y -= jumpforce
    
    vel = move_and_slide(vel, Vector2.UP)
    
    if vel.x < 0:
        sprite.flip_h = true
    elif vel.x > 0:
        sprite.flip_h = false

嗨,伙计,我不确定你是否还需要帮助,但这是我的解决方案:

extends KinematicBody2D

var speed : int = 200
var jumpforce: int = 500
var gravity: int = 1000

var vel: Vector2 = Vector2()

onready var sprite: Sprite = get_node("Sprite")

func _physics_process(delta):
    vel.x = 0
    #movement
        #run
    if Input.is_action_pressed("move_left") and Input.is_action_pressed("shift"):
        vel.x -= speed
        $AnimationPlayer.play("run")
    elif Input.is_action_pressed("move_right") and Input.is_action_pressed("shift"):
        vel.x += speed
        $AnimationPlayer.play("run")
    elif Input.is_action_pressed("move_left"):
        vel.x -= speed
        $AnimationPlayer.play("walk")
    elif Input.is_action_pressed("move_right"):
        vel.x += speed
        $AnimationPlayer.play("walk")
        #return to idle
    else:
        $AnimationPlayer.play("idle")
    

    #physic and jump
    vel.y += gravity * delta
        
    if Input.is_action_pressed("jump") and is_on_floor():
        vel.y -= jumpforce
    
    vel = move_and_slide(vel, Vector2.UP)
    
    if vel.x < 0:
        sprite.flip_h = true
    elif vel.x > 0:
        sprite.flip_h = false

问题是你有一堆 if 语句,每个勾选 运行 和 walk if 语句都为真。因此,例如,您按左键并移动。如果语句为真,则步行离开,动画设置为步行。然后 运行 if 语句也为真,您的动画设置为 运行。下一帧行走动画如果语句再次为真,这意味着它再次设置为行走动画。然后 运行 动画为真,将动画设置为 运行 动画,但因为我们正在切换动画,所以它会将帧设置为 0 并再次启动动画。