Как изменить текстуру AnimatedSprite программно

#godot

#годо

Вопрос:

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

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

Если я отредактирую файл tscn и установлю другое изображение, оно сделает то, что я хочу.

Я попытался обновить atlas свойство кадров анимации, но это влияет на все экземпляры сцены:

 func update_texture(value: Texture):  for animation in $AnimatedSprite.frames.animations:  for frame in animation.frames:  frame.atlas = value  

Я также попытался клонировать SpriteFrames экземпляр, вызвав duplicate(0) , обновив его указанным выше кодом, а затем установив $AnimatedSprite.frames , но это также обновляет все экземпляры сцены.

Как правильно изменить текстуру конкретного экземпляра AnimatedSprite?

Ответ №1:

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

 func update_texture(texture: Texture):  var reference_frames: SpriteFrames = $AnimatedSprite.frames  var updated_frames = SpriteFrames.new()    for animation in reference_frames.get_animation_names():  if animation != "default":  updated_frames.add_animation(animation)  updated_frames.set_animation_speed(animation, reference_frames.get_animation_speed(animation))  updated_frames.set_animation_loop(animation, reference_frames.get_animation_loop(animation))    for i in reference_frames.get_frame_count(animation):  var updated_texture: AtlasTexture = reference_frames.get_frame(animation, i).duplicate()  updated_texture.atlas = texture  updated_frames.add_frame(animation, updated_texture)   updated_frames.remove_animation("default")   $AnimatedSprite.frames = updated_frames