>?DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPŸ DDDDDDDDDDDDDDDDDPŸ DDDDDDDDDDDDDDDDDPŸ DDDDDDDDDDDDDDDDD̈ DDDDDDDDDDDDDDDDDUYDDDDDDDDDDDDDDDDDPYDDDDDDDDDDDDDDDDD̈ DDDDDDDDDDDDDDDDDPY ̈ DDDDDDDDDDDDDDDDDUY̌ DDDDDDDDDDDDDDDDDPUDDDDDDDDDDDDDDDDDPUYÜ DDDDDDDDDDDDDDDDDUUǓ DDDDDDDDDDDDDDDDD̈DDDDDDDDDDDDDDDDD̈ DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD̈ DDDDDDDDDDDDDDDDD̈DDDDDDDDDDDDDDDDĎ DDDDDDDDDDDDDDDDD̈DDDDDDDDDDDDDDDD̈ DDDDDDDDDDDDDDDD̈ DDDDDDDDDDDDDDDD̈DDDDDDDDDDDDDDDD̈ DDDDDDDDDDDDDDDD DDDDDDDDDDDDDDD DDDDDDDDDDDDDDD DDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDD @DDDDDDDDDDDDDD DDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDD DDDDDDDDDDDD@DDDDDDDDDDDDD DDDDDDDDDDDQUUUUU@DDDD433333DDDDD DDDDDDDDDDDUUUUUUUU@DDD4333333333DDDD DDDDDDDDDDQUUUUUUUUUUU@DDD333333333333CDDD DDDDDDDDDQUUUUUUUUUUUUUDD4333333333333333DD DDDDDDDDnfffUUUUUUUUUUUUUUDDD3333333333333333CDDDDDDDDDnfffffQUUUUUUUUUUUUUUU@DD333333333333333333CDDDDDDDDnfffffffQUUUUUUUUUUUUUUUUUDD43333333333333333333DD` DDDDfffffffUUUUUUUUUUUUUUUUUU@D4333333333333333333333DD nfffffffQUUUUUUUUUUUUUUUUUUUDD3333333333333333333333CDffffffffUUUUUUUUUUUUUUUUUUUU @D433333333333333333333333DDfffffffUUUUUUUUUUUUUUUUUUUUDD333333333333333333333333CD nfffffffQUUUUUUUUUUUUUUUUUUUUU@D43333333333333333333333333DDnfffffffUUUUUUUUUUUUUUUUUUUUUUDD33333333333333333333333333CD fffffffQUUUUUUUUUUUUUUUUUUUUUUUD4333333333333333333333333333DfffffffQUUUUUUUUUUUUUUUUUUUUUUU@D4333333333333333333333333333DDfffffffUUUUUUUUUUUUUUUUUUUUUUUUDD3333333333333333333333333333CDfffffffUUUUUUUUUUUUUUUUUUUUUUUUD433333333333333333333333333333DffffffUUUUUUUUUUUUUUUUUUUUUUUU@D433333333333333333333333333333DDffffffQUUUUUUUUUUUUUUUUUUUUUUUUU@D333333333333333333333333333333CDwwwwwffffffQUUUUUUUUUUUUUUUUUUUUUUUUUD43333333333333333333333333333333DpwwwwwwwwwwnfffffQUUUUUUUUUUUUUUUUUUUUUUUUUD43333333333333333333333333333333DpwwwwwwwwwwwwnfffffUUUUUUUUUUUUUUUUUUUUUUUUUU@D43333333333333333333333333333333DDwwwww|wwwwfffffUUUUUUUUUUUUUUUUUUUUUUUUUU@D33333333333333333333333333333333CDwwww|wwwfffffUUUUUUUUUUUUUUUUUUUUUUUUUU@D33333333333333333333333333333333CDwwwwwnffffUUUUUUUUUUUUUUUUUUUUUUUUUUDD33333333333333333333333333333333CDwwwwffffUUUUUUUUUUUUUUUUUUUUUUUUUUD4333333333333333333333333333333333DwwnfffUUUUUUUUUUUUUUUUUUUUUUUUUUD4333333333333333333333333333333333D|wwnffUUUUUUUUUUUUUUUUUUUUUUUUUUD4333333333333333333333333333333333D|wnfUUUUUUUUUUUUUUUUUUUUUUUUUU@D4333333333333333333333333333333333DDwwUUUUUUUUUUUUUUUUUUUUUUUUUU@D3333333333333333333333333333333333CD|wUUUUUUUUUUUUUUUUUUUUUUUUUU@D3333333333333333333333333333333333CDwwUUUUUUUUUUUUUUUUUUUUUUUUUU@D3333333333333333333333333333333333CD|wQUUUUUUUUUUUUUUUUUUUUUUUUU@D3333333333333333333333333333333333CDPUUUUUwwQUUUUUUUUUUUUUUUUUUUUUUUUU@D3333333333333333333333333333333333CD PUUUUUUUUU|wQUUUUUUUUUUUUUUUUUUUUUUUUU@D3333333333333333333333333333333333CDPUUUUUwUUUUUUUUUUUUUUUUUUUUUUUU@D3333333333333333333333333333333333CDPUUZUUwwUUUUUUUUUUUUUUUUUUUUUUUU@D3333333333333333333333333333333333CDPUU|wUUUUUUUUUUUUUUUUUUUUUUUU@D3333333333333333333333333333333333CDUwQUUUUUUUUUUUUUUUUUUUUUUU@D3333333333333333333333333333333333CDPUwwQUUUUUUUUUUUUUUUUUUUUUUU@D3333333333333333333333333333333333CDPU|wUUUUUUUUUUUUUUUUUUUUUU@D4333333333333333333333333333333333DD U|wQUUUUUUUUUUUUUUUUUUUUUD4333333333333333333333333333333333DPUwUUUUUUUUUUUUUUUUUUUUD4333333333333333333333333333333333DPwUUUUUUUUUUUUUUUUUUUUD4333333333333333333333333333333333DUwwQUUUUUUUUUUUUUUUUUUUDD33333333333333333333333333333333CD0PU|wUUUUUUUUUUUUUUUUUU@D33333333333333333333333333333333CDU|wQUUUUUUUUUUUUUUUUU@D33333333333333333333333333333333CDU|wQUUUUUUUUUUUUUUU@D43333333333333333333333333333333DDP|wUUUUUUUUUUUUUUD43333333333333333333333333333333DPwQUUUUUUUUUUUUUD43333333333333333333333333333333DUwQUUUUUUUUUUU@D333333333333333333333333333333CDUwUUUUUUUU@D433333333333333333333333333333DDPUwQUUUUUD433333333333333333333333333333DPwDD3333333333333333333333333333CDPw@D4333333333333333333333333333DDPwD4333333333333333333333333333D UwDD33333333333333333333333333CDUw@D43333333333333333333333333DDUwDD333333333333333333333333CDUw@D433333333333333333333333DDU|wDD3333333333333333333333CDU|w@D4333333333333333333333DDU|wDD43333333333333333333DDU|w@DD333333333333333333CDDUwwDDD3333333333333333CDDUwDD4333333333333333DDUw@DDD333333333333CDDDP|w@DDD4333333333DDDDP|wp@DDDD433333DDDDDPww@DDDDDDDDDDDDDPUwDDDDDDDDDDU|wDDDDDDUwwPwPP|w0UwwU|wPUwwU|wPww PU|wpU|wwPUwwPUwwwwUwwwwwPUUwwww|wwwPUUZUUwwwww|wwwwPUUUUUpwwwwwwwwwwwwPUUUUUUUUUpwwwwwwwwwwPUUUUUwwwww -- title: Floating Circles -- author: JoaoPauloVF -- desc: a circles animation generated randomly -- script: lua -- input: keyboard, mouse -- palette: SWEETIE-16 https://github.com/nesbox/TIC-80/wiki/palette#sweetie-16 -- license: MIT -- github: https://github.com/JoaoPauloVF/My-TIC-Cartridges#readme --Constants and Variables : line 20 --Function getSequence() : line 35 --Position Map : line 51 --Circle Floating Class : line 54 --Dot Floating Class : line 107 --Initialization functions: line 122 --Instances Initialization: line 171 --TIC() : line 175 math.randomseed(tstamp()*10000) --CONSTANTS AND VARIABLES SCREEN_W = 240 SCREEN_H = 136 BACKGROUND = 0 --Black SPACE = 48 ENTER = 50 countCircles = 10 countDots = 100 --Dots amount. Dots appear behind the circles. circles = {} dots = {} function getSequence(f, min, max, step) local seq = {} step = step or 1 if not(max) then min, max = max, min min = 1 end for num=min, max, step do table.insert(seq, f(num)) end return seq end POSITIONS = {} --It keeps all positions on the screen, and if they are occupied. See below. --FLOATING CIRCLE CLASS function FloatingCircle(x, y, backgroundColor) local self = {} self.y = y self.x = x self.maxRadius = math.random(20, 30) self.radius = 0 self.yDirs = {1, -1} self.currY = y self.yInterval = math.random(1,6) * self.yDirs[math.random(2)] self.colorFill = math.random(15) while self.colorFill == backgroundColor do self.colorFill = math.random(15) end self.colorBorder = math.random(15) self.borderWeight = self.maxRadius*0.1 self.update = function() local cos = self.yInterval * math.cos(time()/800) self.currY = self.y + cos self.radius = self.radius < self.maxRadius and self.radius + 2 or self.radius local mX, mY, pressed = mouse() local dist = math.sqrt((mX-self.x)^2+(mY-self.y)^2) if dist < self.maxRadius and pressed and self.radius >=0 then self.radius = self.radius - 4 end end self.render = function() circ( self.x, self.currY, self.radius + self.borderWeight, self.colorBorder ) circ( self.x, self.currY, self.radius, self.colorFill ) end return self end --FLOATING DOT CLASS function FloatingDot() local self = {} self.x = math.random(SCREEN_W) self.y = math.random(SCREEN_H) self.color = math.random(15) self.render = function() pix(self.x, self.y, self.color) end return self end --Initialization functions function initializePositionsMap() local xMap = getSequence( function(num)return num end, 0, SCREEN_W, 32 ) local yMap = getSequence( function(num)return num end, 0, SCREEN_H, 32 ) for i=1, #yMap do for j=1, #xMap do table.insert( POSITIONS, {x=xMap[j], y=yMap[i]} ) end end end function initializeCircles(countCircles) local pile = {} for i=1, countCircles do if #POSITIONS == 0 then break end local posIndex = math.random(1, #POSITIONS) local pos = POSITIONS[posIndex] c = FloatingCircle(pos.x, pos.y, BACKGROUND) table.insert(pile, c) table.remove(POSITIONS, posIndex) end return pile end function initializeDots(countDots) local pile = {} for i=1, countDots do dot = FloatingDot() table.insert(pile, dot) end return pile end --instances(from FloatingCircle and FloatingDot) initialization initializePositionsMap() circles = initializeCircles(countCircles) dots = initializeDots(countDots) function TIC() cls(BACKGROUND) if keyp(SPACE, 0, 120) or keyp(ENTER, 0, 120) then initializePositionsMap() circles = initializeCircles(countCircles) dots = initializeDots(countDots) end for index, circle in pairs(circles) do circle.update() end for index, dot in pairs(dots) do dot.render() end for index, circle in pairs(circles) do circle.render() end end