local ffi = require "ffi"
local bit = require "bit"
ffi.cdef [[
unsigned long __stdcall timeGetTime();
]]
local winmm = ffi.load("winmm.dll")
local bor, lshift = bit.bor, bit.lshift
local Animations = {}
local LINEAR = function(x) return x end
local SQUARED = function(x) return math.sqrt(x) end
local font = renderCreateFont("C:\\Windows\\Fonts\\arial.ttf", 14, 0)
function main()
-- "text_anim" - название анимации, нужно просто что бы анимации различались между собой
-- LINEAR - тип анимации, можно запихнуть туда любые математические операции.
-- В нашем случае это просто линейная анимация. SQUARED же - более плавная (в начале и конце - медленнее, в середине - быстрее)
-- 0.5 - скорость анимации, это просто число, чем больше - тем быстрее
local text_anim = Animations:get("text_anim", LINEAR, 0.5)
while not isSampAvailable() do wait(0) end
sampRegisterChatCommand("anim_reverse", function()
-- можем инвертировать анимацию
text_anim.reverse = not text_anim.reverse
end)
-- если уже создали анимацию, можем не передавать функцию и скорость
local anim = Animations:get("text_anim")
while true do
-- возвращает число между 0 и 1
local progress = anim:get()
-- какой-то наш цвет
local color = 0xFFFFFF
-- применяем прозрачность
local alpha = math.floor(progress * 255)
alpha = lshift(alpha, 24)
color = bor(color, alpha)
renderFontDrawText(font, "TEXT!!!", 500, 500, color)
wait(0)
end
end
function Animations:get(name, calc, speed)
if not self[name] then
self[name] = {
calc = calc,
speed = speed or 1,
last_time = winmm.timeGetTime(),
reverse = false,
progress = 0,
get = function(self)
local retval = self.calc(self.reverse and 1 - self.progress or self.progress)
local diff = (((winmm.timeGetTime() - self.last_time) / 1000) * speed)
self.progress = math.clamp(self.progress + (self.reverse and -diff or diff), 0.0, 1.0)
self.last_time = winmm.timeGetTime()
return self.reverse and 1 - retval or retval
end,
reset = function(self)
self.progress = self.reverse and 1 or 0
self.last_time = winmm.timeGetTime()
end
}
end
return self[name]
end
function math.clamp(v, min, max)
return math.max(math.min(v, max), min)
end