Can't parameterize a function

Hello guys, it’s 3 months I’m developing an app with Corona Sdk and I’m almost there. Unfortunately, while working on the parameterization of a function I got some errors. Furthermore the timer.performwithdelay doesn’t seem to work since the powerup function I’ll post down there starts immediately. Did I parameterize in proper way? What could have I done wrong? Thank you in advance!

--\> POWERUPS local used = {} used[0]=true used[1]=true local ready\_to\_randomize = {} ready\_to\_randomize[0]=true ready\_to\_randomize[1]=true local counter = {} counter[0]=true counter[1]=true local loading = {} local rand = {} local power\_button = {} local current = {} local powerup\_sound = {} local counter = {} counter[0]=-1 counter[1]=-1 local staging\_powerup = {} local function restorePower()--ripristina potenza di tiro shootPowerDefault=0.01 end local function restoreDim()--ripristina dimensioni(?) pdim=10 end local function powerup\_usage() -- power\_button\_red.fill.effect = "filter.grayscale" power\_button[n].alpha=0 used[n]=true print ("X") if current[n]==1 then print ("a") powerup\_sound[n] = audio.loadSound( "sounds/powerup1\_sound.wav") audio.play(powerup1\_sound, {channel=6}) ball.isAwake=false elseif current[n]==2 then print ("b") powerup\_sound[n] = audio.loadSound( "sounds/powerup2\_sound.wav" ) audio.play(powerup2\_sound, {channel=6}) elseif current[n]==3 then print ("c") powerup\_sound[n] = audio.loadSound( "sounds/powerup3\_sound.wav" ) audio.play(powerup\_sound[n], {channel=6}) shootPowerDefault=0.1 timer.performWithDelay(1500, restorePower) elseif current[n]==4 then print ("d") powerup\_sound[n] = audio.loadSound( "sounds/powerup4\_sound.wav" ) audio.play(powerup\_sound[n], {channel=6}) pdim=30 timer.performWithDelay(1500, restoreDim) end print ("Y") end --TODO sistemare posizioni powerup local function powerup(n) if counter[n]~=-1 then loading[n].alpha=0 else counter[n]=0 end if used[n] and ready\_to\_randomize[n] then print("A libero B libero") rand[n]=math.random(5) if rand[n]==1 then loading[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==2 then loading[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) loading[n].alpha=1 print("B2") elseif rand[n]==3 then loading[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) loading[n].alpha=1 print("B3") elseif rand[n]==4 then loading[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) loading[n].alpha=1 print("B4") elseif rand[n]==5 then loading[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) loading[n].alpha=1 print("B5") end loading[n].x = display.contentCenterX + 115 loading[n].y = display.contentCenterY-45 counter[n]=counter[n]+1 if counter[n] ~= 5 then timer.performWithDelay(700, powerup(n)) print("rieseguo") else print("counter=5") if rand[n]==1 then power\_button[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) elseif rand[n]==2 then power\_button[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) elseif rand[n]==3 then power\_button[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) elseif rand[n]==4 then power\_button[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) elseif rand[n]==5 then power\_button[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) end power\_button[n].x = display.contentCenterX + 78 power\_button[n].y = display.contentCenterY - 65 current[n]=rand[n] power\_button[n]:addEventListener("tap", powerup\_usage) used[n]=false counter[n]=0 timer.performWithDelay(700, powerup(n)) end elseif not used[n] and ready\_to\_randomize[n] then print("A pieno B libero") loading[n].alpha=0 rand[n]=math.random(5) if rand[n]==1 then loading[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==2 then loading[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==3 then loading[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==4 then loading[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==5 then loading[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) loading[n].alpha=1 print("B1") end loading[n].x = display.contentCenterX + 115 loading[n].y = display.contentCenterY-45 counter[n]=counter[n]+1 if counter[n] ~= 5 then print("rieseguo") timer.performWithDelay(700, powerup(n)) else print("counter=5") staging\_powerup[n]=rand[n] ready\_to\_randomize[n]=false timer.performWithDelay(700, powerup(n)) end elseif used[n] and not ready\_to\_randomize[n] then print("A libero, B pieno") power\_button[n].alpha=0 rand[n] = staging\_powerup[n] if rand[n]==1 then power\_button[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) elseif rand[n]==2 then power\_button[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) elseif rand[n]==3 then power\_button[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) elseif rand[n]==4 then power\_button[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) elseif rand[n]==5 then power\_button[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) end power\_button[n].x = display.contentCenterX + 78 power\_button[n].y = display.contentCenterY-65 current[n]=rand[n] power\_button[n]:addEventListener("tap", powerup\_usage) used[n]=false ready\_to\_randomize[n]=true counter[n]=0 timer.performWithDelay(700, powerup(n)) elseif not used[n] and not ready\_to\_randomize[n] then loading[n].alpha=1 print("A pieno, B pieno") timer.performWithDelay(700, powerup(n)) end return true end timer.performWithDelay(700, powerup(0)) --timer.performWithDelay(700, powerup(1))

Which function are you talking about?

I assume the problem is in the one called “powerup” but I’m not sure I parameterized in the right way

You’re running into one of the classic problems. Functions like timer.performWithDelay, transition.to, etc. all want an “address to the function to execute” when time comes.  When you call a function with parameters:  

powerup(0)

The function actually runs and returns a value, likely nil if you don’t have a “return” statement.

The result of this is that powerup(0) runs immediately and you are returning the value “true” so what you end up executing is:

timer.performWithDelay( 700, true )

To solve this you have to either not pass a value to powerup() and come up with some other method of letting powerup() what value it nees:

timer.performWithDelay(700, powerup ) -- note it's just the name of the function

Or what most people would do is use an anonymous function:

timer.performWithDelay( 700, function()                                                     powerup(0);                                                end ) 

This gets timer.performWithDelay an address of a function and when time comes it runs it, which calls your function with the parameters you want.

Rob

I’ll try this as soon as possible, thank you for advice!

I’ve fixed the code (I didn’t actually need the “return true”) but now I get stack overflow. Dunno why but it seems to perform all the randomize stuff and things consequently without waiting for the delay. I still don’t get why. When my code was not parameterized it didn’t use to do that. However that’s the code:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --\> POWERUPS local used = {} used[0]=true used[1]=true local ready\_to\_randomize = {} ready\_to\_randomize[0]=true ready\_to\_randomize[1]=true local counter = {} counter[0]=true counter[1]=true local loading = {} local rand = {} local power\_button = {} local current = {} local powerup\_sound = {} local counter = {} counter[0]=-1 counter[1]=-1 local staging\_powerup = {} local function restorePower()--ripristina potenza di tiro shootPowerDefault=0.01 end local function restoreDim()--ripristina dimensioni(?) pdim=10 end local function powerup\_usage() -- power\_button\_red.fill.effect = "filter.grayscale" power\_button[n].alpha=0 used[n]=true print ("X") if current[n]==1 then print ("a") powerup\_sound[n] = audio.loadSound( "sounds/powerup1\_sound.wav") audio.play(powerup1\_sound, {channel=6}) ball.isAwake=false elseif current[n]==2 then print ("b") powerup\_sound[n] = audio.loadSound( "sounds/powerup2\_sound.wav" ) audio.play(powerup2\_sound, {channel=6}) elseif current[n]==3 then print ("c") powerup\_sound[n] = audio.loadSound( "sounds/powerup3\_sound.wav" ) audio.play(powerup\_sound[n], {channel=6}) shootPowerDefault=0.1 timer.performWithDelay(1500, restorePower) elseif current[n]==4 then print ("d") powerup\_sound[n] = audio.loadSound( "sounds/powerup4\_sound.wav" ) audio.play(powerup\_sound[n], {channel=6}) pdim=30 timer.performWithDelay(1500, restoreDim) end print ("Y") end --TODO sistemare posizioni powerup local function powerup(n) if counter[n]~=-1 then loading[n].alpha=0 else counter[n]=0 end if used[n] and ready\_to\_randomize[n] then print("A libero B libero") rand[n]=math.random(5) if rand[n]==1 then loading[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==2 then loading[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) loading[n].alpha=1 print("B2") elseif rand[n]==3 then loading[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) loading[n].alpha=1 print("B3") elseif rand[n]==4 then loading[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) loading[n].alpha=1 print("B4") elseif rand[n]==5 then loading[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) loading[n].alpha=1 print("B5") end loading[n].x = display.contentCenterX + 115 loading[n].y = display.contentCenterY-45 counter[n]=counter[n]+1 if counter[n] ~= 5 then timer.performWithDelay(700, powerup(n)) print("rieseguo") else print("counter=5") if rand[n]==1 then power\_button[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) elseif rand[n]==2 then power\_button[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) elseif rand[n]==3 then power\_button[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) elseif rand[n]==4 then power\_button[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) elseif rand[n]==5 then power\_button[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) end power\_button[n].x = display.contentCenterX + 78 power\_button[n].y = display.contentCenterY - 65 current[n]=rand[n] power\_button[n]:addEventListener("tap", powerup\_usage) used[n]=false counter[n]=0 timer.performWithDelay(700, powerup(n)) end elseif not used[n] and ready\_to\_randomize[n] then print("A pieno B libero") loading[n].alpha=0 rand[n]=math.random(5) if rand[n]==1 then loading[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==2 then loading[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==3 then loading[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==4 then loading[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==5 then loading[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) loading[n].alpha=1 print("B1") end loading[n].x = display.contentCenterX + 115 loading[n].y = display.contentCenterY-45 counter[n]=counter[n]+1 if counter[n] ~= 5 then print("rieseguo") timer.performWithDelay(700, powerup(n)) else print("counter=5") staging\_powerup[n]=rand[n] ready\_to\_randomize[n]=false timer.performWithDelay(700, powerup(n)) end elseif used[n] and not ready\_to\_randomize[n] then print("A libero, B pieno") power\_button[n].alpha=0 rand[n] = staging\_powerup[n] if rand[n]==1 then power\_button[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) elseif rand[n]==2 then power\_button[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) elseif rand[n]==3 then power\_button[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) elseif rand[n]==4 then power\_button[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) elseif rand[n]==5 then power\_button[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) end power\_button[n].x = display.contentCenterX + 78 power\_button[n].y = display.contentCenterY-65 current[n]=rand[n] power\_button[n]:addEventListener("tap", powerup\_usage) used[n]=false ready\_to\_randomize[n]=true counter[n]=0 timer.performWithDelay(700, powerup(n)) elseif not used[n] and not ready\_to\_randomize[n] then loading[n].alpha=1 print("A pieno, B pieno") timer.performWithDelay(700, powerup(n)) end end --timer.performWithDelay(700, powerup(1)) timer.performWithDelay( 700, powerup(0))

You have a lot of recursion going on inside of powerup(). Recursion is functions that call themselves. Look at all of the times you call powerup() within powerup(). Lua allows recursion, but if you do it too much you will fill up the function call stack and get a stack overflow.

Rob

I know, I meant to do like and it worked. The function has to be restarted after each goal (have to add that). The problem is that the powerup function is executed without waiting for the 700ms and I don’t get why. Here in console it shows thousands of prints in a fraction of 2 seconds and I don’t get why.

It’s because you’re still calling powerup() with a parameter instead of providing the address of the powerup function to timer.performWithDisplay.  Those all need to be converted to Anonymous functions like I detailed above.

Rob

So I ended up with this, which is obviously not parameterized but is slightly “more working” than previous code. Now the problem is that it doesn’t go further than 1st iteration.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --\> POWERUPS local used = {} used[0]=true used[1]=true local ready\_to\_randomize = {} ready\_to\_randomize[0]=true ready\_to\_randomize[1]=true local counter = {} counter[0]=true counter[1]=true local loading = {} local rand = {} local power\_button = {} local current = {} local powerup\_sound = {} local counter = {} counter[0]=-1 counter[1]=-1 local staging\_powerup = {} local function restorePower()--ripristina potenza di tiro shootPowerDefault=0.01 end local function restoreDim()--ripristina dimensioni(?) pdim=10 end local function powerup\_usage() -- power\_button\_red.fill.effect = "filter.grayscale" power\_button[n].alpha=0 used[n]=true print ("X") if current[n]==1 then print ("a") powerup\_sound[n] = audio.loadSound( "sounds/powerup1\_sound.wav") audio.play(powerup1\_sound, {channel=6}) ball.isAwake=false elseif current[n]==2 then print ("b") powerup\_sound[n] = audio.loadSound( "sounds/powerup2\_sound.wav" ) audio.play(powerup2\_sound, {channel=6}) elseif current[n]==3 then print ("c") powerup\_sound[n] = audio.loadSound( "sounds/powerup3\_sound.wav" ) audio.play(powerup\_sound[n], {channel=6}) shootPowerDefault=0.1 timer.performWithDelay(1500, restorePower) elseif current[n]==4 then print ("d") powerup\_sound[n] = audio.loadSound( "sounds/powerup4\_sound.wav" ) audio.play(powerup\_sound[n], {channel=6}) pdim=30 timer.performWithDelay(1500, restoreDim) end print ("Y") end --TODO sistemare posizioni powerup local function powerup(n) if counter[n]~=-1 then loading[n].alpha=0 else counter[n]=0 end if used[n] and ready\_to\_randomize[n] then print("A libero B libero") rand[n]=math.random(5) if rand[n]==1 then loading[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==2 then loading[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) loading[n].alpha=1 print("B2") elseif rand[n]==3 then loading[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) loading[n].alpha=1 print("B3") elseif rand[n]==4 then loading[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) loading[n].alpha=1 print("B4") elseif rand[n]==5 then loading[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) loading[n].alpha=1 print("B5") end loading[n].x = display.contentCenterX + 115 loading[n].y = display.contentCenterY-45 counter[n]=counter[n]+1 if counter[n] ~= 5 then timer.performWithDelay(700, temp) print("rieseguo") else print("counter=5") if rand[n]==1 then power\_button[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) elseif rand[n]==2 then power\_button[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) elseif rand[n]==3 then power\_button[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) elseif rand[n]==4 then power\_button[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) elseif rand[n]==5 then power\_button[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) end power\_button[n].x = display.contentCenterX + 78 power\_button[n].y = display.contentCenterY - 65 current[n]=rand[n] power\_button[n]:addEventListener("tap", powerup\_usage) used[n]=false counter[n]=0 timer.performWithDelay(700, temp) end elseif not used[n] and ready\_to\_randomize[n] then print("A pieno B libero") loading[n].alpha=0 rand[n]=math.random(5) if rand[n]==1 then loading[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==2 then loading[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==3 then loading[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==4 then loading[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==5 then loading[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) loading[n].alpha=1 print("B1") end loading[n].x = display.contentCenterX + 115 loading[n].y = display.contentCenterY-45 counter[n]=counter[n]+1 if counter[n] ~= 5 then print("rieseguo") timer.performWithDelay(700, temp) else print("counter=5") staging\_powerup[n]=rand[n] ready\_to\_randomize[n]=false timer.performWithDelay(700, temp) end elseif used[n] and not ready\_to\_randomize[n] then print("A libero, B pieno") power\_button[n].alpha=0 rand[n] = staging\_powerup[n] if rand[n]==1 then power\_button[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) elseif rand[n]==2 then power\_button[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) elseif rand[n]==3 then power\_button[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) elseif rand[n]==4 then power\_button[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) elseif rand[n]==5 then power\_button[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) end power\_button[n].x = display.contentCenterX + 78 power\_button[n].y = display.contentCenterY-65 current[n]=rand[n] power\_button[n]:addEventListener("tap", powerup\_usage) used[n]=false ready\_to\_randomize[n]=true counter[n]=0 timer.performWithDelay(700, temp) elseif not used[n] and not ready\_to\_randomize[n] then loading[n].alpha=1 print("A pieno, B pieno") timer.performWithDelay(700, temp) end end --timer.performWithDelay(700, functio --timer.performWithDelay(700, powerup(1)) local function temp() powerup(0) end timer.performWithDelay( 700, temp)

Ok I solved the problem, now I don’t get what’s wrong with the scope (I suppose). Console tells me: table index of used[n]=true is nil. Any clue? Sorry for such a disturb. Hope this will be last question

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --\> POWERUPS local used = {} used[0]=true used[1]=true local ready\_to\_randomize = {} ready\_to\_randomize[0]=true ready\_to\_randomize[1]=true local counter = {} counter[0]=true counter[1]=true local loading = {} local rand = {} local power\_button = {} local current = {} local powerup\_sound = {} local counter = {} counter[0]=-1 counter[1]=-1 local staging\_powerup = {} local function restorePower()--ripristina potenza di tiro shootPowerDefault=0.01 end local function restoreDim()--ripristina dimensioni(?) pdim=10 end local function powerup\_usage() -- power\_button\_red.fill.effect = "filter.grayscale" --power\_button[n].alpha=0 used[n]=true print ("X") if current[n]==1 then print ("a") powerup\_sound[n] = audio.loadSound( "sounds/powerup1\_sound.wav") audio.play(powerup1\_sound, {channel=6}) ball.isAwake=false elseif current[n]==2 then print ("b") powerup\_sound[n] = audio.loadSound( "sounds/powerup2\_sound.wav" ) audio.play(powerup2\_sound, {channel=6}) elseif current[n]==3 then print ("c") powerup\_sound[n] = audio.loadSound( "sounds/powerup3\_sound.wav" ) audio.play(powerup\_sound[n], {channel=6}) shootPowerDefault=0.1 timer.performWithDelay(1500, restorePower) elseif current[n]==4 then print ("d") powerup\_sound[n] = audio.loadSound( "sounds/powerup4\_sound.wav" ) audio.play(powerup\_sound[n], {channel=6}) pdim=30 timer.performWithDelay(1500, restoreDim) end print ("Y") end --TODO sistemare posizioni powerup local function powerup(n) if counter[n]~=-1 then loading[n].alpha=0 else counter[n]=0 end if used[n] and ready\_to\_randomize[n] then print("A libero B libero") rand[n]=math.random(5) if rand[n]==1 then loading[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==2 then loading[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) loading[n].alpha=1 print("B2") elseif rand[n]==3 then loading[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) loading[n].alpha=1 print("B3") elseif rand[n]==4 then loading[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) loading[n].alpha=1 print("B4") elseif rand[n]==5 then loading[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) loading[n].alpha=1 print("B5") end loading[n].x = display.contentCenterX + 115 loading[n].y = display.contentCenterY-45 counter[n]=counter[n]+1 if counter[n] ~= 5 then timer.performWithDelay(700, function() powerup(0); end) print("rieseguo") else print("counter=5") if rand[n]==1 then power\_button[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) elseif rand[n]==2 then power\_button[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) elseif rand[n]==3 then power\_button[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) elseif rand[n]==4 then power\_button[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) elseif rand[n]==5 then power\_button[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) end power\_button[n].x = display.contentCenterX + 78 power\_button[n].y = display.contentCenterY - 65 current[n]=rand[n] power\_button[n]:addEventListener("tap", powerup\_usage) used[n]=false counter[n]=0 timer.performWithDelay(700, function() powerup(0); end) end elseif not used[n] and ready\_to\_randomize[n] then print("A pieno B libero") loading[n].alpha=0 rand[n]=math.random(5) if rand[n]==1 then loading[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==2 then loading[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==3 then loading[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==4 then loading[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==5 then loading[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) loading[n].alpha=1 print("B1") end loading[n].x = display.contentCenterX + 115 loading[n].y = display.contentCenterY-45 counter[n]=counter[n]+1 if counter[n] ~= 5 then print("rieseguo") timer.performWithDelay(700, function() powerup(0); end) else print("counter=5") staging\_powerup[n]=rand[n] ready\_to\_randomize[n]=false timer.performWithDelay(700, function() powerup(0); end) end elseif used[n] and not ready\_to\_randomize[n] then print("A libero, B pieno") power\_button[n].alpha=0 rand[n] = staging\_powerup[n] if rand[n]==1 then power\_button[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) elseif rand[n]==2 then power\_button[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) elseif rand[n]==3 then power\_button[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) elseif rand[n]==4 then power\_button[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) elseif rand[n]==5 then power\_button[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) end power\_button[n].x = display.contentCenterX + 78 power\_button[n].y = display.contentCenterY-65 current[n]=rand[n] power\_button[n]:addEventListener("tap", powerup\_usage) used[n]=false ready\_to\_randomize[n]=true counter[n]=0 timer.performWithDelay(700, function() powerup(0); end) elseif not used[n] and not ready\_to\_randomize[n] then loading[n].alpha=1 print("A pieno, B pieno") timer.performWithDelay(700, function() powerup(0); end) end end --timer.performWithDelay(700, functio --timer.performWithDelay(700, powerup(1)) local function temp() powerup(0) end timer.performWithDelay( 700, function() powerup(0); end)

Managed to solve everything. Thank you very much!

Which function are you talking about?

I assume the problem is in the one called “powerup” but I’m not sure I parameterized in the right way

You’re running into one of the classic problems. Functions like timer.performWithDelay, transition.to, etc. all want an “address to the function to execute” when time comes.  When you call a function with parameters:  

powerup(0)

The function actually runs and returns a value, likely nil if you don’t have a “return” statement.

The result of this is that powerup(0) runs immediately and you are returning the value “true” so what you end up executing is:

timer.performWithDelay( 700, true )

To solve this you have to either not pass a value to powerup() and come up with some other method of letting powerup() what value it nees:

timer.performWithDelay(700, powerup ) -- note it's just the name of the function

Or what most people would do is use an anonymous function:

timer.performWithDelay( 700, function()                                                     powerup(0);                                                end ) 

This gets timer.performWithDelay an address of a function and when time comes it runs it, which calls your function with the parameters you want.

Rob

I’ll try this as soon as possible, thank you for advice!

I’ve fixed the code (I didn’t actually need the “return true”) but now I get stack overflow. Dunno why but it seems to perform all the randomize stuff and things consequently without waiting for the delay. I still don’t get why. When my code was not parameterized it didn’t use to do that. However that’s the code:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --\> POWERUPS local used = {} used[0]=true used[1]=true local ready\_to\_randomize = {} ready\_to\_randomize[0]=true ready\_to\_randomize[1]=true local counter = {} counter[0]=true counter[1]=true local loading = {} local rand = {} local power\_button = {} local current = {} local powerup\_sound = {} local counter = {} counter[0]=-1 counter[1]=-1 local staging\_powerup = {} local function restorePower()--ripristina potenza di tiro shootPowerDefault=0.01 end local function restoreDim()--ripristina dimensioni(?) pdim=10 end local function powerup\_usage() -- power\_button\_red.fill.effect = "filter.grayscale" power\_button[n].alpha=0 used[n]=true print ("X") if current[n]==1 then print ("a") powerup\_sound[n] = audio.loadSound( "sounds/powerup1\_sound.wav") audio.play(powerup1\_sound, {channel=6}) ball.isAwake=false elseif current[n]==2 then print ("b") powerup\_sound[n] = audio.loadSound( "sounds/powerup2\_sound.wav" ) audio.play(powerup2\_sound, {channel=6}) elseif current[n]==3 then print ("c") powerup\_sound[n] = audio.loadSound( "sounds/powerup3\_sound.wav" ) audio.play(powerup\_sound[n], {channel=6}) shootPowerDefault=0.1 timer.performWithDelay(1500, restorePower) elseif current[n]==4 then print ("d") powerup\_sound[n] = audio.loadSound( "sounds/powerup4\_sound.wav" ) audio.play(powerup\_sound[n], {channel=6}) pdim=30 timer.performWithDelay(1500, restoreDim) end print ("Y") end --TODO sistemare posizioni powerup local function powerup(n) if counter[n]~=-1 then loading[n].alpha=0 else counter[n]=0 end if used[n] and ready\_to\_randomize[n] then print("A libero B libero") rand[n]=math.random(5) if rand[n]==1 then loading[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==2 then loading[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) loading[n].alpha=1 print("B2") elseif rand[n]==3 then loading[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) loading[n].alpha=1 print("B3") elseif rand[n]==4 then loading[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) loading[n].alpha=1 print("B4") elseif rand[n]==5 then loading[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) loading[n].alpha=1 print("B5") end loading[n].x = display.contentCenterX + 115 loading[n].y = display.contentCenterY-45 counter[n]=counter[n]+1 if counter[n] ~= 5 then timer.performWithDelay(700, powerup(n)) print("rieseguo") else print("counter=5") if rand[n]==1 then power\_button[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) elseif rand[n]==2 then power\_button[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) elseif rand[n]==3 then power\_button[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) elseif rand[n]==4 then power\_button[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) elseif rand[n]==5 then power\_button[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) end power\_button[n].x = display.contentCenterX + 78 power\_button[n].y = display.contentCenterY - 65 current[n]=rand[n] power\_button[n]:addEventListener("tap", powerup\_usage) used[n]=false counter[n]=0 timer.performWithDelay(700, powerup(n)) end elseif not used[n] and ready\_to\_randomize[n] then print("A pieno B libero") loading[n].alpha=0 rand[n]=math.random(5) if rand[n]==1 then loading[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==2 then loading[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==3 then loading[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==4 then loading[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) loading[n].alpha=1 print("B1") elseif rand[n]==5 then loading[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) loading[n].alpha=1 print("B1") end loading[n].x = display.contentCenterX + 115 loading[n].y = display.contentCenterY-45 counter[n]=counter[n]+1 if counter[n] ~= 5 then print("rieseguo") timer.performWithDelay(700, powerup(n)) else print("counter=5") staging\_powerup[n]=rand[n] ready\_to\_randomize[n]=false timer.performWithDelay(700, powerup(n)) end elseif used[n] and not ready\_to\_randomize[n] then print("A libero, B pieno") power\_button[n].alpha=0 rand[n] = staging\_powerup[n] if rand[n]==1 then power\_button[n]=display.newImageRect("powerups/powerup1.png", 30, 30 ) elseif rand[n]==2 then power\_button[n]=display.newImageRect("powerups/powerup2.png", 30, 30 ) elseif rand[n]==3 then power\_button[n]=display.newImageRect("powerups/powerup3.png", 30, 30 ) elseif rand[n]==4 then power\_button[n]=display.newImageRect("powerups/powerup4.png", 30, 30 ) elseif rand[n]==5 then power\_button[n]=display.newImageRect("powerups/powerup5.png", 30, 30 ) end power\_button[n].x = display.contentCenterX + 78 power\_button[n].y = display.contentCenterY-65 current[n]=rand[n] power\_button[n]:addEventListener("tap", powerup\_usage) used[n]=false ready\_to\_randomize[n]=true counter[n]=0 timer.performWithDelay(700, powerup(n)) elseif not used[n] and not ready\_to\_randomize[n] then loading[n].alpha=1 print("A pieno, B pieno") timer.performWithDelay(700, powerup(n)) end end --timer.performWithDelay(700, powerup(1)) timer.performWithDelay( 700, powerup(0))

You have a lot of recursion going on inside of powerup(). Recursion is functions that call themselves. Look at all of the times you call powerup() within powerup(). Lua allows recursion, but if you do it too much you will fill up the function call stack and get a stack overflow.

Rob

I know, I meant to do like and it worked. The function has to be restarted after each goal (have to add that). The problem is that the powerup function is executed without waiting for the 700ms and I don’t get why. Here in console it shows thousands of prints in a fraction of 2 seconds and I don’t get why.

It’s because you’re still calling powerup() with a parameter instead of providing the address of the powerup function to timer.performWithDisplay.  Those all need to be converted to Anonymous functions like I detailed above.

Rob