princecled
princecled

Reputation: 3

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

I'm making my first game in Godot.
No matter what I try, if the player/enemies die while in the air, they stay there. I want them to fall to the ground when they die. Help?

While at it if you have any pointers based on what you can see from my code, I'll really appreciate it. Especially when it comes to player movement and such. Currently, very few actions feel smooth; a lot of stuff feels rather rigid and wonky (jumping, falling from edges, and the enemy's collision shape somehow displaces itself as the enemy moves).

PLAYER CODE:


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)

ENEMY CODE:


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()


Upvotes: 0

Views: 1379

Answers (1)

Bugfish
Bugfish

Reputation: 1729

Since it worked, I will add it as an official answer:

you only move the character in your physics_process as long as he is still alive:

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

Add an else statement for 'if is_dead == false' which moves the node on y direction as long as its not on the ground. Something like that should work:

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)

Upvotes: 0

Related Questions