Перейти к основному содержимому

Вёрстка и анимация

Адаптивные размеры

Размеры задаются относительно 1920x1080 и подгоняются под монитор.

local width = Mantle.func.w(400)
local height = Mantle.func.h(300)

Анимация появления панели

local frame = vgui.Create('DFrame')
frame:SetTitle('Анимация')
frame:SetPos(200, 100)

Mantle.func.animate_appearance(frame, 400, 300, 5, 6, function()
print('Анимация завершена')
end, 0.8)
АргументТипОписание
panelobjectПанель
target_w, target_hintЦелевой размер панели
durationintДлительность роста в секундах. Например 5
alpha_durintДлительность проявления прозрачности. Например 6
callbackfuncВызывается после завершения анимации. Опционально
scale_factorintСтартовый размер в долях от целевого. По умолчанию 0.8

Плавный переход цвета

Каждый кадр цвет приближается к целевому. frac это скорость приближения за кадр (например 0.1).

local col = Mantle.color.theme

hook.Add('HUDPaint', 'Test', function()
col = Mantle.func.LerpColor(0.1, col, Color(182, 65, 65))

local w, h = 300, 120
local x, y = (ScrW() - w) / 2, (ScrH() - h) / 2

RNDX.Rect(x, y, w, h)
:Rad(16)
:Color(col)
:Draw()
end)

Экспоненциальное приближение

approachExp(current, target, speed, dt) плавно приближает значение к целевому. Подходит для инерционных движений: квадрат плавно съезжает вниз.

local offset = 0
local target = 200

hook.Add('HUDPaint', 'Test', function()
offset = Mantle.func.approachExp(offset, target, 10, FrameTime())

local w, h = 300, 120
local x, y = (ScrW() - w) / 2, (ScrH() - h) / 2

RNDX.Rect(x, y + offset, w, h)
:Rad(16)
:Color(Mantle.color.theme)
:Draw()
end)

Easing-функции

t это прогресс от 0 до 1. Квадрат ездит по экрану с ускорением/замедлением.

local duration = 2

hook.Add('HUDPaint', 'Test', function()
local elapsed = (CurTime() % duration) / duration

-- Быстрый старт, плавное окончание
local t = Mantle.func.easeOutCubic(elapsed)

-- Плавные старт, быстрое окончание
-- local t = Mantle.func.easeInOutCubic(elapsed)

local size = 50
local x = ScrW() * 0.1 + t * (ScrW() * 0.8 - size)

RNDX.Rect(x, ScrH() * 0.5, size, size)
:Color(Mantle.color.theme)
:Draw()
end)

Доступны две функции: easeOutCubic (быстрый старт, плавное окончание) и easeInOutCubic (плавные старт и окончание). Раскомментируйте нужную строку.

Ограничение позиции экраном

Не даёт панели выйти за границы экрана.

local menu = vgui.Create('DPanel')
menu:SetSize(200, 100)
menu:SetPos(ScrW() - 50, ScrH() - 50)

Mantle.func.ClampMenuPosition(menu)