Bouncy balls

This game uses physics to get the balls to me and bounce.


--# Main
--Bounce

--The awesome setup function!
function setup()
    displayMode(FULLSCREEN)
    
    --Boss physics!
   gr = physics.body(EDGE, vec2(0,10), vec2(1000, 10))
gr.type = STATIC
gr.y = 10

wall = physics.body(EDGE, vec2(0, 10), vec2(10, 800))
wall.type = STATIC
wall.y = 10

w = physics.body(EDGE, vec2(1000, 10), vec2(1000, 900))
w.type = STATIC
w.y = 10

roof = physics.body(EDGE, vec2(0, 10), vec2(1000, 10))
roof.type = STATIC
roof.y = 750

ball = physics.body(CIRCLE, 10)
ball.restitution = 1
ball.friction = 0.5
ball.y = math.random(600, 730)
ball.x = math.random(100, 900)

b = physics.body(CIRCLE, 10)
b.restitution = 1
b.friction = 0.5
b.x = WIDTH/2
b.y = HEIGHT/2

ba = physics.body(CIRCLE, 10)
ba.restitution = 1
ba.friction = 0.5
ba.x = 500
ba.y = 300

bal = physics.body(CIRCLE, 10)
bal.restitution = 1
bal.friction = 0.5
bal.x = math.random(100, 900)
bal.y = math.random(300, 600)
end


function draw()

    background(0, 0, 255, 255)
--Walls
fill(127, 127, 127, 255)
rect(0,0, 1000, gr.y)
rect(0, wall.y, 10, 800)
rect(1000, w.y, 10, 800)
rect(0, roof.y, 1000, 10)

--DA BALLZ!
fill(255, 255, 255, 255)
ellipse(ball.x, ball.y, 40)
fill(255, 0, 0, 255)
ellipse(b.x, b.y, 40)
fill(0, 255, 150, 255)
ellipse(ba.x, ba.y, 40)
fill(255, 255, 0, 255)
ellipse(bal.x, bal.y, 40)

end

function touched(t)
b.x = t.x
b.y = t.y
if t.tapCount == 3 then
ball.y = 600
    end
end

function collide(c)
sound(SOUND_JUMP, math.random(1,2000))
    end

Simple thi g I coded in like 10mins to half an hour.

Instead of 4 variables b, ba, bal,ball, why not hold the bodies in a single ball array? Then you could have 400 balls without having to think of 400 variable names. You could also update them all with a for loop.

How could I make a ball array? And where would I put the for loop?

Declare an empty array with ball={} in your setup function.

I would use two for loops, one in setup, one in draw. I think you should try to work it out yourself, but here is a little hint to get you started…

local numberOfBalls = 100
for i=1,numberOfBalls do
   ball[i]=physics.body ....

Then, in the for loop in draw, you can write

ellipse(ball[i].x ..... etc

If youre doing that and end up having lots of balls, spriting a circle really speeds up the process (rather the adjusting a mesh to a circle, it simply draws a rectangle with a circles texture which is much faster). To do so, simply make an image, call setcontext and draw an ellipse to it then sprite the circle where you draw your balls.

Here is the code I wrote, it’s broken.


-- bounce

-- Use this function to perform your initial setup
function setup()
    ball = {}
   local balls = 10
for i = 1,balls do
ball[i] = physics.body(CIRCLE, 25)
ball[i] = 900
    end
end

-- This function gets called once every frame
function draw()
    -- This sets a dark background color 
    background(40, 40, 50)
fill(255, 255, 255, 255)
ellipse(WIDTH/2, ball[i].y, 40)

end

Oh! I forgot to put the ~y~ in my setup line ~ball[i].y = 600~

set ball[i].x=some value
set ball[i].y=some value

It was easier to fix the code then explain what was wrong.


-- bounce

function setup()
    ball = {}
    local balls = 10
    for i = 1,balls do
        ball[i] = physics.body(CIRCLE, 25)
        ball[i].x = math.random(50,WIDTH-50)
        ball[i].y = math.random(HEIGHT-200,HEIGHT)      
    end
end

function draw()
    background(40, 40, 50)
    fill(255, 255, 255, 255)
    for a,b in pairs(ball) do
        ellipse(b.x, b.y, 40)
    end
end