🌀 Curve — Spline Motion Statement for Ren'Py
Curve — это кастомный statement для Ren'Py, позволяющий двигать изображенья по сплайновым кривым (и не только) прямо из скрипта, без написания Python-кода. Поддерживает easing-функции, motion blur, авто-разворот спрайта, перспективу, warp-цепочки и анимацию произвольных transform-свойств по ключевым кадрам.
⚠️ GUI-редактора пока нет. Все точки задаются вручную координатами. Если кто-то захочет написать визуальный редактор — буду рада!
📦 Установка
Поместите файл (movecurve.rpy) в папку game/.
🚀 Базовый синтаксис
curve <image_tag> (x1, y1) (x2, y2) ... (xN, yN) [параметры]
Минимальный пример — движенье из точки A в точку Б:
curve eileen (0.2, 0.5) (0.8, 0.5)
Спрайт eileen проедет из (0.2, 0.5) в (0.8, 0.5) за 2 секунды (дефолт) с easing smooth.
Три точки — движенье через промежуточную позицию (сплайн):
curve eileen (0.1, 0.8) (0.5, 0.2) (0.9, 0.8) time 3.0
Координаты задаются в относительных единицах экрана: (0.0, 0.0) — верхний левый угол, (1.0, 1.0) — нижний правый.
⚙️ Параметры (inline, в той же строке(порядок:
параметр—формат—дефолт—описанье)):
time time <float> 2.0
Длительность анимации в секундах
blur blur <float> 4.0
Сила motion blur (нарастает и затухает на краях). 0 = выключен
anchor anchor (<x>, <y>) (0.5, 1.0)
Якорь спрайта (anchor point)
easing easing <name> smooth
Функция плавности (см. список ниже)
wait wait выкл
Ждать завершенья анимации (как pause)
nowait nowait дефолт
Явно указать «не ждать»
repeat repeat выкл
Зациклить анимацию
bounce bounce выкл
Зациклить с реверсом (туды-сюды)
autoflip autoflip выкл
Авто-отзеркаливать спрайт по горизонтали в зависимости от направления
движенья
perspective perspective (<vx>, <vy>, <strength>) нет
Имитация перспективы. (vx, vy) — точка схода, strength — сила (0–2)
with with <transition> нет
Применить transition при показе (напр. dissolve)
onlayer onlayer <name> master
Слой, на коем показать спрайт
zorder zorder <int> 0
Порядок отрисовки
behind behind <tag> нет
Показать за указанным спрайтом
as as <name> нет
Альтернативный тег (как стандартный as в show)
Пример со всеми основными параметрами:
curve eileen (0.1, 0.7) (0.5, 0.3) (0.9, 0.7) time 2.5 easing ease_in_out blur 6.0 anchor (0.5, 1.0) wait autoflip with dissolve
📐 Доступные easing-функции:
linear Без плавности — равномерное движенье
smooth Плавный старт и стоп (hermite, дефолт)
ease_in Плавный старт, резкий стоп
ease_out Резкий старт, плавный стоп
ease_in_out Плавный старт и стоп (quintic, более выраженный, чем smooth)
elastic «Пружинный» эффект с затухающими колебаньями
bounce «Отскок» в конце
back Небольшой откат назад перед финишем
expo_in Экспоненциальный старт (очень медленно → быстро)
expo_out Экспоненциальный стоп (быстро → очень медленно)
В warp-блоках дополнительно доступны: circ_in, circ_out, sine_in, sine_out.
🧱 Блочный синтаксис (расширенные возможности)
После двоеточия : можно задать блок с дополнительными командами: произвольные transform-свойства, warp-цепочки и keyframe-анимации.
Статические свойства (extra props)
Любое transform-свойство Ren'Py, записанное в блоке без специального ключевого слова, будет применено к спрайту на всё время анимации:
curve eileen (0.2, 0.5) (0.8, 0.5) time 2.0:
zoom 1.2
alpha 0.8
rotate 15
Warp-блоки — анимация свойств по времени
warp позволяет анимировать любое transform-свойство от начального до конечного значенья в пределах указанного временного интервала, независимо от основного движенья по кривой.
warp <start_time> <end_time> [easing]
<property> <start_value> <end_value>
...
Пример — плавное увеличение и поворот в первой половине анимации:
curve eileen (0.2, 0.8) (0.5, 0.2) (0.8, 0.8) time 3.0:
warp 0.0 1.5 smooth
zoom 0.8 1.3
rotate 0 -10
warp 1.5 3.0 ease_out
zoom 1.3 1.0
rotate -10 0
Здесь:
С 0 до 1.5 сек: zoom плавно меняется 0.8 → 1.3, rotate 0 → -10
С 1.5 до 3.0 сек: zoom 1.3 → 1.0, rotate -10 → 0
Easing каждого warp-сегмента задаётся отдельно
Если указать одно значенье вместо двух — свойство будет установлено статически (start = end).
Keyframe-блоки
keyframe — альтернативный способ заданья анимации свойств. Указывается момент времени и целевое значенье. Переходы между keyframe'ами создаются автоматически.
keyframe <time> [easing]
<property> <value>
...
Пример:
curve eileen (0.2, 0.5) (0.8, 0.5) time 4.0:
keyframe 0.0
zoom 1.0
alpha 1.0
keyframe 2.0 elastic
zoom 1.5
alpha 0.5
keyframe 4.0 smooth
zoom 1.0
alpha 1.0
Первый keyframe задаёт начальные значенья
Между keyframe'ами автоматически создаются warp-сегменты
Каждый keyframe может иметь свой easing (по умолч. smooth)
Важно: keyframe автоматически берёт конечное значенье пред-keyframe как начальное для следующего, обеспечивая непрерывность.
🎭 Autoflip
При включенном autoflip спрайт автоматически разворачивается (xzoom) в зависимости от горизонтального направления движенья по текущему сегменту кривой.
curve eileen (0.1, 0.5) (0.9, 0.5) (0.1, 0.5) time 3.0 repeat autoflip
Если в блоке задано xzoom, его абсолютное значение используется как базовое:
curve eileen (0.1, 0.5) (0.9, 0.5) time 2.0 autoflip:
xzoom 0.8
Спрайт будет 0.8 при движении вправо и -0.8 при движении влево.
🔭 Perspective (имитация перспективы)
Масштабирует спрайт в зависимости от расстоянья до заданной «точки схода» — чем ближе к ней, тем меньше спрайт.
curve eileen (0.1, 0.8) (0.5, 0.3) (0.9, 0.8) time 3.0 perspective (0.5, 0.0, 0.8)
(0.5, 0.0) — точка схода (верхний центр экрана)
0.8 — сила эффекта (0 = нет эффекта, 2 = максимум)
🔧 Бонусные Python-функции (transform'ы)
Помимо statement'а, в комплекте идут готовые transform-функции, кои можно использовать как самостоятельно через at, так и они используются внутренне:
curve_blur(duration, blur_amt, repeat, bounce) Motion blur с нарастаньем/затуханьем
curve_autoflip(points, duration, base_xzoom, repeat, bounce) Авто-разворот по направленью
curve_perspective(points, duration, vanishing_point, strength, repeat, bounce) Имитация глубины/перспективы
curve_depth_blur(points, duration, vanishing_point, max_blur, repeat, bounce) Размытие в зависимости от расстоянья до точки фокуса
curve_shake(intensity, frequency, duration, repeat, bounce, decay) Тряска с затуханьем
curve_wobble(amount, speed, duration, repeat, bounce) Покачиванье (rotation)
curve_pulse(min_scale, max_scale, speed, duration, repeat, bounce) Пульсация масштаба
curve_fade_distance(points, duration, fade_points, repeat, bounce)
Прозрачность, зависящая от расстоянья до заданных точек
curve_appear(duration, style) Анимация появленья ("fade", "zoom", "slide_up", "slide_down", "spin")
curve_disappear(duration, style) Анимация исчезновенья (те же стили)
extra_props_transform(props) Примененье словаря произвольных свойств как Transform
chain_warp_transform(warp_chain, duration, repeat, bounce) Цепочка warp-сегментов как единый Transform
Пример использованья shake отдельно от curve:
show eileen happy at center, curve_shake(10, 8, 1.5)
📋 Полный комплексный пример
# Персонаж идёт по дуге слева направо, с разворотом, перспективой,
# плавным измененьем прозрачности и масштаба, на слое "master"
curve eileen happy (0.1, 0.9) (0.3, 0.4) (0.7, 0.4) (0.9, 0.9) time 4.0 easing ease_in_out blur 3.0 autoflip bounce perspective (0.5, 0.0, 0.5) onlayer master zorder 5 with dissolve:
alpha 0.9
warp 0.0 2.0 smooth
zoom 0.7 1.2
warp 2.0 4.0 ease_out
zoom 1.2 0.7
🔮 SplineMotion (внутреннее устройство)
Движение по кривой реализовано через класс _SplineInterpolator, кой поддерживает:
Линейную интерполяцию (2 точки в сегменте)
Квадратичные кривые Безье (3 точки)
Кубические кривые Безье (4 точки)
Обёрнут в SplineMotion(points, time, ...), кой возвращает стандартный Motion displayable Ren'Py.
📄 Лицензия
Бесплатно. Делайте что хотите. Если сделаете GUI-редактор — дайте знать 🎉
rpy
movecurve.rpy27.04 Kb
Tekhnokrat
Это конечно хорошо, но нужен перевод)
Mar 15 22:02 

1
Светик_[Sveta532]
Tekhnokrat, ударило в голову сделать покраше xD
Mar 17 07:40