Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Help creating a game

edited June 2013 in Questions Posts: 2

Hey, I need help with this code im writing, and some of it isnt mine, but I need help creating a new physics.body when two bodies collide, but I cant seem to figure out how to do this, it crashes everytime. Ideas are much appreiated.

Heres the code, most of it is borrowed.

-- moving balls

function setup()


    balls = {}
    touches = {}

    base = physics.body(EDGE, vec2(10,-4), vec2(WIDTH-1,10))

    wall = physics.body(EDGE, vec2(1000, 900), vec2(WIDTH-10, 10))

    nextball = 0

function touched(touch)
    if touch.state == ENDED then
        touches[] = nil
        --if touches[] == nil then
        touches[] = touch

function touchActions()
    for k,v in pairs(touches) do 
        if CurrentTouch.state == ENDED then
            --if there are no current touches then we kill all current touches to avoid bugged ball producers
            touches[k] = nil

            --add a new ball at the touch location
            size = math.random(2,20)
            tspot = physics.body(CIRCLE, size)
            tspot.position = vec2(v.x+math.random(-1,1), v.y+math.random(-1,1))
            tspot.restitution = 1

            balls[nextball] = { tspot = tspot, size = size * 2, r = math.random(30,255), g = math.random(30,255), b = math.random(30,255) }

            nextball = nextball + 1

function draw()
    background(0, 0, 0, 255)

    for k,v in pairs(balls) do
        if v.tspot.x < -20 or v.tspot.x > WIDTH + 20 or v.tspot.y < -20 then
            balls[k] = nil  
            fill(v.r, v.g, v.b, 255)
            ellipse(v.tspot.x, v.tspot.y, v.size)


function collide(contact)
    if contact.state== BEGAN then


  • Posts: 1,976

    Some of the code is in and some is out of the three tildes. (3 * ~) Can you try and reformat the code so it's easier to read and understand?

  • Posts: 1,976


  • IgnatzIgnatz Mod
    Posts: 5,396

    I think what is happening is that all your bodies are being created on top of each other, soothe new ones collide immediately with the old ones, which creates new bodies which collide with the old ones, which creates new bodies....

    So I think you need to find a way to create them separately from each other.

    The other problem you will have is that you are not creating a variable when you add physics objects in collide. Look at TouchActions, where you define a new tspot for each object. This name gives you a way of finding out where the ball is so you can draw an ellipse on it. If you just create a physics object without a name, you will have trouble finding it later on.

  • dave1707dave1707 Mod
    edited June 2013 Posts: 10,055

    .@tyisamonster Here is a program I wrote back in July. Everytime a blue ball collides with the red ball, another blue ball is created. I start out with 25 balls and limit it to 250. Maybe this will help you with creating a ball because of a collision. Or if you want a simpler example see the code below.

    displayMode(FULLSCREEN) function setup()     tab={}     e1=physics.body(EDGE,vec2(0,0),vec2(0,HEIGHT))     e2=physics.body(EDGE,vec2(0,HEIGHT),vec2(WIDTH,HEIGHT))     e3=physics.body(EDGE,vec2(WIDTH,HEIGHT),vec2(WIDTH,0))     e4=physics.body(EDGE,vec2(WIDTH,0),vec2(0,0))     for z=1,10 do         table.insert(tab,createBody())     end end function draw()     background(40,40,50)     fill(255)     for a,b in pairs(tab) do         ellipse(b.x,b.y,20)     end     if create then         create=false         table.insert(tab,createBody())     end     text(#tab,WIDTH/2,HEIGHT/2) end function createBody()     b=physics.body(CIRCLE,10)     b.x=math.random(WIDTH)     b.y=math.random(HEIGHT)     b.gravityScale=0     b.linearVelocity=vec2(100,200)     b.restitution=1     return(b) end function collide(c)     if c.state==BEGAN then         if c.bodyA.shapeType==CIRCLE and c.bodyB.shapeType==CIRCLE then             if #tab<300 then                 create=true             end         end     end end


Sign In or Register to comment.