Исходник Ease — Создаём тайм-лайн переходы

Cosmo

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

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

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

https://i.imgur.com/uxiRocj.gif

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

Что делает библиотека?
Экспортирует функцию для вычисления значения, вот её синтаксис:
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_demo.lua
    3.4 KB · Просмотры: 24
  • ease.lua
    4.8 KB · Просмотры: 35
Последнее редактирование:

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

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