Instantly going to retart.lua.

When I try to go to level1.lua from my menu scene it instantly goes to my reload.lua . Why is this ? level1.lua:

local composer = require( "composer" ) local scene = composer.newScene() local physics = require( "physics" ) physics.start() physics.setGravity(0, 40) local myObject local wall local wall2 local wall3 local block local block2 local mAbs = math.abs local mRand = math.random local mDeg = math.deg local mRad = math.rad local mCos = math.cos local mSin = math.sin local mAcos = math.acos local mAsin = math.asin local mSqrt = math.sqrt local mCeil = math.ceil local mFloor = math.floor local mAtan2 = math.atan2 local mPi = math.pi local getInfo = system.getInfo local getTimer = system.getTimer local strMatch = string.match local strFormat = string.format local pairs = pairs function scene:create( event ) local sceneGroup = self.view local background = display.newImage( "background.png" ) sceneGroup:insert( background ) local ground = display.newImage( "ground.png" ) sceneGroup:insert( ground ) ground.isGround = true physics.addBody( ground, "static" , { friction=0.5, bounce=0.1 } ) myObject = display.newRect( 0, 0, 100, 30 ) sceneGroup:insert( myObject ) myObject.isMyObject = true myObject:setFillColor( 0 ) physics.addBody( myObject, "kinematic" , { myObject, friction=0.5, bounce=2 } ) function myObject:touch( event ) if( event.phase == "moved" ) then self.x = event.x self.y = event.y end return true end myObject:addEventListener( "touch", myObject ) wall = display.newImageRect( "wall.png", 600, 300 ) sceneGroup:insert( wall ) wall.rotation = 90 physics.addBody( wall, "static" , { wall, friction=0.5, bounce=0.5 } ) wall2 = display.newImageRect( "wall2.png", 500, 300 ) sceneGroup:insert( wall2 ) wall.rotation = 90 physics.addBody( wall2, "static" , { wall2, friction=0.5, bounce=0.5 } ) wall3 = display.newImageRect( "wall3.png", 600, 300 ) sceneGroup:insert( wall3 ) wall3.rotation = 90 physics.addBody( wall3, "static" , { wall3, friction=0.5, bounce=0.5 } ) block = display.newImage( "block.png" ) sceneGroup:insert( block ) block.isBlock = true block.rotation = 8 physics.addBody( block, "dynamic" , { block, friction=0.5, bounce=0.5 } ) block.collision = onCollision block:addEventListener( "collision" ) block2 = display.newImage( "block2.png" ) sceneGroup:insert( block2 ) block2.isBlock = true block2.rotation = 8 physics.addBody( block2, "dynamic" , { block2, friction=0.5, bounce=0.5 } ) block2.collision = onCollision block2:addEventListener( "collision" ) end onCollision = function( self, event ) local other = event.other if( event.phase == "began" and self.isBlock and other.isGround ) then timer.performWithDelay( 30, function() composer.gotoScene ( "restart", "fade", 0 ) end ) self:removeEventListener( "collision" ) end return true end function scene:show( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then background.x = 10 background.y = 308 ground.x = 145 ground.y = 480 myObject.x = 145 myObject.y = 400 wall.x = -150 wall.y = 250 wall2.x = 210 wall2.y = -194 wall3.x = 470 wall3.y = 250 block.x = 200 block2.x = 100 elseif ( phase == "did" ) then -- Called when the scene is now on screen. -- Insert code here to make the scene come alive. -- Example: start timers, begin animation, play audio, etc. end end function scene:hide( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then -- Called when the scene is on screen (but is about to go off screen). -- Insert code here to "pause" the scene. -- Example: stop timers, stop animation, stop audio, etc. elseif ( phase == "did" ) then -- Called immediately after scene goes off screen. end end -- "scene:destroy()" function scene:destroy( event ) local sceneGroup = self.view -- Called prior to the removal of scene's view ("sceneGroup"). -- Insert code here to clean up the scene. -- Example: remove display objects, save state, etc. end -- ------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) -- ------------------------------------------------------------------------------- return scene

Restart.lua:

local composer = require( "composer" ) local scene = composer.newScene() function scene:create( event ) end background = display.newImage( "background.png" ) background.x = 10; background.y = 308 ground = display.newImage( "ground.png" ) ground.x = 145; ground.y = 480 loseTxt = display.newImageRect( "loseTxt.png", 335, 200 ) loseTxt.x = 160 loseTxt.y = 30 button = display.newImageRect( "button.png", 110, 80 ) button.x = 160 button.y = 300 function button:touch(event) if event.phase == "ended" then composer.gotoScene("level1", "fade", 0 ) end return true end button:addEventListener("touch", button) function scene:show( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then elseif ( phase == "did" ) then end end function scene:hide( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then elseif ( phase == "did" ) then end end function scene:destroy( event ) local sceneGroup = self.view end scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) return scene

Thank you for your help.

So, I tried your level1 code and got an error. Line 118: attempt to index global ‘background’ (a nil value). Based on this, I would say that the error isn’t in that file, but rather in your menu file.

Btw, you get this error because you have background locally declared in the scene:create() method. You can just forward declare it like you did with wall, wall2, etc.

This is very likely because you are calling physics.start() as soon as you load the module. When you add your bodies, the scene is still off screen but physics is running. Your blocks fall before your scene transitions on screen and it detects the collision.

What I would to is remove physics.start() from the top.  For simple apps in main.lua that may be fine, but for scene managed apps, this is not the best place to call physics.start().

Inside of scene:create(), call:

physics.start() physics.pause()

This will enable physics so that you can add bodies, but the simulation is paused so no interaction happens.  Then in scene:show()'s “did” phase call

physics.start()

to unpause the simulation and start things once the scene is fully on the screen.

Rob

So, I tried your level1 code and got an error. Line 118: attempt to index global ‘background’ (a nil value). Based on this, I would say that the error isn’t in that file, but rather in your menu file.

Btw, you get this error because you have background locally declared in the scene:create() method. You can just forward declare it like you did with wall, wall2, etc.

This is very likely because you are calling physics.start() as soon as you load the module. When you add your bodies, the scene is still off screen but physics is running. Your blocks fall before your scene transitions on screen and it detects the collision.

What I would to is remove physics.start() from the top.  For simple apps in main.lua that may be fine, but for scene managed apps, this is not the best place to call physics.start().

Inside of scene:create(), call:

physics.start() physics.pause()

This will enable physics so that you can add bodies, but the simulation is paused so no interaction happens.  Then in scene:show()'s “did” phase call

physics.start()

to unpause the simulation and start things once the scene is fully on the screen.

Rob