0

我正在创建一个简单的 2d 平台游戏,我的问题是在我的一个动画中,需要在动画完成后创建子弹/骨骼。现在它会创建骨骼并同时启动动画。

我曾尝试将 Bone 弹丸的创建放在 onanimation_complete 下,但只有当我的角色面向左侧时(方向由按键“a”给出),它才会允许我射击。有什么我想念的吗?

如果有帮助,这里是代码。谢谢!

extends KinematicBody2D

const WALK = 40
const SPRINT = 70
const GRAVITY = 10
const JUMP = -250
const FLOOR = Vector2(0, -1)

const BONE = preload("res://Bone.tscn")

var is_attacking = false

var velocity = Vector2()
var on_ground = true

func _physics_process(delta):
    if Input.is_action_pressed("D"):
        if is_attacking == false:
            velocity.x = WALK 
            $Player_Animation.play("Player_Run")
            $Player_Animation.flip_h = true
            if sign($Position2D.position.x) == -1:
                $Position2D.position.x *= -1

    elif Input.is_action_pressed("A"):
        if is_attacking == false:
            velocity.x = -WALK 
            $Player_Animation.play("Player_Run") 
            $Player_Animation.flip_h = false
            if sign($Position2D.position.x) == 1:
                $Position2D.position.x *= -1

    else:
        velocity.x = 0
        if on_ground == true && is_attacking == false:
            $Player_Animation.play("Player_Idle")

    if Input.is_action_just_pressed("Space"):
        if is_attacking == false:
            if on_ground == true:
                velocity.y = JUMP
                on_ground = false

    if Input.is_action_just_pressed( "ui_focus_next") && is_attacking == false:

        is_attacking = true
        $Player_Animation.play("Player_Attack")
        var bone = BONE.instance()
        if sign($Position2D.position.x) == 1:
            bone.set_bone_direction(-1)
        else:
            bone.set_bone_direction(1)
        get_parent().add_child(bone)
        bone.position = $Position2D.global_position

    velocity.y = velocity.y + GRAVITY

    if is_on_floor():
        on_ground = true
    else:
        if is_attacking == false:
            on_ground = false
            if velocity.y < 0:
                $Player_Animation.play("Player_Jump")
            else:
                $Player_Animation.play("Player_Fall")

    velocity = move_and_slide(velocity, FLOOR)



func _on_Sprite_animation_finished():
    is_attacking = false
4

1 回答 1

0

可能最简单的解决方案是以计时器节点的​​形式添加子弹延迟。它的工作原理基本上是这样的:同时播放动画和启动计时器。如果在播放动画时计时器达到 0,则触发射弹。您可以将计时器设置为从动画开始到您希望弹丸出现的确切时间。我已经在其他动画中成功地使用了这种技术。事实上,在动画过程中的不同点触发许多效果是可能的。

http://docs.godotengine.org/en/3.0/classes/class_timer.html

于 2018-10-19T16:45:44.010 回答