🌀 Curve — Spline Motion Statement for Ren'Py
A downloadable curve
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,rotate0 → -10 - С 1.5 до 3.0 сек:
zoom1.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-редактор — дайте знать 🎉
| Updated | 22 days ago |
| Published | 27 days ago |
| Status | Released |
| Category | Assets |
| Author | Sveta532 |
| Genre | Visual Novel |
| Tags | 2D, Animation, Asset Pack, Kinetic Novel, Ren'Py |
| Content | No generative AI was used |


Leave a comment
Log in with itch.io to leave a comment.