GDscript: стрелять пуля после завершения анимации - PullRequest
0 голосов
/ 19 октября 2018

Я создаю простую 2d платформенную игру. Моя проблема в том, что в одной из моих анимаций пулю / кость необходимо создать после завершения анимации.Прямо сейчас он создает Кость и одновременно запускает анимацию.

Я пытался поместить создание снаряда Кости в onanimation_complete, но тогда он позволит мне стрелять, только если мой персонаж направлен влево(направление задается нажатием клавиши «а»).Я что-то упускаю?

Вот код, если это помогает.Спасибо!

extends KinematicBody2D

const WALK = 40
const SPRINT = 70
const GRAVITY = 10
const JUMP = -250
const FLOOR = Vector2(0, -1)

const BONE = preload("res://Bone.tscn")

var is_attacking = false

var velocity = Vector2()
var on_ground = true

func _physics_process(delta):
    if Input.is_action_pressed("D"):
        if is_attacking == false:
            velocity.x = WALK 
            $Player_Animation.play("Player_Run")
            $Player_Animation.flip_h = true
            if sign($Position2D.position.x) == -1:
                $Position2D.position.x *= -1

    elif Input.is_action_pressed("A"):
        if is_attacking == false:
            velocity.x = -WALK 
            $Player_Animation.play("Player_Run") 
            $Player_Animation.flip_h = false
            if sign($Position2D.position.x) == 1:
                $Position2D.position.x *= -1

    else:
        velocity.x = 0
        if on_ground == true && is_attacking == false:
            $Player_Animation.play("Player_Idle")

    if Input.is_action_just_pressed("Space"):
        if is_attacking == false:
            if on_ground == true:
                velocity.y = JUMP
                on_ground = false

    if Input.is_action_just_pressed( "ui_focus_next") && is_attacking == false:

        is_attacking = true
        $Player_Animation.play("Player_Attack")
        var bone = BONE.instance()
        if sign($Position2D.position.x) == 1:
            bone.set_bone_direction(-1)
        else:
            bone.set_bone_direction(1)
        get_parent().add_child(bone)
        bone.position = $Position2D.global_position

    velocity.y = velocity.y + GRAVITY

    if is_on_floor():
        on_ground = true
    else:
        if is_attacking == false:
            on_ground = false
            if velocity.y < 0:
                $Player_Animation.play("Player_Jump")
            else:
                $Player_Animation.play("Player_Fall")

    velocity = move_and_slide(velocity, FLOOR)



func _on_Sprite_animation_finished():
    is_attacking = false

1 Ответ

0 голосов
/ 19 октября 2018

Вероятно, самым простым решением было бы добавить задержку пули в виде узла таймера.Это будет работать в основном так: играть анимацию и запускать таймер одновременно.Если таймер достигает 0 во время воспроизведения анимации, активируйте снаряд.Вы устанавливаете таймер на точное время, которое проходит от начала анимации до времени, когда вы хотите, чтобы снаряд появился.Я с большим успехом использовал эту технику в других анимациях.На самом деле, во время анимации можно вызвать много эффектов в разных точках.

http://docs.godotengine.org/en/3.0/classes/class_timer.html

...