92 lines
2.3 KiB
Lua
92 lines
2.3 KiB
Lua
function element:animate(name, state, animationtime)
|
|
local start = {
|
|
x = self.x,
|
|
y = self.y,
|
|
w = self.w,
|
|
h = self.h,
|
|
color = self.color,
|
|
backcolor = self.backcolor,
|
|
bordercolor = self.bordercolor,
|
|
borderwidth = self.borderwidth,
|
|
fontsize = self.fontsize
|
|
}
|
|
|
|
local _end = {}
|
|
for k, v in pairs(start) do
|
|
_end[k] = state[k] or v
|
|
end
|
|
|
|
local diffs = {}
|
|
for k, v in pairs(_end) do
|
|
if (type(v) == "table") then
|
|
local value = {}
|
|
local different = false
|
|
|
|
for _k, _v in pairs(v) do
|
|
value[_k] = _v - start[k][_k]
|
|
if (value[_k] ~= 0) then
|
|
different = true
|
|
end
|
|
end
|
|
|
|
if (different) then
|
|
diffs[k] = value
|
|
end
|
|
else
|
|
local value = v - start[k]
|
|
if (value ~= 0) then
|
|
diffs[k] = v - start[k]
|
|
end
|
|
end
|
|
end
|
|
|
|
local timeout = nil
|
|
local interval = nil
|
|
local starttime = game:time()
|
|
|
|
interval = game:onframe(function()
|
|
local time = game:time()
|
|
local percentage = (time - starttime) / animationtime
|
|
|
|
if (percentage >= 1) then
|
|
for k, v in pairs(diffs) do
|
|
self[k] = _end[k]
|
|
end
|
|
else
|
|
for k, v in pairs(diffs) do
|
|
if (type(v) == "table") then
|
|
local value = {}
|
|
|
|
for _k, _v in pairs(v) do
|
|
value[_k] = start[k][_k] + _v * percentage
|
|
end
|
|
|
|
self[k] = value
|
|
else
|
|
self[k] = start[k] + v * percentage
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
timeout = game:ontimeout(function()
|
|
interval:clear()
|
|
for k, v in pairs(diffs) do
|
|
self[k] = _end[k]
|
|
end
|
|
end, animationtime)
|
|
|
|
self:onnotifyonce("cancel_animation", function(_name)
|
|
if (name == _name) then
|
|
timeout:clear()
|
|
interval:clear()
|
|
end
|
|
end)
|
|
end
|
|
|
|
function element:cancelanimations(name, callback)
|
|
self:notify("cancel_animation", name)
|
|
if (type(callback) == "function") then
|
|
game:ontimeout(callback, 0)
|
|
end
|
|
end |