(phixonline)-->
--
-- demo\rosetta\Matrix_Digital_Rain.exw
--
with javascript_semantics
sequence sushii = {}, -- w x h of unicode char strings
colours, -- """ of their fading colours
droplets -- w column droplets, or zeroes
include pGUI.e
Ihandle dlg, canvas, timer
cdCanvas cddbuffer, cdcanvas
procedure rain(integer w,h)
for x=1 to w do
integer y = droplets[x]
if y or rand(40)=1 then
if y<h then
droplets[x] = y+1
sushii[y+1][x] = utf32_to_utf8({0x30A0 + rand(96)})
colours[y+1][x] = CD_WHITE
end if
if y then
bool clear_droplet = true
if colours[y][x]=CD_WHITE then
colours[y][x] = #00F800 -- (CD_GREEN to nearest #800)
clear_droplet = false
y -= 1
end if
while y>=1 do
integer cy = colours[y][x]
if cy=0 then exit end if
clear_droplet = false
cy -= #000800
colours[y][x] = cy
y -= 1
end while
if clear_droplet then
droplets[x] = 0
end if
end if
end if
end for
end procedure
function redraw_cb(Ihandle /*ih*/, integer /*posx*/, /*posy*/)
integer {w,h} = IupGetIntInt(canvas, "DRAWSIZE"),
{dx,dy} = cdCanvasGetTextSize(cddbuffer, "W")
w = max(1,floor(w/dx))
h = max(1,floor(h/dy))
if length(sushii)!=h
or length(sushii[1])!=w then
sushii = repeat(repeat(" ",w),h)
colours = repeat(repeat(CD_BLACK,w),h)
droplets = repeat(0,w)
end if
cdCanvasActivate(cddbuffer)
cdCanvasClear(cddbuffer)
rain(w,h)
for x=1 to w do
for y=1 to h do
if colours[y][x] then
cdCanvasSetForeground(cddbuffer, colours[y][x])
cdCanvasText(cddbuffer,x*dx, (h-y)*dy, sushii[y][x])
end if
end for
end for
cdCanvasFlush(cddbuffer)
return IUP_DEFAULT
end function
function timer_cb(Ihandle /*ih*/)
IupUpdate(canvas)
return IUP_IGNORE
end function
function map_cb(Ihandle ih)
cdcanvas = cdCreateCanvas(CD_IUP, ih)
cddbuffer = cdCreateCanvas(CD_DBUFFER, cdcanvas)
cdCanvasSetBackground(cddbuffer, CD_BLACK)
return IUP_DEFAULT
end function
procedure main()
IupOpen()
IupSetGlobal("UTF8MODE","YES")
canvas = IupCanvas("RASTERSIZE=640x480")
IupSetCallbacks(canvas, {"MAP_CB", Icallback("map_cb"),
"ACTION", Icallback("redraw_cb")})
timer = IupTimer(Icallback("timer_cb"), 50)
dlg = IupDialog(canvas,`TITLE="Matrix Digital Rain"`)
IupShow(dlg)
IupSetAttribute(canvas, "RASTERSIZE", NULL)
if platform()!=JS then
IupMainLoop()
IupClose()
end if
end procedure
main()