#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