Технические подробности ВН спрайтов - 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
, чтобы трясти весь экран сразу.