Исходник Ease — Плавные переходы

Cosmo

Известный
Автор темы
Друг
656
2,745
» Ease.lua

Это библиотека на языке Lua, предоставляющая набор функций интерполяции (easing functions) для создания плавных анимаций. Библиотека поддерживает широкий спектр анимационных функций, таких как линейные, квадратичные, кубические, синусоидальные, экспоненциальные и эластичные переходы. Она идеально подходит для разработки мини-игр, интерфейсов и любых функций, где требуются плавные переходы между двумя значениями.

demo.gif

Поддерживаемые функции интерполяции:
  • Линейные: linear
  • Синусоидальные: inSine, outSine, inOutSine
  • Квадратичные: inQuad, outQuad, inOutQuad
  • Кубические: inCubic, outCubic, inOutCubic
  • Квартетные: inQuart, outQuart, inOutQuart
  • Пятой степени: inQuint, outQuint, inOutQuint
  • Экспоненциальные: inExpo, outExpo, inOutExpo
  • Циркулярные: inCirc, outCirc, inOutCirc
  • Эластичные: inElastic, outElastic, inOutElastic
  • Пружинные: inBounce, outBounce, inOutBounce
Подробнее о этих функциях и наглядные примеры их использования можно посмотреть на этом сайте: https://easings.net/

Установка и использование:
1. Поместить ease.lua в папку moonloader/lib
2. Подключить модуль вначале своего скрипта:
Lua:
local Ease = require("Ease")

Примеры использования:
Описание:
Изменение значения от 0 до 100 за 2 секунды с квадратичной функцией интерполяции

1. С использованием callback функции (единоразовый вызов)
Lua:
Ease(0, 100, os.clock(), 2, "inQuad", function(value, status)
    print(value) -- текущее значение
    if status == 2 then
        print("Анимация завершена")
    end
end)

2. Постоянный вызов в цикле/onFrame
Lua:
local start_time = os.clock()

while true do
    wait(0)
    local value, status = Ease(0, 100, start_time, 2, "inQuad")
    if status < 2 then
        print(value)
    end
end

Статусы интерполяции:
0 - ожидание начала процесса (value == from)
1 - процесс изменения значения (from < value < dest)
2 - процесс завершён (value == dest)
 

Вложения

  • ease_demo.lua
    3.4 KB · Просмотры: 45
  • ease.lua
    4.8 KB · Просмотры: 139
Последнее редактирование:

sergey petrov

Новичок
5
1
» Ease.lua

Всем привет!
Это уже моя вторая библиотека, которую я делал в первую очередь для себя, а саму её идею развиваю уже не первый год!
Я, как любитель поизвращаться с imgui, всегда стараюсь добавить анимации каким-либо элементам интерфейса. И вот спустя почти два года таких экспериментов, я хочу представить вам данную библиотеку для создания красоты в ваших поделках. Ранее вы могли видеть сниппеты от меня в этом направлении, а так же их использование во многих проектах (например этом), но сейчас хочу представить это в виде отдельной темы, а точнее полноценной библиотеки.

Что это такое?
Библиотека для получения динамического значения на основе тайм-лайн вычислений (без привязки к FPS) с возможностью использования easing-функций. Использование доступно в двух вариантах: постоянный вызов в цикле, либо и с использованием callback-функции (единоразовый вызов)

Посмотреть вложение 224622
Пример использования библиотеки (демонстрация работы)

Что делает библиотека?
Экспортирует функцию для вычисления значения, вот её синтаксис:
Lua:
-- * - обязательные аргументы
--- @param from*        float: начальное значение
--- @param dest*        float: конечное значение
--- @param start_time   float: время начала анимации
--- @param duration*    float: время выполнения анимации
--- @param easing       string: тип функции интерполяции (например, "linear", "easeInQuad" и т. д.)
--- @param callback     function: функция обратного вызова (не обязательный аргумент)
--- @return result      lua_thread/float: при callback использовании вернёт хэндлер потока, при обычном - значение
--- @return status      int: (только при обычном использовании) состояние выполнения функции (0-2)

result, status = ease(from, dest, start_time, duration, easing, callback)

Примеры использования:
Lua:
local ease = require "ease"

function main()
    -- Начальное и конечное значение
    local A, B = 0, 1
    -- Время начала вычисления (через 5 секунд)
    local start_time = os.clock() + 5
    -- Длительность перехода от A к B (3 секунды)
    local duration = 3.0
    -- Функция сглаживания (в данном случае нет, то-есть линейная)
    local ease_method = "linear"
  
    while true do
        local value, status = ease(A, B, start_time, duration, ease_method)
        if status == 1 then
            print(value)
        end
        wait(0)
    end
end
Описание: Через 5 секунд после запуска скрипта в консоль начнутся выводится числа от 0 до 100, status в нашем случае возвращает информацию о том, на каком сейчас этапе выполнение

Статусы:
0 - ожидание начала выполнения (значение from)
1 - идёт выполнение
2 - выполнено (значение dest)
Lua:
require "moonloader"
local ease = require "ease"

local A, B = 0, 1
local duration = 3.0
local ease_method = "linear"

-- Создаём заранее переменные для значения, статуса и тела потока
local value = A
local status = 0
local thread = nil

function main()
    if isKeyJustPressed(VK_SPACE) then
        -- Завершаем предыдущее выполнение, если оно ещё не закончилось
        if thread ~= nil and not thread.dead then
            thread:terminate()
        end
        -- Время начала можно не указывать, укажется автоматически текущее
        -- Создаётся отдельный поток, в котором выполняется вычисление
        thread = ease(A, B, nil, duration, ease_method, function(v, st)
            value = A
            status = st
        end)
    end
  
    while true do
        if status == 1 then
            print(value)
        end
        wait(0)
    end
end
Описание: Как видим, функция не вызывается постоянно в цикле, а всего лишь один раз, при нажатии на пробел, но тем не менее значение value будет изменятся в отдельном созданном библиотекой потоке

Итог:
Чем больше у вас кадров в секунду, тем больше раз изменится значение и тем меньше будет иметь расстояние до предыдущего, но так или иначе это займёт ровно N секунд. Таким образом можно создавать анимации на основе этого значения, которые всегда будут выполнятся с одинаковой скоростью на любой частоте кадров. При желании можно указать тип для анимации с использование easing-функций (прямиком из css). Подробнее о них можно узнать и увидеть их визуальное представление можно на сайте: https://easings.net/, так же я создал небольшой демо-скрипт с примером использования этих функций.

  • inSine, outSine, inOutSine
  • inQuad, outQuad, inOutQuad
  • inCubic, outCubic, inOutCubic
  • inQuart, outQuart, inOutQuart
  • inQuint, outQuint, inOutQuint
  • inExpo, outExpo, inOutExpo
  • inCirc, outCirc, inOutCirc
  • inBack, outBack, inOutBack
  • inElastic, outElastic, inOutElastic
  • inBounce, outBounce, inOutBounce

Установка:
Поместить ease.lua в папку moonloader/lib
Файл ease_demo.lua является демонстрацией работы данной библиотеки, его скачивать не обязательно

GitHub: https://github.com/c0sui/ease_lua
а как этим пользоваться ? На кнопку ( пробел ) -- не работает .

» Ease.lua

Всем привет!
Это уже моя вторая библиотека, которую я делал в первую очередь для себя, а саму её идею развиваю уже не первый год!
Я, как любитель поизвращаться с imgui, всегда стараюсь добавить анимации каким-либо элементам интерфейса. И вот спустя почти два года таких экспериментов, я хочу представить вам данную библиотеку для создания красоты в ваших поделках. Ранее вы могли видеть сниппеты от меня в этом направлении, а так же их использование во многих проектах (например этом), но сейчас хочу представить это в виде отдельной темы, а точнее полноценной библиотеки.

Что это такое?
Библиотека для получения динамического значения на основе тайм-лайн вычислений (без привязки к FPS) с возможностью использования easing-функций. Использование доступно в двух вариантах: постоянный вызов в цикле, либо и с использованием callback-функции (единоразовый вызов)

Посмотреть вложение 224622
Пример использования библиотеки (демонстрация работы)

Что делает библиотека?
Экспортирует функцию для вычисления значения, вот её синтаксис:
Lua:
-- * - обязательные аргументы
--- @param from*        float: начальное значение
--- @param dest*        float: конечное значение
--- @param start_time   float: время начала анимации
--- @param duration*    float: время выполнения анимации
--- @param easing       string: тип функции интерполяции (например, "linear", "easeInQuad" и т. д.)
--- @param callback     function: функция обратного вызова (не обязательный аргумент)
--- @return result      lua_thread/float: при callback использовании вернёт хэндлер потока, при обычном - значение
--- @return status      int: (только при обычном использовании) состояние выполнения функции (0-2)

result, status = ease(from, dest, start_time, duration, easing, callback)

Примеры использования:
Lua:
local ease = require "ease"

function main()
    -- Начальное и конечное значение
    local A, B = 0, 1
    -- Время начала вычисления (через 5 секунд)
    local start_time = os.clock() + 5
    -- Длительность перехода от A к B (3 секунды)
    local duration = 3.0
    -- Функция сглаживания (в данном случае нет, то-есть линейная)
    local ease_method = "linear"
  
    while true do
        local value, status = ease(A, B, start_time, duration, ease_method)
        if status == 1 then
            print(value)
        end
        wait(0)
    end
end
Описание: Через 5 секунд после запуска скрипта в консоль начнутся выводится числа от 0 до 100, status в нашем случае возвращает информацию о том, на каком сейчас этапе выполнение

Статусы:
0 - ожидание начала выполнения (значение from)
1 - идёт выполнение
2 - выполнено (значение dest)
Lua:
require "moonloader"
local ease = require "ease"

local A, B = 0, 1
local duration = 3.0
local ease_method = "linear"

-- Создаём заранее переменные для значения, статуса и тела потока
local value = A
local status = 0
local thread = nil

function main()
    if isKeyJustPressed(VK_SPACE) then
        -- Завершаем предыдущее выполнение, если оно ещё не закончилось
        if thread ~= nil and not thread.dead then
            thread:terminate()
        end
        -- Время начала можно не указывать, укажется автоматически текущее
        -- Создаётся отдельный поток, в котором выполняется вычисление
        thread = ease(A, B, nil, duration, ease_method, function(v, st)
            value = A
            status = st
        end)
    end
  
    while true do
        if status == 1 then
            print(value)
        end
        wait(0)
    end
end
Описание: Как видим, функция не вызывается постоянно в цикле, а всего лишь один раз, при нажатии на пробел, но тем не менее значение value будет изменятся в отдельном созданном библиотекой потоке

Итог:
Чем больше у вас кадров в секунду, тем больше раз изменится значение и тем меньше будет иметь расстояние до предыдущего, но так или иначе это займёт ровно N секунд. Таким образом можно создавать анимации на основе этого значения, которые всегда будут выполнятся с одинаковой скоростью на любой частоте кадров. При желании можно указать тип для анимации с использование easing-функций (прямиком из css). Подробнее о них можно узнать и увидеть их визуальное представление можно на сайте: https://easings.net/, так же я создал небольшой демо-скрипт с примером использования этих функций.

  • inSine, outSine, inOutSine
  • inQuad, outQuad, inOutQuad
  • inCubic, outCubic, inOutCubic
  • inQuart, outQuart, inOutQuart
  • inQuint, outQuint, inOutQuint
  • inExpo, outExpo, inOutExpo
  • inCirc, outCirc, inOutCirc
  • inBack, outBack, inOutBack
  • inElastic, outElastic, inOutElastic
  • inBounce, outBounce, inOutBounce

Установка:
Поместить ease.lua в папку moonloader/lib
Файл ease_demo.lua является демонстрацией работы данной библиотеки, его скачивать не обязательно

GitHub: https://github.com/c0sui/ease_lua
спасибо ! получилось .
 
Последнее редактирование:
  • Ха-ха
Реакции: qwеty

chromiusj

Известный
Модератор
5,662
3,963
Стоп, твоя тема выложена на бластхак 15.12.2023, а вот эта (https://www.blast.hk/threads/197397/) , 13.12.2023. Твоя говоришь?
штоо шок
 
  • Нравится
Реакции: Cosmo