cak3_lover
cak3_lover

Reputation: 1958

Meele attack animation freezing alternate solution

I had a script somewhat similar like in this video:

extends KinematicBody2D

var movement=Vector2(); 
var up= Vector2(0, -1); 
var speed=200;
var isAttacking=false; 

func _process(delta): 
    if Input.is_action_pressed("ui_right") && isAttacking == false:
        movement.x = speed;
        $AnimatedSprite.play("walk"); 
    elif Input.is_action_pressed("ui_left") && isAttacking == false: 
        movement.x= -speed;
        $AnimatedSprite.play("Walk"); 
    else: 
        movement.x = 0; 
        if isAttacking == false: 
            $AnimatedSprite.play("Idle"); 
    
    if Input.is_action_just_pressed("Attack"):
        $AnimatedSprite.play("Slash");
        isAttacking=true; 
    movement = move_and_slide(movement, up * delta); 
    
func _on_AnimatedSprite_animation_finished():
    if $AnimatedSprite.animation == "Slash": 
        isAttacking= false; 

but the problem was when I was rapidly pressing attack & movement on my keyboard
sometimes the isAttacking did not get set back to false after the animation was completed and hence froze my character animation

Maybe it was a bug in invoking the connected signal function when pressed rapidly? but anyhow it gave me a nightmare

so I came up with this workaround for rapid key pressing attack and movements (check the solutions) so no one else has to go through what I did :)

Upvotes: 0

Views: 169

Answers (1)

cak3_lover
cak3_lover

Reputation: 1958

Instead of checking for attack in _process() I used _unhandled_key_input() and this seemed to get rid of the problem

Hope this helps! :D

...

func _process(delta): 
    if Input.is_action_pressed("ui_right") && isAttacking == false:
        movement.x = speed;
        $AnimatedSprite.play("walk"); 
    elif Input.is_action_pressed("ui_left") && isAttacking == false: 
        movement.x= -speed;
        $AnimatedSprite.play("Walk"); 
    else: 
        movement.x = 0; 
        if isAttacking == false: 
            $AnimatedSprite.play("Idle"); 

    if Input.is_action_just_pressed("Attack"):
        $AnimatedSprite.play("Slash");
        isAttacking=true; 
    movement = move_and_slide(movement, up * delta); 


func attack_animation_finished(var _extra):
    isAttacking=false
    
func _unhandled_key_input(event):
    if(event.echo):
        return
    
    if(!event.pressed):
        return
    
    if(event.scancode==KEY_X and !isAttacking): # x key to attack (you can use whatever you like)
        isAttacking=true
    
        if!($AnimatedSprite.is_connected("animation_finished",self,"attack_animation_finished")): 
            $AnimatedSprite.connect("animation_finished", self, "attack_animation_finished", [], CONNECT_ONESHOT) # warning-ignore:return_value_discarded
        $AnimatedSprite.play("Slash");

Note: I haven't ran this particular code segment but I have used this logic/approach in a working larger script which would be too long to share here

Upvotes: 0

Related Questions