Технические подробности ВН спрайтов - TrueCat17/Ren-Engine GitHub Wiki

Здесь находится детальное описание реализации системы спрайтов-анимаций-эффектов.
Вам вряд ли это понадобится, если вы не собираетесь делать новые эффекты (совсем новые, а не fade4 = Fade(4.0)).

Хотя можете и посмотреть, если интересно. Но, вероятно, в происходящем здесь будет сложно разобраться неподготовленным и/или немотивированным людям.
Вас предупреждали.

И да, важно!, это описание не является документацией - в том смысле, что всё может в любой момент измениться, это внутренняя часть движка, которая не обязана сохранять обратную совместимость с предыдущей версией себя.


Предполагается, что статьи ATL (анимации и трансформации) и Изображения (ВН-спрайты) уже были прочтены ранее.

Итак, поехали! Далее идёт описание того, что происходит в файлах папки Ren-Engine/rpy/sprite/ и в Ren-Engine/rpy/screens/sprites.rpy.
В последнем содержатся функции sprites.set_scene, sprites.show и sprites.hide, а также происходит отрисовка изображений в окно игры с помощью ScreenLang.


Анимации

Важный момент: анимации не содержат в себе изображений, других анимаций, свойств и т. п.
Они просто являются набором действий, не больше.
Анимации сохраняют всё в свой спрайт, т. е. все 3 анимации имеют общее "хранилице данных".

Каждый спрайт содержит 3 анимации-трансформации: decl_at, at, show_at - порядок совпадает с главой про ATL


Спрайт

Есть такое понятие как спрайт (класс Sprite). Именно такими объектами оперируют команды scene, show и hide.

Спрайты содержат в себе:

  • Свойства - rotate, xpos, ypos, xsize...;
  • Изображение - image (мб None или пустой строкой);
  • Список вложенных (дочерних) спрайтов - contains;
  • Анимации - ATL (см. выше);
  • Эффект - effect (None - без эффекта или после его завершения);
  • Старый/предыдущий спрайт - old_sprite, используется в эффекте, мб None.

Спрайты обновляются перед отрисовкой каждого кадра:

  1. Все анимации,
  2. Все анимации вложенных спрайтов,
  3. Эффект (если есть),
  4. Вычисление "реальных" абсолютных свойств,
  5. Вычисление "реальных" абсолютных свойств для вложенных спрайтов.

"Реальные" свойства (real_alpha для alpha, например) используются для непосредственной отрисовки и учитывают: вложенность, домножение на масштаб, extra-параметры (устанавливаемые эффектом) и т. д.


Эффект

Эффект устанавливается спрайту как-то так: sprite.set_effect(dissolve, hiding = False).
Здесь:

  • sprite - нужный спрайт,
  • dissolve - нужный эффект,
  • hiding - нужно ли этот спрайт скрыть, не показывая чего-то взамен (True), или показать (скрывая sprite.old_sprite, если он не None) - False.

Эффект должен иметь методы:

  • copy(self, old_sprite, new_sprite) - возврат копии эффекта, которая будет работать с указанными спрайтами,
  • update(self) - обновление параметров,
  • remove(self) - вызывается при удалении (можно установить конечные значения параметров), может быть вызвано досрочно (при перемотке, например).

Также у него должно быть свойство removing_sprites - список спрайтов, которые будут удалены из списка отображаемых спрайтов.
Это удаление происходит в функции sprites.remove_effect_sprites, в которую передаётся текущий эффект. Вызывать её должен сам эффект в нужное время.
Например, Fade вызывает её после полного затемнения (середина эффекта), а Dissolve - в самом конце.

Изначально спрайт внутри метода set_effect добавляет в этот список предыдущий спрайт (если есть необходимость, т. е. существуют и эффект, и старый спрайт), но эффект (тот же Dissolve) может добавить туда дополнительный временный спрайт, который он создал для своей работы.

Эффекты могут (и должны) использовать специальные свойства спрайтов: extra_alpha, extra_rotate, extra_xzoom, extra_yzoom, extra_xpos и extra_ypos.
Они добавляются/перемножаются при вычислении "реальных" свойств, но не изменяют "исходные" свойства.

При изменении изображения (свойство image у спрайта), оно должно сохраняться не туда же, а в свойство res_image, чтобы (опять же) сохранить "исходное", оригинальное изображение. Изначально sprite.res_image = None.

Примеры реализации эффектов можно найти в Ren-Engine/rpy/sprite/effects/.


Специальные объекты

sprites.scene - спрайт-сцена, устанавливается командой scene, мб None.
Служит для оптимизации: эффекты могут определить, что спрайт является сценой, что иногда позволяет пойти по упрощённому пути (т. е. делать меньше вычислений и новых изображений).

sprites.overlay - спрайт-перекрытие, используется эффектом Fade, обновляется раньше всех, отрисовывается позже всех.
Интересная деталь: именно к этому спрайту применяется эффект, для которого не указано спрайтов:

"Some text."
with vpunch

Здесь with применяется к спрайтам, указанным выше этой строки в командах scene/show/hide, но первая же строка - это просто текст.

Свойства, применяемые к экрану спрайтов:

sprites.xsize   = sprites.ysize   = 1.0
sprites.xanchor = sprites.yanchor = 0.0
sprites.xpos    = sprites.ypos    = 0.0

Свойства xpos и ypos, например, используются в эффектах hpunch и vpunch, чтобы трясти весь экран сразу.

⚠️ **GitHub.com Fallback** ⚠️