Технические подробности ВН спрайтов - TrueCat17/Ren-Engine GitHub Wiki
Здесь находится детальное описание реализации системы спрайтов-анимаций-эффектов.
Вам вряд ли это понадобится, если вы не собираетесь делать новые эффекты (совсем новые, а не fade4 = Fade(4.0)
).
Хотя можете и посмотреть, если интересно.
Но, вероятно, в происходящем здесь будет сложно разобраться неподготовленным и/или немотивированным людям.
Вас предупреждали.
Итак, поехали!
Далее идёт описание того, что происходит в файлах Ren-Engine/rpy/sprite*.rpy
(имеются ввиду несколько файлов) и
Ren-Engine/rpy/screens/sprites.rpy
.
В последнем содержатся функции set_scene
, show_sprite
и hide_sprite
,
а так же происходит отрисовка изображений в окно игры с помощью ScreenLang.
Также эффекты можно найти в Ren-Engine/rpy/sprite_effects/*.rpy
.
Есть такое понятие как спрайт (класс Sprite
).
Именно такими объектами оперируют команды scene
, show
и hide
.
Его отличие от изображения (класс SpriteAnimationData
) в том, что он может содержать в себе несколько изображений:
новое (new_data
) и старое (old_data
).
Под "старым" понимаются такие изображения, которые были до вызова текущей команды, например:
show np normal with dissolve
# Тут есть только новое (np normal), старое - пустое (None).
show np smile with dspr
# А тут уже оба: новое (np smile) и старое (np normal).
Так вот, спрайты содержат в себе:
- Список данных к отображению (свойство
data_list
):- Содержит как минимум
new_data
и/илиold_data
- любое может быть пустым, - Элементы списка -
SpriteAnimationData
- содержат в себе:- Свойства (
xpos
,ypos
,xsize
...), - Анимации (класс
SpriteAnimation
),
- Свойства (
- Содержит как минимум
- Эффект (мб и
None
, если он отсутствует).
Спрайты обновляются перед каждым кадром:
- При этом обновляются его данные (по порядку в
data_list
):- Которые также обновляют свои анимации,
- Эффект (если есть),
- Вложенные спрайты (в
contains
данных, если есть).
Важный момент: анимации не содержат в себе изображений, других анимаций, свойств и т. п.
Они просто являются набором действий, не больше.
Анимации сохраняют всё в свою data
, т. е. все 3 анимации имеют общее "хранилице данных".
Каждый экземпляр данных имеет:
-
image
- путь к файлу картинки, -
contains
- список из "вложенных" спрайтов:- Тут нужны именно спрайты, а не данные с анимациями, т. к. в будущем к ним будут применяться эффекты,
- Текущие значения свойств (
xpos
,ypos
,xsize
...), - Анимации (ATL) -
SpriteAnimation
, 3 штуки (decl_at
,at
,show_at
- порядок совпадает с главой про ATL),
Вернёмся к спрайтам.
При вызове команды show
есть 2 варианта развития событий:
- Спрайт с таким псевдонимом (обычно 1-е слово в имени) уже есть:
- Тогда новый спрайт получает в свойство
old_data
то, что у старого вnew_data
.
- Тогда новый спрайт получает в свойство
- Если же его нет:
- То свойство
old_data
будет пустым. Потом новый спрайт добавляется в нужное место в списокsprites_list
.
- То свойство
При вызове hide
ищется спрайт с указанным псевдонимом.
- Если эффект не указан:
- Этот спрайт просто удаляется.
- Если указан:
- Создаётся новый спрайт,
- Его
old_data
приравнивается кnew_data
, аnew_data
удаляется, - Свойство
hiding
ставится вTrue
(признак того, что спрайт исчезает), - При очередном обновлении спрайта эффект завершается, вызывается
remove_effect
(удаление эффекта), - И выясняется, что
hiding == True
, а значит - спрайт удаляется со сцены.
Упрощённая версия:
- Создаётся список для объектов, которые нужно будет отрисовать,
- Проходимся по каждому спрайту (перед этим вызвав его обновление), в нём - по каждому изображению в
data_list
, у каждого изображения вызываемget_all_data()
, - Эта функция возвращает текущее изображение + все вложенные в
contains
с посчитанными параметрами относительно родительского изображения:- Например, если есть изображение с
xpos
100 и в него вложено ещё одно сxpos
50, то она вернёт 2 изображения сxpos
100 и 150,
- Например, если есть изображение с
- Полученные результаты добавляем в список для отрисовки,
- После того, как всё добавили - отрисовываем каждый элемент списка.
Эта несложная схема нужна, чтобы отрисовать "дерево" спрайтов "линейным" циклом на ScreenLang.
Напоминание:
Примеры реализации эффектов можно найти в Ren-Engine/rpy/sprite_effects/*.rpy
.