Need help with scene change.

Ok i got 2 scenes

  1. is menu one
  2. game
     

after gameover i should go back too menu scene.

So i need remove all objects and move too next scene. But this aint wroking for me.

This add new object too my game.
 

local f = timer.performWithDelay( 500, addNewObject, 0 ) end

this is my object function

 

local function addNewObject() local startX = math.random(display.contentWidth\*0.1,display.contentWidth\*0.9) local a = math.random(1,12) if(a\<=5)then local rock = display.newImage( "rock.png", startX, -300) physics.addBody( rock ) rock.enterFrame = offscreen Runtime:addEventListener( "enterFrame", rock ) rock:addEventListener( "touch", rockTouched ) elseif(a==12)then local b=math.random(1,5) if (b==1) then g="bad-blue.png" elseif(b==2)then g="bad-green.png" elseif(b==3)then g="bad-purple.png" elseif(b==4)then g="bad-red.png" else g="bad-yellow.png" end local badjelly = display.newImage(g, startX, -300) physics.addBody( badjelly ) badjelly.enterFrame = offscreen Runtime:addEventListener( "enterFrame", badjelly ) badjelly:addEventListener( "touch", badJellyTouched ) elseif(a==10)then local jar = display.newImage( "jar.png", startX, -300) physics.addBody( jar ) jar.enterFrame = offscreen Runtime:addEventListener( "enterFrame", jar ) jar:addEventListener( "touch", jarTouched ) elseif(a==11)then local powerJelly = display.newImage( "Power Jelly.png", startX, -300) physics.addBody( powerJelly ) powerJelly.enterFrame = offscreen Runtime:addEventListener( "enterFrame", powerJelly ) powerJelly:addEventListener( "touch", superJellyTouched ) else local b=math.random(1,5) if (b==1) then g="jelly-blue.png" elseif(b==2)then g="jelly-green.png" elseif(b==3)then g="jelly-purple.png" elseif(b==4)then g="jelly-red.png" else g="jelly-yellow.png" end local jelly = display.newImage(g, startX, -300) physics.addBody( jelly ) jelly.enterFrame = jellyoffscreen Runtime:addEventListener( "enterFrame", jelly ) jelly:addEventListener( "touch", jellyTouched ) end end

and after that my gameover function

 

local function gameOver() composer.gotoScene( "menu", "fade", 500 ) end

Now the problem is i get all time “nil” error. I want just move back too my Menu scene.

  • i tried remove object etc, but i did it wrong i guess. 

I read some stuff, watched vid on YT. It not helping me at all. 
Can someone plz help me solve this? Thanks.

i think you’re going to need more code and a fuller description of your error. For example, we’ve no context for where your object creation function is, or if your created objects are ever being inserted into a scene group. Nor any idea what exactly is ‘nil’.

local composer = require( "composer" ) local scene = composer.newScene() function scene:create( event ) local sceneGroup = self.view -- Start the physics engine local physics = require( "physics" ) physics.start() -- Calculate half the screen width and height halfW = display.contentWidth\*0.5 halfH = display.contentHeight\*0.5 -- Set the background local bkg = display.newImage( "night\_sky.png", halfW, halfH ) -- Score score = 0 Wynik = display.newText("Score: ",halfW,10 ) Wynik.x = 30 Wynik.y = 5 scoreText = display.newText(score,0,10 ) scoreText:setFillColor( 20, 10, 0 ) scoreText.x = 60 scoreText.y = 5 live = 3 liveText = display.newText(live,halfW,10 ) liveText:setFillColor( 20, 10, 0 ) liveText.x = 280 liveText.y = 5 zycia = display.newText("Lives:",halfW,10 ) zycia.x = 255 zycia.y = 5 local function jellyTouched(event) if ( event.phase == "began" ) then Runtime:removeEventListener( "enterFrame", event.self ) event.target:removeSelf() score = score + 1 scoreText.text = score end end local function rockTouched(event) if ( event.phase == "began" ) then Runtime:removeEventListener( "enterFrame", event.self ) event.target:removeSelf() if(live==0)then gameOver() else live = live-1 liveText.text = live end end end local function badJellyTouched(event) if ( event.phase == "began" ) then Runtime:removeEventListener( "enterFrame", event.self ) event.target:removeSelf() score = 0 scoreText.text = score if(live==0)then gameOver() else live = live-1 liveText.text = live end end end local function superJellyTouched(event) if ( event.phase == "began" ) then Runtime:removeEventListener( "enterFrame", event.self ) event.target:removeSelf() score = score\*2 scoreText.text = score end end local function jarTouched(event) if ( event.phase == "began" ) then Runtime:removeEventListener( "enterFrame", event.self ) event.target:removeSelf() if(live\<3)then live = live+1 liveText.text = live end end end -- Delete objects which has fallen off the bottom of the screen local function offscreen(self, event) if(self.y == nil) then return end if(self.y \> display.contentHeight + 50) then Runtime:removeEventListener( "enterFrame", self ) self:removeSelf() end end local function jellyoffscreen(self, event) if(self.y == nil) then return end if(self.y \> display.contentHeight + 50) then if(live==0)then gameOver() else live = live-1 liveText.text = live end Runtime:removeEventListener( "enterFrame", self ) self:removeSelf() end end local function addNewObject() local startX = math.random(display.contentWidth\*0.1,display.contentWidth\*0.9) local a = math.random(1,12) if(a\<=5)then local rock = display.newImage( "rock.png", startX, -300) physics.addBody( rock ) rock.enterFrame = offscreen Runtime:addEventListener( "enterFrame", rock ) rock:addEventListener( "touch", rockTouched ) elseif(a==12)then local b=math.random(1,5) if (b==1) then g="bad-blue.png" elseif(b==2)then g="bad-green.png" elseif(b==3)then g="bad-purple.png" elseif(b==4)then g="bad-red.png" else g="bad-yellow.png" end local badjelly = display.newImage(g, startX, -300) physics.addBody( badjelly ) badjelly.enterFrame = offscreen Runtime:addEventListener( "enterFrame", badjelly ) badjelly:addEventListener( "touch", badJellyTouched ) elseif(a==10)then local jar = display.newImage( "jar.png", startX, -300) physics.addBody( jar ) jar.enterFrame = offscreen Runtime:addEventListener( "enterFrame", jar ) jar:addEventListener( "touch", jarTouched ) elseif(a==11)then local powerJelly = display.newImage( "Power Jelly.png", startX, -300) physics.addBody( powerJelly ) powerJelly.enterFrame = offscreen Runtime:addEventListener( "enterFrame", powerJelly ) powerJelly:addEventListener( "touch", superJellyTouched ) else local b=math.random(1,5) if (b==1) then g="jelly-blue.png" elseif(b==2)then g="jelly-green.png" elseif(b==3)then g="jelly-purple.png" elseif(b==4)then g="jelly-red.png" else g="jelly-yellow.png" end local jelly = display.newImage(g, startX, -300) physics.addBody( jelly ) jelly.enterFrame = jellyoffscreen Runtime:addEventListener( "enterFrame", jelly ) jelly:addEventListener( "touch", jellyTouched ) end end -- Keep adding a new balloon or bomb every 0.5 seconds local f = timer.performWithDelay( 500, addNewObject, 0 ) end local function gameOver() composer.gotoScene( "menu", "fade", 500 ) end function scene:hide( event ) local sceneGroup = self.view local phase = event.phase if event.phase == "will" then -- Called when the scene is on screen and is about to move off screen -- -- INSERT code here to pause the scene -- e.g. stop timers, stop animation, unload sounds, etc.) physics.stop() elseif phase == "did" then -- Called when the scene is now off screen end end function scene:destroy( event ) -- Called prior to the removal of scene's "view" (sceneGroup) -- -- INSERT code here to cleanup the scene -- e.g. remove display objects, remove touch listeners, save state, etc. local sceneGroup = self.view package.loaded[physics] = nil physics = nil end --------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) ----------------------------------------------------------------------------------------- return scene

dont have object remover right now, coz it aint working form me. ;/

Error: attempt to call global ‘gameOver’ (a nil value)

well, the big clue is in your error message! It’s looking for gameOver, and not finding it. The reason for that is scope. You’re calling gameOver further up the script than it’s ever declared. Lua is parsed ‘top down’. 

You can either pre-declare the local variable somewhere above the call to it, or you can just move the gameOver function to the very top of the file.

ie, 

This will work… because gameOver is predeclared.

local gameOver function doSomething() gameOver() end function gameOver() ... end

this will work, because gameOver is declared before you use it…

local function gameOver() ... end function doSomething() gameOver() end

But this won’t work, because gameOver doesn’t yet exist!

function doSomething() gameOver() end local function gameOver() ... end

ok i done it. Now i got error that say that physic must start before add body. Which mean i need stop my 

 

local f = timer.performWithDelay( 500, addNewObject, 0 ) end

function. But how do it? timer.stop() f.removeSelf()?? 

i used this

 

local function gameOver() timer.cancel(f) composer.gotoScene( "menu", "fade", 500 ) end

again attempt to index a nil value

can anyone help me?

Can you add a sample code? Please strip the code from all that’s unrelated to the problem.

--Here is my object creation:-\> local function addNewObject() local startX = math.random(display.contentWidth\*0.1,display.contentWidth\*0.9) local a = math.random(1,12) if(a\<=5)then local rock = display.newImage( "rock.png", startX, -300) physics.addBody( rock ) rock.enterFrame = offscreen Runtime:addEventListener( "enterFrame", rock ) rock:addEventListener( "touch", rockTouched ) elseif(a==12)then local b=math.random(1,5) if (b==1) then g="bad-blue.png" elseif(b==2)then g="bad-green.png" elseif(b==3)then g="bad-purple.png" elseif(b==4)then g="bad-red.png" else g="bad-yellow.png" end local badjelly = display.newImage(g, startX, -300) physics.addBody( badjelly ) badjelly.enterFrame = offscreen Runtime:addEventListener( "enterFrame", badjelly ) badjelly:addEventListener( "touch", badJellyTouched ) elseif(a==10)then local jar = display.newImage( "jar.png", startX, -300) physics.addBody( jar ) jar.enterFrame = offscreen Runtime:addEventListener( "enterFrame", jar ) jar:addEventListener( "touch", jarTouched ) elseif(a==11)then local powerJelly = display.newImage( "Power Jelly.png", startX, -300) physics.addBody( powerJelly ) powerJelly.enterFrame = offscreen Runtime:addEventListener( "enterFrame", powerJelly ) powerJelly:addEventListener( "touch", superJellyTouched ) else local b=math.random(1,5) if (b==1) then g="jelly-blue.png" elseif(b==2)then g="jelly-green.png" elseif(b==3)then g="jelly-purple.png" elseif(b==4)then g="jelly-red.png" else g="jelly-yellow.png" end local jelly = display.newImage(g, startX, -300) physics.addBody( jelly ) jelly.enterFrame = jellyoffscreen Runtime:addEventListener( "enterFrame", jelly ) jelly:addEventListener( "touch", jellyTouched ) end end -- Here is my adding object function:-\> local f = timer.performWithDelay( 500, addNewObject, 0 ) end --Here is my gameOver (to the next scene): -\> local function gameOver() composer.gotoScene( "menu", "fade", 500 ) end

i think you’re going to need more code and a fuller description of your error. For example, we’ve no context for where your object creation function is, or if your created objects are ever being inserted into a scene group. Nor any idea what exactly is ‘nil’.

local composer = require( "composer" ) local scene = composer.newScene() function scene:create( event ) local sceneGroup = self.view -- Start the physics engine local physics = require( "physics" ) physics.start() -- Calculate half the screen width and height halfW = display.contentWidth\*0.5 halfH = display.contentHeight\*0.5 -- Set the background local bkg = display.newImage( "night\_sky.png", halfW, halfH ) -- Score score = 0 Wynik = display.newText("Score: ",halfW,10 ) Wynik.x = 30 Wynik.y = 5 scoreText = display.newText(score,0,10 ) scoreText:setFillColor( 20, 10, 0 ) scoreText.x = 60 scoreText.y = 5 live = 3 liveText = display.newText(live,halfW,10 ) liveText:setFillColor( 20, 10, 0 ) liveText.x = 280 liveText.y = 5 zycia = display.newText("Lives:",halfW,10 ) zycia.x = 255 zycia.y = 5 local function jellyTouched(event) if ( event.phase == "began" ) then Runtime:removeEventListener( "enterFrame", event.self ) event.target:removeSelf() score = score + 1 scoreText.text = score end end local function rockTouched(event) if ( event.phase == "began" ) then Runtime:removeEventListener( "enterFrame", event.self ) event.target:removeSelf() if(live==0)then gameOver() else live = live-1 liveText.text = live end end end local function badJellyTouched(event) if ( event.phase == "began" ) then Runtime:removeEventListener( "enterFrame", event.self ) event.target:removeSelf() score = 0 scoreText.text = score if(live==0)then gameOver() else live = live-1 liveText.text = live end end end local function superJellyTouched(event) if ( event.phase == "began" ) then Runtime:removeEventListener( "enterFrame", event.self ) event.target:removeSelf() score = score\*2 scoreText.text = score end end local function jarTouched(event) if ( event.phase == "began" ) then Runtime:removeEventListener( "enterFrame", event.self ) event.target:removeSelf() if(live\<3)then live = live+1 liveText.text = live end end end -- Delete objects which has fallen off the bottom of the screen local function offscreen(self, event) if(self.y == nil) then return end if(self.y \> display.contentHeight + 50) then Runtime:removeEventListener( "enterFrame", self ) self:removeSelf() end end local function jellyoffscreen(self, event) if(self.y == nil) then return end if(self.y \> display.contentHeight + 50) then if(live==0)then gameOver() else live = live-1 liveText.text = live end Runtime:removeEventListener( "enterFrame", self ) self:removeSelf() end end local function addNewObject() local startX = math.random(display.contentWidth\*0.1,display.contentWidth\*0.9) local a = math.random(1,12) if(a\<=5)then local rock = display.newImage( "rock.png", startX, -300) physics.addBody( rock ) rock.enterFrame = offscreen Runtime:addEventListener( "enterFrame", rock ) rock:addEventListener( "touch", rockTouched ) elseif(a==12)then local b=math.random(1,5) if (b==1) then g="bad-blue.png" elseif(b==2)then g="bad-green.png" elseif(b==3)then g="bad-purple.png" elseif(b==4)then g="bad-red.png" else g="bad-yellow.png" end local badjelly = display.newImage(g, startX, -300) physics.addBody( badjelly ) badjelly.enterFrame = offscreen Runtime:addEventListener( "enterFrame", badjelly ) badjelly:addEventListener( "touch", badJellyTouched ) elseif(a==10)then local jar = display.newImage( "jar.png", startX, -300) physics.addBody( jar ) jar.enterFrame = offscreen Runtime:addEventListener( "enterFrame", jar ) jar:addEventListener( "touch", jarTouched ) elseif(a==11)then local powerJelly = display.newImage( "Power Jelly.png", startX, -300) physics.addBody( powerJelly ) powerJelly.enterFrame = offscreen Runtime:addEventListener( "enterFrame", powerJelly ) powerJelly:addEventListener( "touch", superJellyTouched ) else local b=math.random(1,5) if (b==1) then g="jelly-blue.png" elseif(b==2)then g="jelly-green.png" elseif(b==3)then g="jelly-purple.png" elseif(b==4)then g="jelly-red.png" else g="jelly-yellow.png" end local jelly = display.newImage(g, startX, -300) physics.addBody( jelly ) jelly.enterFrame = jellyoffscreen Runtime:addEventListener( "enterFrame", jelly ) jelly:addEventListener( "touch", jellyTouched ) end end -- Keep adding a new balloon or bomb every 0.5 seconds local f = timer.performWithDelay( 500, addNewObject, 0 ) end local function gameOver() composer.gotoScene( "menu", "fade", 500 ) end function scene:hide( event ) local sceneGroup = self.view local phase = event.phase if event.phase == "will" then -- Called when the scene is on screen and is about to move off screen -- -- INSERT code here to pause the scene -- e.g. stop timers, stop animation, unload sounds, etc.) physics.stop() elseif phase == "did" then -- Called when the scene is now off screen end end function scene:destroy( event ) -- Called prior to the removal of scene's "view" (sceneGroup) -- -- INSERT code here to cleanup the scene -- e.g. remove display objects, remove touch listeners, save state, etc. local sceneGroup = self.view package.loaded[physics] = nil physics = nil end --------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) ----------------------------------------------------------------------------------------- return scene

dont have object remover right now, coz it aint working form me. ;/

Error: attempt to call global ‘gameOver’ (a nil value)

well, the big clue is in your error message! It’s looking for gameOver, and not finding it. The reason for that is scope. You’re calling gameOver further up the script than it’s ever declared. Lua is parsed ‘top down’. 

You can either pre-declare the local variable somewhere above the call to it, or you can just move the gameOver function to the very top of the file.

ie, 

This will work… because gameOver is predeclared.

local gameOver function doSomething() gameOver() end function gameOver() ... end

this will work, because gameOver is declared before you use it…

local function gameOver() ... end function doSomething() gameOver() end

But this won’t work, because gameOver doesn’t yet exist!

function doSomething() gameOver() end local function gameOver() ... end

ok i done it. Now i got error that say that physic must start before add body. Which mean i need stop my 

 

local f = timer.performWithDelay( 500, addNewObject, 0 ) end

function. But how do it? timer.stop() f.removeSelf()?? 

i used this

 

local function gameOver() timer.cancel(f) composer.gotoScene( "menu", "fade", 500 ) end

again attempt to index a nil value

can anyone help me?

Can you add a sample code? Please strip the code from all that’s unrelated to the problem.

--Here is my object creation:-\> local function addNewObject() local startX = math.random(display.contentWidth\*0.1,display.contentWidth\*0.9) local a = math.random(1,12) if(a\<=5)then local rock = display.newImage( "rock.png", startX, -300) physics.addBody( rock ) rock.enterFrame = offscreen Runtime:addEventListener( "enterFrame", rock ) rock:addEventListener( "touch", rockTouched ) elseif(a==12)then local b=math.random(1,5) if (b==1) then g="bad-blue.png" elseif(b==2)then g="bad-green.png" elseif(b==3)then g="bad-purple.png" elseif(b==4)then g="bad-red.png" else g="bad-yellow.png" end local badjelly = display.newImage(g, startX, -300) physics.addBody( badjelly ) badjelly.enterFrame = offscreen Runtime:addEventListener( "enterFrame", badjelly ) badjelly:addEventListener( "touch", badJellyTouched ) elseif(a==10)then local jar = display.newImage( "jar.png", startX, -300) physics.addBody( jar ) jar.enterFrame = offscreen Runtime:addEventListener( "enterFrame", jar ) jar:addEventListener( "touch", jarTouched ) elseif(a==11)then local powerJelly = display.newImage( "Power Jelly.png", startX, -300) physics.addBody( powerJelly ) powerJelly.enterFrame = offscreen Runtime:addEventListener( "enterFrame", powerJelly ) powerJelly:addEventListener( "touch", superJellyTouched ) else local b=math.random(1,5) if (b==1) then g="jelly-blue.png" elseif(b==2)then g="jelly-green.png" elseif(b==3)then g="jelly-purple.png" elseif(b==4)then g="jelly-red.png" else g="jelly-yellow.png" end local jelly = display.newImage(g, startX, -300) physics.addBody( jelly ) jelly.enterFrame = jellyoffscreen Runtime:addEventListener( "enterFrame", jelly ) jelly:addEventListener( "touch", jellyTouched ) end end -- Here is my adding object function:-\> local f = timer.performWithDelay( 500, addNewObject, 0 ) end --Here is my gameOver (to the next scene): -\> local function gameOver() composer.gotoScene( "menu", "fade", 500 ) end