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_incirc_outsine_insine_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-редактор — дайте знать 🎉

Updated 22 days ago
Published 27 days ago
StatusReleased
CategoryAssets
AuthorSveta532
GenreVisual Novel
Tags2D, Animation, Asset Pack, Kinetic Novel, Ren'Py
ContentNo generative AI was used

Download

Download
movecurve.rpy 27 kB

Leave a comment

Log in with itch.io to leave a comment.