Как перейти к позиции в анимации с анимационным проигрывателем в Годо? - PullRequest
1 голос
/ 31 мая 2019

Я делаю игру в Godot и должен сохранить позицию анимации, потому что анимация приостанавливается другой. Я хочу продолжить анимацию там, где она была раньше, и поэтому мне нужно сохранить позицию анимации, а затем установить ее на сохраненное значение.

Я пытался установить его (не работал), и в документации и других местах в Интернете я не нашел ничего полезного.

Это скрипт на нем:

extends KinematicBody2D

onready var animation_player = $AnimationPlayer

var hurt_anim_playing: bool = false
var hurt_anim_progress: float = 0

func _ready():
    animation_player.play("idle")
    pass

func _physics_process(delta): 
    # for each touching heart, get hurt
    for body in hitbox.get_overlapping_bodies(): 
        if body.has_method("heart"):
            G.health -= 1
            hurt_anim_playing = true
            hurt_anim_progress = animation_player.current_animation_position
            animation_player.play("hurt")
            update_sprite()
            body.queue_free()


func die():
    dieLayer.visible = true 
    get_tree().paused = true

func update_sprite():
    sprite.frame = G.max_health - G.health 
    if G.health == 0:
        die()


func _on_AnimationPlayer_animation_finished(anim_name):
    if anim_name == "hurt":
        hurt_anim_playing = false 
        animation_player.play("idle")
        animation_player.current_animation_position = hurt_anim_progress


На самом деле я хотел установить положение анимации и позволить анимации продолжаться там, где она остановилась, но вместо этого я получил ошибку

1 Ответ

0 голосов
/ 02 июня 2019

Проблема в том, что current_animation_position имеет только геттер, а не сеттер: https://docs.godotengine.org/en/3.1/classes/class_animationplayer.html#class-animationplayer-property-current-animation-position

Чтобы установить анимацию на определенную точку, вы можете использовать аванс (дельта с плавающей запятой), если вы хотите обрабатывать все между началом и точкой возобновления или поиском (с плавающей запятой, bool update = false), если вы просто хотите перейти на новую позицию. Вы можете проверить, если вам нужно установить обновление на true. Документация гласит: «Если обновление выполнено, анимация также обновляется, иначе она обновляется во время процесса».

Ваш код будет выглядеть так:

func _physics_process(delta): 
# for each touching heart, get hurt
for body in hitbox.get_overlapping_bodies(): 
    if body.has_method("heart"):
        G.health -= 1
        hurt_anim_playing = true
        hurt_anim_progress = animation_player.current_animation_position
        animation_player.play("hurt")
        update_sprite()
        body.queue_free()


func _on_AnimationPlayer_animation_finished(anim_name):
    if anim_name == "hurt":
        hurt_anim_playing = false 
        animation_player.play("idle")
        animation_player.seek(hurt_anim_progress) #maybe (hurt_anim_progress, true)
...