Плавные изменения - TrueCat17/Ren-Engine GitHub Wiki
Система плавных изменений позволяет быстрым, понятным и компактным образом задать начальное состояние, конечное (при необходимости - несколько промежуточных), и в любой момент времени получить "текущее" состояние.
На данный момент эта система используется для появления/скрытия скринов паузы и истории диалогов.
Например, вот так реализованы "состояния" меню паузы:
pause_screen.pre_start_props = {
'xpos': 0.0,
'xanchor': 0.0,
'ypos': 0.0,
'yanchor': 1.0,
'alpha': 1,
'rotate': 0,
}
pause_screen.start_props = {
'xpos': 0.0,
'xanchor': 0.0,
'ypos': 1.0,
'yanchor': 1.0,
'alpha': 1,
'rotate': 0,
}
pause_screen.end_props = [
{
'xpos': 0.0,
'xanchor': 0.0,
'ypos': 1.0,
'yanchor': 1.0,
'alpha': 1,
'rotate': 15,
},
{
'xpos': 1.0,
'xanchor': 0.0,
'ypos': 2.0 + _sin(15),
'yanchor': 1.0,
'alpha': 1,
'rotate': 15,
},
]
pause_screen.appearance_time = 0.4
pause_screen.disappearance_time = [0.2, 0.2]
При появлении идёт переход pre_start
-> start
за время appearance_time
,
при закрытии start
-> end
за время disappearance_time
.
Т. к. end
- это список из 2 состояний, то и в disappearance_time
есть возможность указать время для перехода в каждое из них.
Скрин истории использует другие анимации:
history.pre_start_props = {
'xpos': 0,
'ypos': 0.5,
'xanchor': 1.0,
'yanchor': 0.5,
'alpha': 1.0,
}
history.start_props = {
'xpos': 0,
'ypos': 0.5,
'xanchor': 0.0,
'yanchor': 0.5,
'alpha': 1.0,
}
history.end_props = {
'xpos': 0,
'ypos': 0.5,
'xanchor': 0.0,
'yanchor': 0.5,
'alpha': 0.0,
}
При "запуске" плавных изменений идёт указание начального и конечного состояний, словарь для записи "текущего" состояния, время (возможно несколько, если конечных состояний тоже несколько) и функция, выполняющаяся в конце.
Когда нужно получить текущее состояние, вызывается функция обновления, которая обновляет словарь, переданный ранее для этой цели.
smooth_changes.start(name, start_props, end_props, res_props, change_time, on_end)
Здесь:
-
name
- имя изменения:'pause'
для скрина паузы, например; -
start_props
- начальное состояние; -
end_props
- конечное состояние (или несколько в списке); -
res_props
- словарь для "текущих" результатов; -
change_time
- время; -
on_end
- функция, выполняемая при достижении конечного состояния (илиNone
).
На самом деле, даже если "конечное" состояние не является списком, то оно воспринимается как список из 1 элемента.
Соответственно, тоже самое относится ко времени и функции on_end
.
Если кол-во конечных состояний N>1, а время - 1, то время будет списком длины N, элементы которого равны changed_time
.
Если кол-во конечных состояний N>1, а функция - 1, то функция будет списком длины N, все элементы которого
будут равны None
(ничего не делать), кроме последнего = on_end
.
В "состояниях" могут быть указаны не только изменяемые свойства,
но и функции для "нелинейной обработки времени" с суффиксом _time_func
.
Например, для ypos
это будет ypos_time_func
.
В качестве значения по умолчанию используется 'linear'
(обычное линейное время), но
это могут быть 'ease'
, 'easein'
и 'easeout'
, а также любая пользовательская функция,
имя которой будет указано в качестве строки.
Если начальное или конечное значение какого-то свойства является типом float
,
то "текущее" значение тоже будет в виде float
, иначе - в absolute
.
Если в "состояниях" указать какое-то неожиданное свойство (например, qwe
), то
оно будет изменяться как и все другие свойства, но
т. к. код, использующий "вычисленные текущие параметры",
об этом свойстве ничего не знает, оно будет просто проигнорировано.
Также не следует забывать, что свойство (за исключением функций времени), указанное в одном состоянии, обязательно должно быть и в другом состоянии, даже если оно не меняется.
smooth_changes.update(name)
После вызова этой функции, соответствующий res_props
, переданный в smooth_changes.start
,
будет содержать "текущие" значения.
smooth_changes.ended(name)
Вернёт False
, если изменение продолжается, иначе True
.