Destroy object after 2 seconds

Hello

Can anyone please tell me why this does not work? 

local function levelRectangle() --To add level removal of balls.

    level_wall2 = display.newRect(300,1100,300*2,levelnumber*80)

    physics.addBody( level_wall2,“static”,{isSensor=true})

    level_wall2.myName="levelWall"

    timer.performWithDelay(2000,function() display.remove(level_wall2) end)

end

The object is created and does act like a sensor as specified but the timer does not remove the object 

It looks fine, are you getting any errors?

No - no errors, but the timer.performwithDelay does not remove the object after 2000ms 

If i instead do display.remove(level_wall2)  without the timer it gets removed.

Any ideas???

Do you have another instance of  level_wall2  somewhere else? Maybe the timer is remove  level_wall2  but it’s removing a different object.

  1. Add print statement in timer to make sure that function is call properly,

Some ideas to try :slight_smile:

  1. Specify display group to which you add level_wall2 as first argument for example

    level_wall2 = display.newRect(scene.view, 300,1100,300*2,levelnumber*80)

  2. Create local level_wall2 

    local level_wall2 = display.newRect(300,1100,300*2,levelnumber*80)

  3. Rewrite listener function

    local function levelRectangle() --To add level removal of balls.    level_wall2 = display.newRect(300,1100,300*2,levelnumber*80)     physics.addBody( level_wall2,“static”,{isSensor=true})     level_wall2.myName=“levelWall” local function listener(event) display.remove(level_wall2) end     timer.performWithDelay(2000, listener) end

  4. Add argument to listener function

    local function levelRectangle() --To add level removal of balls.    level_wall2 = display.newRect(300,1100,300*2,levelnumber*80)     physics.addBody( level_wall2,“static”,{isSensor=true})     level_wall2.myName=“levelWall”     timer.performWithDelay(2000,function(event) display.remove(level_wall2) end)  end

I’m not sure it help but worth try :slight_smile:

You’re misusing a global, so that may be part of your problem…

This,

local function levelRectangle() level\_wall2 = display.newRect(300,1100,300\*2,levelnumber\*80) -- This is a global. Wrong!

should be this:

local function levelRectangle() local level\_wall2 = display.newRect(300,1100,300\*2,levelnumber\*80) -- This is a local, right!

After you fix that you’ve got all kinds of options (those above) and these tricks:

  1. Assign reference to ‘display.remove()’ function to field ‘timer’ and let it be called directly.

    local function levelRectangle() local level_wall2 = display.newRect(300,1100,300*2,levelnumber*80) physics.addBody( level_wall2,“static”,{isSensor=true}) level_wall2.myName=“levelWall” level_wall2.timer = display.remove timer.performWithDelay( 2000, level_wall2 ) end

  2. Abuse transition (prior trick is much better)

    local function levelRectangle() local level_wall2 = display.newRect(300,1100,300*2,levelnumber*80) physics.addBody( level_wall2,“static”,{isSensor=true}) level_wall2.myName=“levelWall” level_wall2.onComplete = display.remove transition.to( level_wall2, { bogusVar = 1, onComplete = level_wall2, time = 0, delay = 2000 } ) end

Thank you very much everyone - i will try these things. 

Yes - i do seem to mis-use globals at the moment :confused:

It looks fine, are you getting any errors?

No - no errors, but the timer.performwithDelay does not remove the object after 2000ms 

If i instead do display.remove(level_wall2)  without the timer it gets removed.

Any ideas???

Do you have another instance of  level_wall2  somewhere else? Maybe the timer is remove  level_wall2  but it’s removing a different object.

  1. Add print statement in timer to make sure that function is call properly,

Some ideas to try :slight_smile:

  1. Specify display group to which you add level_wall2 as first argument for example

    level_wall2 = display.newRect(scene.view, 300,1100,300*2,levelnumber*80)

  2. Create local level_wall2 

    local level_wall2 = display.newRect(300,1100,300*2,levelnumber*80)

  3. Rewrite listener function

    local function levelRectangle() --To add level removal of balls.    level_wall2 = display.newRect(300,1100,300*2,levelnumber*80)     physics.addBody( level_wall2,“static”,{isSensor=true})     level_wall2.myName=“levelWall” local function listener(event) display.remove(level_wall2) end     timer.performWithDelay(2000, listener) end

  4. Add argument to listener function

    local function levelRectangle() --To add level removal of balls.    level_wall2 = display.newRect(300,1100,300*2,levelnumber*80)     physics.addBody( level_wall2,“static”,{isSensor=true})     level_wall2.myName=“levelWall”     timer.performWithDelay(2000,function(event) display.remove(level_wall2) end)  end

I’m not sure it help but worth try :slight_smile:

You’re misusing a global, so that may be part of your problem…

This,

local function levelRectangle() level\_wall2 = display.newRect(300,1100,300\*2,levelnumber\*80) -- This is a global. Wrong!

should be this:

local function levelRectangle() local level\_wall2 = display.newRect(300,1100,300\*2,levelnumber\*80) -- This is a local, right!

After you fix that you’ve got all kinds of options (those above) and these tricks:

  1. Assign reference to ‘display.remove()’ function to field ‘timer’ and let it be called directly.

    local function levelRectangle() local level_wall2 = display.newRect(300,1100,300*2,levelnumber*80) physics.addBody( level_wall2,“static”,{isSensor=true}) level_wall2.myName=“levelWall” level_wall2.timer = display.remove timer.performWithDelay( 2000, level_wall2 ) end

  2. Abuse transition (prior trick is much better)

    local function levelRectangle() local level_wall2 = display.newRect(300,1100,300*2,levelnumber*80) physics.addBody( level_wall2,“static”,{isSensor=true}) level_wall2.myName=“levelWall” level_wall2.onComplete = display.remove transition.to( level_wall2, { bogusVar = 1, onComplete = level_wall2, time = 0, delay = 2000 } ) end

Thank you very much everyone - i will try these things. 

Yes - i do seem to mis-use globals at the moment :confused: