微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Godot中只播放跳跃/坠落动画的第一帧

如何解决Godot中只播放跳跃/坠落动画的第一帧

所以我试图在 godot 中编写一个双跳的代码,我设法做到了,但是由于某种原因,当我跳时它只播放动画的第一帧

    if is_on_floor():
        if on_ground == false:
            on_ground = true
            jump_count = 0
    else:   
        if on_ground == true:
            on_ground = false
            jump_count = 1
        if veLocity.y < 0:
            $Sprite.play("jump")
        else:
            $Sprite.play("fall")

这里是整个代码以防万一


const SPEED = 100
const GraviTY = 8
const JUMPFORCE = -150
const FLOOR = Vector2.UP

var veLocity = Vector2(0,0)
var on_ground = false
var jump_count = 0
var should_change_animation = true

func _physics_process(_delta):
    if Input.is_action_pressed("right"):
        veLocity.x = SPEED
        $Sprite.play("run")
        $Sprite.flip_h = false
    elif Input.is_action_pressed("left"):
        veLocity.x = -SPEED
        $Sprite.play("run")
        $Sprite.flip_h = true
    else:
        $Sprite.play("idle")
    
    if is_on_floor():
        if on_ground == false:
            on_ground = true
            jump_count = 0
    else:   
        if on_ground == true:
            on_ground = false
            jump_count = 1
        if veLocity.y < 0:
            $Sprite.play("jump")
        else:
            $Sprite.play("fall")

    veLocity.y = veLocity.y + GraviTY
    
    if Input.is_action_just_pressed("jump"):
        if jump_count < 2:
            jump_count += 1
            veLocity.y = JUMPFORCE
            on_ground = false

    veLocity = move_and_slide(veLocity,FLOOR)
    
    veLocity.x = lerp(veLocity.x,0.1)

有没有办法解决这个问题?

解决方法

此代码在每个物理帧的开头运行:

    if Input.is_action_pressed("right"):
        velocity.x = SPEED
        $Sprite.play("run")
        $Sprite.flip_h = false
    elif Input.is_action_pressed("left"):
        velocity.x = -SPEED
        $Sprite.play("run")
        $Sprite.flip_h = true
    else:
        $Sprite.play("idle")

因此,每个物理帧都通过将精灵动画设置为 "idle""run" 来启动。


我会继续讨论关注点分离(我建议你阅读一下)。我认为您应该重构代码,将运动逻辑与视觉逻辑分开。目前它们是交错的。将有关某事的所有决定放在一起而不是与其他决定混在一起会很方便。因此,例如,如果播放错误的动画,则您只需要查看一个地方,因为您播放动画的地方只有一个。如果你让我做,我会重写你的整个代码......但是,你的代码仍然很小,你可以忍受一点点混乱,所以我会让你去做。


对于这种特殊情况,您需要考虑:应用动画的条件是什么?

例如,玩家必须按下一个方向才能播放 "run" 动画。但这还不够,化身也必须在地板上。您可以为此效果添加条件。


顺便说一下,lerp(velocity.x,0.1) 相当于这个 velocity.x * 0.9。我相信有一些教程教一些货物崇拜。此处不需要 lerp。反正效果是(帧相关)减速,化身不会立即停止(停止的速度取决于物理帧率)。

但是,一旦没有输入,您就会更改为 "idle" 动画,无论化身是否在空中(与此问题相关),或者化身是否仍在移动。


因此,底线是:不要根据输入选择动画。而是根据头像的状态选择动画,特别是如果它在地板上和 velocity 的值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。