Screensaver! Kind of...

Hey guys! I was doing some tests for a game today, and this kind of happened on accident. Really simple program, but I had a lot of fun with it! I probably watched it for about half an hour, and I would totally put this as my computer screensaver.


--# Main
-- Screensaver

-- Use this function to perform your initial setup
function setup()
    parameter.watch("fps")
    colors()
    boxes = {}
    counter = 0
    boxGrav = 1
end

-- This function gets called once every frame
function draw()
    background(212, 228, 229, 255)
    fps = 1/DeltaTime
    
    local x = -math.random(-350,350)
    local y = -math.random(100,350)
    local width = math.random(50,100)
    local height = math.random(25,50)
    
    translate(WIDTH/2,HEIGHT/2)
    counter = counter + 1
    if counter == 60 then counter = 0
        for i = 1, 2 do
            if i == 1 then box = makeBox(x,y,width,height) end
            if i == 2 then box = makeBox(x,-y,width,height) end
            box.gravityScale = boxGrav
            box.restitution = 0.5
            boxes[#boxes+1] = Platform(box,x,y,width,height)
            boxGrav = -boxGrav
        end
    end
    
    for i, b in pairs(boxes) do
        b:draw()
        if b.body.y > HEIGHT/2 + 100 or b.body.y < -HEIGHT/2 - 100
        or b.body.x > WIDTH/2 + 100 or b.body.x < -WIDTH/2 - 100 then
            b.body:destroy()
            b.body = nil
            boxes[i] = nil
        end
    end
    -- print(#boxes)
    
end

function makeBox(x,y,w,h)
    body = physics.body(POLYGON,vec2(-w/2,h/2),vec2(-w/2,-h/2),vec2(w/2,-h/2),vec2(w/2,h/2))
    body.position = vec2(-x,-y)
    return body
end

function colors()
    colorTab = {
    color(34, 155, 153, 255),
    color(180, 94, 30, 255),
    color(51, 63, 84, 255)
    }
end


--# Platform
Platform = class()

function Platform:init(b,x,y,w,h)
    -- you can accept and set parameters here
    self.body = b
    self.width = w
    self.height = h
    self.colr = colorTab[math.random(#colorTab)]
end

function Platform:draw()
    -- Codea does not automatically call this method
    fill(self.colr)

    local x = self.body.x
    local y = self.body.y
    local w = self.width
    local h = self.height
    
    pushMatrix()
    translate(x,y)
    rotate(self.body.angle)
    rect(-w/2,-h/2,w,h)
    popMatrix()
end

function Platform:touched(touch)
    -- Codea does not automatically call this method
end

Hey, and check out my Pixel Sprite Creator too! I’m new and would love some feedback! Thanks guys!!!

I watched it for almost a half hour too - and I’m at work. Very cool. Thank you for sharing…

Simple but effective - and neatly programmed :-bd

i watch it carefully hour and hour? then i think of domino

nice, thanks for sharing.

how to make gravity direction from up-down to left-right?boxgrav cos?

Try setting “if counter == 60 then counter = 0” to "if counter = 10 then counter = 0 >: )

Thanks for the comments and feedback everyone!
@wildcat_JK I totally agree.
@firewolf for left and right gravity I would just rotate 90 degrees.
Cool ideas, guys!

Great idea! Here’s how you rotate the direction of physics gravity 90 degrees clockwise:

    local g = physics.gravity()
    physics.gravity(g.y,g.x)

@Dwins this is a great screensaver, I’ll admit I too have been staring at it for ages. They only issue I have is that I have an iPad 3 and so after around 300 boxes the FPS starts to drop considerably. Is there a way to delete boxes once they go off the screen so my FPS stays up?
Thanks

The box draw function could be optimised a lot by using a single mesh with setRect. Much much faster than making individual draw calls

@yojimbo2000 thanks for the gravity suggestion! I haven’t tried meshes before, so I’ll definitely take a look at that. @JonoGaming00 the draw function does delete boxes outside the screen. The only thing that slowed it down for me was printing the number of boxes. After commenting that out it ran at 60 fps on my iPad mini

Ok @dwins I’ll check because I have been using it with the print command.