Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Matrix screensaver v0.7
- -- (C) 2012 User 'Advert' at http://www.computercraft.info/forums2/
- -- X11/mit licence (use/modify at your will, but please, leave credit where due)
- -- Spacebar to quit cleanly!
- local term = peripheral.wrap("left")
- local mobj = {}
- do -- Standart variables.
- mobj.x = 0
- mobj.y = 0 -- Offscreen
- mobj.lingerMin = 3 -- Minimum time to linger (frames)
- mobj.lingerMax = 10 -- Maximum time to linger
- mobj.linger = 10 -- How long this object will linger
- mobj.tailLenMin = 3 -- Minimum tail length
- mobj.tailLenMax = 10 -- Maximum tail length
- mobj.tailLen = 10
- mobj.chars = "1234567890-=!@#$%^&*()_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;'\\ASDFGHJKL:\"|zxcvbnm,./ZXCVBNM<>?"
- mobj.charsLen = mobj.chars:len()
- mobj.currentTail = {"a", "a", "a", "a", "a", "a", "a", "a", "a", "a"}
- end
- function mobj:new(o, ...)
- local o = o or {}
- setmetatable(o, self)
- self.__index = self
- o:__init(...)
- return o
- end
- function mobj:__init(x)
- self.linger = math.random(self.lingerMin, self.lingerMax)
- self.tailLen = math.random(self.tailLenMin, self.tailLenMax)
- self.x = x
- self.y = 1
- self.nFrame = 1
- self.currentTail = {}
- end
- function mobj:randomLinger()
- self.linger = math.random(self.lingerMin, self.lingerMax)
- end
- local function printPos(x, y, sText)
- term.setCursorPos(x, y)
- term.write(sText)
- end
- function mobj:randomChar()
- local r = math.random(1, self.charsLen)
- return string.sub(self.chars, r, r)
- end
- function mobj:printTail()
- for i = 1, self.tailLen do
- if not self.currentTail[i] then break end
- printPos(self.x, self.y - i, self.currentTail[i])
- end
- end
- local termX, termY = term.getSize()
- function mobj:render()
- self:printTail()
- self.nFrame = self.nFrame + 1
- if self.nFrame == self.linger then
- table.insert(self.currentTail, 1, self:randomChar())
- printPos(self.x, self.y, self.currentTail[1])
- self.y = self.y + 1
- self.nFrame = 1
- if self.y > termY + self.tailLen then
- self:__init(self.x)
- end
- else
- printPos(self.x, self.y, self:randomChar())
- end
- end
- local objects = {}
- local eventT
- function init()
- for i = 1, termX do
- objects[i] = mobj:new({}, i)
- end
- eventT = os.startTimer(0)
- end
- function render()
- term.clear()
- for _, k in pairs(objects) do
- k:render()
- end
- end
- init()
- while true do
- local e, p1, p2 = os.pullEvent()
- if e == "timer" and p1 == eventT then
- eventT = os.startTimer(0.05) -- 20 fps
- render()
- elseif e == "key" and p1 == 57 then
- term.clear()
- term.setCursorPos(1,1)
- break
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement