Howdy, Stranger!

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

Physics 2D not destroying bodies

in Bugs Posts: 1,795

I have this code in setup():


print(#physics.bodies) testbody = physics.body(CIRCLE, 90) print(#physics.bodies) testbody:destroy() testbody = nil print(#physics.bodies)

According to the documentation, this should print out:


0 1 0

Actual print out is in attached screenshot.

Project also attached.

Tagged:

Comments

  • dave1707dave1707 Mod
    edited April 3 Posts: 9,977

    You need to give it a draw cycle to destroy the body. Other code needs to execute. That goes for just about anything.

  • dave1707dave1707 Mod
    edited April 3 Posts: 9,977

    @UberGoober Try this code. Tap the screen to create and destroy the body.

    function setup()
        c=0
        fill(255)
        str="no physics bodies exist"
    end
    
    function draw()
        background(40, 40, 50)
        text("tap screen",WIDTH/2,HEIGHT/2+100)
        text("physics bodies  "..#physics.bodies,WIDTH/2,HEIGHT/2)
        text(str,WIDTH/2,HEIGHT/2-100)
    end
    
    function touched(t)
        if t.state==BEGAN then
            c=c+1
            if c==1 then
                testbody = physics.body(CIRCLE, 90)
                str="physics body created"
            elseif c==2 then
                testbody:destroy()
                str="physics body destroyed"
            elseif c==3 then
                testbody = nil
            end
        end
    end
    
  • Posts: 1,795

    @dave1707 OMG thank you so much. This is a vital thing to know and I’ve honestly been banging my head against it for a looooong time.

    I slightly adjusted the code so that it repeatedly creates and destroys bodies:


    function setup() c=0 fill(255) str="no physics bodies exist" end function draw() background(40, 40, 50) text("tap screen",WIDTH/2,HEIGHT/2+100) text("physics bodies "..#physics.bodies,WIDTH/2,HEIGHT/2) text(str,WIDTH/2,HEIGHT/2-100) end function touched(t) if t.state==BEGAN then c=c+1 if c % 2 == 1 then testbody = physics.body(CIRCLE, 90) str="physics body created" elseif c % 2 == 0 then testbody:destroy() str="physics body destroyed" end end end
  • dave1707dave1707 Mod
    Posts: 9,977

    @UberGoober Some things don't happen instantly. You have to let Codea go thru a code cycle so it can execute any background code that needs to be done.

Sign In or Register to comment.