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()
    displayMode(FULLSCREEN)

    noSmooth()

    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
end

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

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
        else

            --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
        end    
    end
end

function draw()
    background(0, 0, 0, 255)
    --myFPSReporter:draw(3)
    strokeWidth(0)

    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].tspot:destroy()
            balls[k] = nil  
        else
            blendMode(ADDITIVE)
            fill(v.r, v.g, v.b, 255)
            ellipse(v.tspot.x, v.tspot.y, v.size)
        end
    end

    touchActions()
end

function collide(contact)
    if contact.state== BEGAN then
    physics.body(CIRCLE,size)
    end
end

Comments

  • 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

    Thanks.

  • 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: 8,200

    .@tyisamonster Here is a program I wrote back in July. http://twolivesleft.com/Codea/Talk/discussion/1349#Item_2 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.