Технические подробности ВН спрайтов - 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.
Спрайты обновляются перед отрисовкой каждого кадра:
- Все анимации,
- Все анимации вложенных спрайтов,
- Эффект (если есть),
- Вычисление "реальных" абсолютных свойств,
- Вычисление "реальных" абсолютных свойств для вложенных спрайтов.
"Реальные" свойства (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, чтобы трясти весь экран сразу.