我怎样才能让玩家和敌人死后掉到地上?

How can I make the player and enemies fall to the ground when they die?

我正在用 Godot 制作我的第一款游戏。
无论我尝试什么,如果 player/enemies 在空中死去,它们就会留在原地。我希望他们死后倒在地上。帮助?

如果您有任何基于您从我的代码中看到的内容的指示,我将非常感激。特别是涉及到球员运动等方面。目前,很少有动作感觉流畅;很多东西感觉相当僵硬和不稳定(跳跃、从边缘掉落,以及敌人的碰撞形状随着敌人的移动而自行移动)。

玩家代码:


var motion = Vector2 ()
var is_in_attack = false
var fireball_power = 1
var is_dead = false
var is_jumping = false


func _physics_process(delta):
    if is_dead == false: 
        motion.y += GRAVITY
        var friction = false

        if Input.is_action_pressed("ui_right"):
            if is_in_attack == false || is_on_floor() == false:
                motion.x = min(motion.x+ACCELERATION, MAX_SPEED)
                if is_in_attack == false:
                    $Sprite.flip_h = false
                    $Sprite.play("run")
                    if sign($FireballPosition2D.position.x) == -1:
                        $FireballPosition2D.position.x *= -1
                    if sign($FireballPosition2D2.position.x) == -1:
                        $FireballPosition2D2.position.x *= -1
                    if sign($ArrowPosition2D.position.x) == -1:
                        $ArrowPosition2D.position.x *= -1

        elif Input.is_action_pressed("ui_left"):
            if is_in_attack == false || is_on_floor() == false:
                motion.x = max(motion.x-ACCELERATION, -MAX_SPEED)
                if is_in_attack == false:
                    $Sprite.flip_h = true
                    $Sprite.play("run")
                    if sign($FireballPosition2D.position.x) == 1:
                        $FireballPosition2D.position.x *= -1
                    if sign($FireballPosition2D2.position.x) == 1:
                        $FireballPosition2D2.position.x *= -1
                    if sign($ArrowPosition2D.position.x) == 1:
                        $ArrowPosition2D.position.x *= -1
        else: 
            if is_in_attack == false:
                $Sprite.play("idle")
                friction = true

        var snap = Vector2.DOWN *32 if !is_jumping else Vector2.ZERO
        motion = move_and_slide_with_snap(motion,snap, UP)
        pass


        if get_slide_count() > 0:
            for i in range(get_slide_count()):
                if "Enemy" in get_slide_collision(i).collider.name:
                    dead()


        for i in get_slide_count():
            var collision = get_slide_collision(i)
            if collision.collider.has_method("collide_with"):
                collision.collider.collide_with(collision, self)

func dead():
    is_dead = true
    motion = Vector2(0,0)
    $CollisionShape2D.set_deferred("disabled", true)
    $Sprite.play("dead")
    $Timer.start()
    PlayerData.deaths += 1

func _on_attackarea_body_entered(body):
    if "Enemy" in body.name:
        body.dead(1)

敌人代码:


const UP = Vector2 (0, -1)
const GRAVITY = 20
const ACCELERATION = 50
const JUMP_HEIGHT = -500

var motion = Vector2 ()
var direction = 1
var is_dead = false

export(int) var speed = 50
export(int) var hp = 1
export(Vector2) var size = Vector2(1, 1)

export var score: = 100
func _ready():
    scale = size
    pass

func dead(damage):
    hp = hp -damage
    if hp <=0:
        is_dead = true
        motion = Vector2(0,0) 
        $AnimatedSprite.play("dead")
        $CollisionShape2D.set_deferred("disabled", true)
        $Timer.start()
        PlayerData.score += score
        #calling the screenshake for large enemies
        if scale > Vector2(1.6, 1.6):
            get_parent().get_node("ScreenShake").screen_shake(1, 10, 100)


func _physics_process(delta):
    if is_dead == false:

        motion.x = speed * direction

        if direction == 1:
            $AnimatedSprite.flip_h = false
            $CollisionShape2D.position.x = 1
        else:
            $AnimatedSprite.flip_h = true
            $CollisionShape2D.position.x = -1

        $AnimatedSprite.play("walk")

        motion.y += GRAVITY
        motion = move_and_slide(motion, UP)

    if is_on_wall():
        direction = direction * -1

    if get_slide_count() > 0:
        for i in range (get_slide_count()):
            if "Player" in get_slide_collision(i).collider.name:
                get_slide_collision(i).collider.dead()


既然有效,我将其添加为官方答案:

只要他还活着,您就只能移动 physics_process 中的角色:

func _physics_process(delta):
   if is_dead == false:
      # all the gravity code is in here.

为 'if is_dead == false' 添加一个 else 语句,只要节点不在地面上,它就会在 y 方向上移动节点。类似的东西应该可以工作:

func _physics_process(delta):
   if is_dead == false:
      # your code
   else:
      if not is_on_floor():
         motion.y += GRAVITY
         motion = move_and_slide(motion, UP)