Files
Techmino/Zframework/message.lua
2023-12-04 20:02:12 +08:00

154 lines
3.8 KiB
Lua

local ins,rem=table.insert,table.remove
local max=math.max
local mesList={}
local mesIcon={
check=GC.DO{40,40,
{'setLW',10},
{'setCL',0,0,0},
{'line',4,19,15,30,36,9},
{'setLW',6},
{'setCL',.7,1,.6},
{'line',5,20,15,30,35,10},
},
info=GC.DO{40,40,
{'setCL',.2,.25,.85},
{'fCirc',20,20,15},
{'setCL',1,1,1},
{'setLW',2},
{'dCirc',20,20,15},
{'fRect',18,11,4,4},
{'fRect',18,17,4,12},
},
broadcast=GC.DO{40,40,
{'setCL',1,1,1},
{'fRect',2,4,36,26,3},
{'fPoly',2,27,2,37,14,25},
{'setCL',.5,.5,.5},
{'fRect',6,11,4,4,1},{'fRect',14,11,19,4,1},
{'fRect',6,19,4,4,1},{'fRect',14,19,19,4,1},
},
warn=GC.DO{40,40,
{'setCL',.95,.83,.4},
{'fPoly',20.5,1,0,38,40,38},
{'setCL',0,0,0},
{'dPoly',20.5,1,0,38,40,38},
{'fRect',17,10,7,18,2},
{'fRect',17,29,7,7,2},
{'setCL',1,1,1},
{'fRect',18,11,5,16,2},
{'fRect',18,30,5,5,2},
},
error=GC.DO{40,40,
{'setCL',.95,.3,.3},
{'fCirc',20,20,19},
{'setCL',0,0,0},
{'dCirc',20,20,19},
{'setLW',6},
{'line',10.2,10.2,29.8,29.8},
{'line',10.2,29.8,29.8,10.2},
{'setLW',4},
{'setCL',1,1,1},
{'line',11,11,29,29},
{'line',11,29,29,11},
},
music=GC.DO{40,40,
{'setLW',2},
{'dRect',1,3,38,34,3},
{'setLW',4},
{'line',21,26,21,10,28,10},
{'fElps',17,26,6,5},
},
}
local MES={}
local backColors={
check={.3,.6,.3,.7},
broadcast={.3,.3,.6,.8},
warn={.4,.4,.2,.9},
error={.4,.2,.2,.9},
music={.2,.4,.4,.9},
other={.5,.5,.5,.7},
}
function MES.new(icon,str,time)
local color=backColors.other
if type(icon)=='string' then
color=TABLE.shift(backColors[icon] or color)
icon=mesIcon[icon]
end
local text=GC.newText(FONT.get(30),str)
local w=math.max(text:getWidth()+(icon and 45 or 5),200)+15
local h=math.max(text:getHeight(),46)+2
local k=h>400 and 1/math.min(h/400,2.6) or 1
ins(mesList,1,{
startTime=.26,
endTime=.26,
time=time or 3,
color=color,
text=text,icon=icon,
w=w,h=h,k=k,
y=-h,
})
end
function MES.update(dt)
for i=#mesList,1,-1 do
local m=mesList[i]
if m.startTime>0 then
m.startTime=max(m.startTime-dt,0)
elseif m.time>0 then
m.time=max(m.time-dt,0)
elseif m.endTime>0 then
m.endTime=m.endTime-dt
else
rem(mesList,i)
end
if i>1 then
local _m=mesList[i-1]
m.y=MATH.expApproach(m.y,_m.y+_m.h*_m.k+3,dt*26)
else
m.y=MATH.expApproach(m.y,3,dt*26)
end
end
end
function MES.draw()
if #mesList>0 then
GC.setLineWidth(2)
for i=1,#mesList do
local m=mesList[i]
local a=3.846*(m.endTime-m.startTime)
GC.push('transform')
GC.translate(3+SCR.safeX,m.y)
GC.scale(m.k)
GC.setColor(m.color[1],m.color[2],m.color[3],m.color[4]*a)
GC.rectangle('fill',0,0,m.w,m.h,8)
GC.setColor(.62,.62,.62,a*.626)
GC.rectangle('line',1,1,m.w-2,m.h-2,4)
GC.setColor(1,1,1,a)
if m.icon then
GC.draw(m.icon,4,4,nil,40/m.icon:getWidth(),40/m.icon:getHeight())
end
GC.simpY(m.text,m.icon and 50 or 10,m.h/2)
GC.pop()
end
end
end
function MES.traceback()
local mes=
debug.traceback('',1)
:gsub(': in function',', in')
:gsub(':',' ')
:gsub('\t','')
MES.new('error',mes:sub(
mes:find("\n",2)+1,
mes:find("\n%[C%], in 'xpcall'")
),5)
end
return MES