Pico-8 - Lines Screensaver

Okay, so it’s not really a screensaver in this instance, but it’s the art from inside one. You recognize it. You’ve seen it before. But here it is… much lower res than usual. ;)

Source: https://gist.github.com/Fortyseven/a4e2d5d3105ed86e0916d162a1a4d466

pico-8 cartridge // http://www.pico-8.com
version 16
__lua__
-- lines (classic)
-- by fortyseven

SPACING = 4
SPEED = 1

function buildPolyVerts()
local verts = {
x=rnd(128),
y=rnd(128),
xvel= SPEED,
yvel= SPEED
};
if (rnd(1) > 0.5) verts.xvel = -verts.xvel
if (rnd(1) > 0.5) verts.yvel = -verts.yvel
return verts;
end;

-------------------------------------------------------------
poly = {}

function poly:init(i, color)
self.color = color
self.verts = {}

-- ensure we use the same seed for each poly object, so it will always
-- create the same intial x/y/velocity directions

for i = 1, 4 do
verts = buildPolyVerts()
add(self.verts,verts)
end

-- run the update a couple times to space them out

for i = 1, i*SPACING do self:update() end
end

function poly:update()
foreach(self.verts, function(vert)
vert.x += vert.xvel
if ((vert.x >= 128) or (vert.x <= 0)) vert.xvel = -vert.xvel
vert.y += vert.yvel
if ((vert.y >= 128) or (vert.y <= 0)) vert.yvel = -vert.yvel
end)
end

function poly:draw()
for i = 1, 3 do
color(self.color);
line(self.verts[i].x, self.verts[i].y, self.verts[i+1].x, self.verts[i+1].y)
end
line(self.verts[4].x, self.verts[4].y, self.verts[1].x, self.verts[1].y)
end

function poly:new(o)
self.__index = self
return setmetatable(o or {}, self)
end

-------------------------------------------------------------
polyCluster = {}

function polyCluster:init(col_array)
self.objects = {}
seed = flr(rnd(1000))

-- generate three unique polys
for i = 1, 3 do
srand(seed)
local o = poly:new()
o:init(i, col_array[i])
add(self.objects, o )
end
end

function polyCluster:update()
foreach(self.objects, function(obj)
obj:update()
end)
end

function polyCluster:draw()
foreach(self.objects, function(obj)
obj:draw()
end)
end

function polyCluster:new(o)
self.__index = self
return setmetatable(o or {}, self)
end

-------------------------------------------------------------
clusters = {}

function _init()
local c = polyCluster:new()
c:init({2,8,14})
add(clusters, c)

c = polyCluster:new()
c:init({1,6,12})
add(clusters, c)

c = polyCluster:new()
c:init({13,6,7})
add(clusters, c)
end

function _draw()
foreach(clusters, function(c)
c:update()
end)
end

function _update()
cls()
foreach(clusters, function(c)
c:draw()
end)
end