Плавные изменения - 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.


Далее ->
<- Назад

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