olibutler
olibutler

Reputation: 13

Animations overriding my attack animation in Godot 4?

This is my first time programming with Godot, and I'm trying to include a sword attack animation. However, other animations such as jumping, idling, or walking are overriding the sword animation.

I tried using the await function to wait until the sword animation is finished, then set the 'attacking' variable to false. This just plays the first frame of the sword animation, then it's overrided by another animation. I'm using an animation player set with the name 'anim' to play these animations, I would appreciate it if someone could help with this as I have very little experience with godot. Below you can find my entire code for the player:

extends CharacterBody2D

const normalspeed = 400.0
const JUMP_VELOCITY = -600.0
var jump_count = 0
var dashing = false
var attacking = false
var dash_count = 0
var stamina = 100
var game_running = true
var totaldashcount = 0
var player_moving = false
var frontflipping = false
var health = 100

const cooldown=preload("res://Scripts/Cooldown.gd")

@onready var dash_cooldown=cooldown.new(2)

const dashspeed = 2500
const dashlength = 0.15

@onready var dash = $Dash

var gravity = ProjectSettings.get_setting("physics/2d/default_gravity") * 1.7

@onready var anim = get_node("AnimationPlayer")


func _physics_process(delta):
    
    player_moving = false
    attacking = false
    dashing = false
    
    $/root/World/UI.update_stamina()
    $/root/World/UI.stamina_value(stamina)
    if stamina != 0.9:
        #print(stamina)
        $/root/World/UI.stamina_value(stamina)
    
    dash_cooldown.tick(delta)
    
    if Input.is_action_just_pressed("Dash") and stamina >= 100:
        if dash_count == 0:
            if velocity.x != 0:
                if attacking == false:
                    anim.play("Dash")
                dashing = true
                dash_count += 1
                totaldashcount += 1
                player_moving = true
                #$/root/World/UI.stamina_value(0)
            dash.start_dash(dashlength)
            dashing = true
            #$/root/World/UI.stamina_value(0)
            if velocity.x != 0:
                if attacking == false:
                    anim.play("Dash")
                dashing = true
                dash_count += 1
                totaldashcount += 1
                player_moving = true
                #$/root/World/UI.stamina_value(0)
            $/root/World/UI.update_stamina()
            stamina = 0     
        
    var speed = dashspeed if dash.is_dashing() else normalspeed
    
    if velocity.x != 0:
        player_moving = true
    else:
        player_moving = false
    
    # Add the gravity.
    if not is_on_floor():
        velocity.y += gravity * delta
    elif is_on_floor():
        velocity.y = 0
        jump_count = 0
        dash_count = 0
        
    if Input.is_action_just_pressed("ui_up") and is_on_floor() or Input.is_action_just_pressed("w") and is_on_floor():
        velocity.y = JUMP_VELOCITY
        if attacking == false:
            anim.play("Jump")
    
    var direction_letter = Input.get_axis("a", "d")
    var direction_arrow = Input.get_axis("ui_left", "ui_right")
    
    if direction_letter == -1:
        get_node("AnimatedSprite2D").flip_h = true
    elif direction_letter == 1:
        get_node("AnimatedSprite2D").flip_h = false
    if direction_arrow == -1:
        get_node("AnimatedSprite2D").flip_h = true
    elif direction_arrow == 1:
        get_node("AnimatedSprite2D").flip_h = false
        
    #WASD
    if direction_letter:
        velocity.x = direction_letter * speed
        if velocity.y == 0 and not dash.is_dashing() and velocity.x != 0:
            if attacking == false:
                anim.play("Walking")
    
    #ARROW KEYS MOVEMENT
    elif direction_arrow:
        velocity.x = direction_arrow * speed
        if velocity.y == 0 and not dash.is_dashing() and velocity.x != 0:
            if attacking == false:
                anim.play("Walking")
    else:
        velocity.x = move_toward(velocity.x, 0, speed)
        if velocity.y == 0:
            if attacking == false:
                anim.play("Idle")
            
    if velocity.y > 400 and dashing == true:
        if frontflipping == false:
            if not is_on_floor():
                if attacking == false:
                    anim.play("Fall")
    elif velocity.y > 100 and dashing == false:
        if frontflipping == false:
            if not is_on_floor():
                if attacking == false:
                    anim.play("Fall")       
        
    if velocity.y != 0 and Input.is_action_just_pressed("ui_up") or Input.is_action_just_pressed("w"):
        if jump_count == 0 or jump_count == 1:
            jump_count += 1
            velocity.y = JUMP_VELOCITY
            if jump_count == 2:
                if attacking == false:
                    anim.play("Frontflip")
                frontflipping = true

    if Input.is_action_just_pressed("ui_down") or Input.is_action_just_pressed("s"):
        $Area2D/CollisionShape2D.disabled = false
        attacking = true
        anim.current_animation = "Sword Attack"
    else:
        attacking = false
        $Area2D/CollisionShape2D.disabled = true
        
    print(attacking)
    move_and_slide()

func stamina_value_player(value):
    stamina = value
 
func _on_animation_player_animation_finished(anim_name):
    frontflipping = false


func _on_sword_hit_area_entered(area):
    if area.is_in_group("Ghost_Hitbox"):
        area.death()


func _on_area_2d_body_entered(body):
    if body.is_in_group("Hit"):
        body.take_damage()
    else:
        pass

Upvotes: 1

Views: 554

Answers (1)

Theraot
Theraot

Reputation: 40295

You are setting attacking back to false every frame, right here:

func _physics_process(delta):
    
    player_moving = false
    attacking = false # <-----

And I do not see any await in your code.

You could read current_animation:

func _physics_process(delta):
    
    player_moving = false
    attacking = anim.current_animation == "Sword Attack"

Upvotes: 0

Related Questions