add in-game chat & update gui post-runnables timing & fix panel elements removal
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
local lines = {}
|
||||
local dead_lines = {}
|
||||
local nextid = 0
|
||||
local timeout = 7
|
||||
local fadeout = 1
|
||||
local initialized = false
|
||||
local max_lines = 15
|
||||
local animation_fps = 30
|
||||
|
||||
local function remove_line(line)
|
||||
document[line[1]]:destruct()
|
||||
time.post_runnable(function() document.root:reposition() end)
|
||||
end
|
||||
|
||||
local function update_line(line, uptime)
|
||||
local diff = uptime - line[2]
|
||||
if diff > timeout then
|
||||
remove_line(line)
|
||||
table.insert(dead_lines, i)
|
||||
elseif diff > timeout-fadeout then
|
||||
local opacity = (timeout - diff) / fadeout
|
||||
document[line[1]].color = {0, 0, 0, opacity * 80}
|
||||
document[line[1].."L"].color = {255, 255, 255, opacity * 255}
|
||||
end
|
||||
end
|
||||
|
||||
events.on("core:chat", function(message)
|
||||
local current_time = time.uptime()
|
||||
local id = 'l'..tostring(nextid)
|
||||
document.root:add(gui.template("chat_line", {id=id}))
|
||||
document.root:reposition()
|
||||
document[id.."L"].text = message
|
||||
nextid = nextid + 1
|
||||
if #lines == max_lines then
|
||||
remove_line(lines[1])
|
||||
table.remove(lines, 1)
|
||||
end
|
||||
table.insert(lines, {id, current_time})
|
||||
end)
|
||||
|
||||
function on_open()
|
||||
if not initialized then
|
||||
initialized = true
|
||||
|
||||
document.root:setInterval(1/animation_fps, function ()
|
||||
local uptime = time.uptime()
|
||||
for _, line in ipairs(lines) do
|
||||
update_line(line, uptime)
|
||||
end
|
||||
if #dead_lines > 0 then
|
||||
for i = #dead_lines, 1, -1 do
|
||||
local index = dead_lines[i]
|
||||
table.remove(lines, i)
|
||||
end
|
||||
dead_lines = {}
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user