Reputation: 13
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
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