Scene not switching to restart.lua .

I have a line of code ( a collision one ) and it isn’t switching my restart.lua file . I don’t know what is wrong here but I need some assistance .

So here is level1.lua:( lines 107 to 117 is where the collision listener is):

local composer = require( "composer" ) local scene = composer.newScene() local physics = require( "physics" ) physics.start() physics.setGravity(0, 200) local score = require( "score" ) local scoreText = score.init({ fontSize = 50, font = "00\_starmap - Shortcut", x = display.contentCenterX, y = 50, maxDigits = 7, leadingZeros = false, filename = "restart.lua", }) local myObject local wall local wall2 local wall3 local block local block2 local background local ground 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 physics.start() physics.pause() background = display.newImage( "background.png" ) sceneGroup:insert( background ) ground = display.newImage( "ground.png" ) sceneGroup:insert( ground ) ground.isGround = true physics.addBody( ground, "static" , { friction=0.5, bounce=0.1 } ) ground.collision = onCollision 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=.8 } ) block.collision = onCollision 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 onCollision = function( self, event ) local other = event.other if event.phase == "began" and event.target == block and event.other == myObject then timer.performWithDelay( 30, function ( increaseScore ) score.add(1) 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 block.y = 35 elseif ( phase == "did" ) then physics.start() block:addEventListener( "collision",block ) -- 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

And here is my restart.lua:

local composer = require( "composer" ) local scene = composer.newScene() local score = require( "score" ) 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 local button -- "scene:create()" function scene:create( event ) local sceneGroup = self.view background = display.newImage( "background.png" ) sceneGroup:insert( background ) ground = display.newImage( "ground.png" ) sceneGroup:insert( ground ) button = display.newImageRect( "button.png", 110, 80 ) sceneGroup:insert( button ) function button:touch(event) if event.phase == "ended" then composer.gotoScene("level1", "fade", 200) end return true end button:addEventListener("touch", button) end -- "scene:show()" function scene:show( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then background.x = 10 background.y = 308 button.x = 160 button.y = 300 ground.x = 145 ground.y = 480 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 -- "scene:hide()" 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

What is wrong here and what steps do I need to take to fix this and avoid it in the future .

What isn’t working,? Are the objects actually colliding? Is the collision registering correctly? Your best step forward right now is to include print statements in the collision function to see what is happening.

At line 119 you overwrite your first collision function with a second collision function. The second collision function does not have a composer.gotoScene() call in it.

Rob

Rob I don’t want to go to any scene . I want to be able to go to restart.lua when the block hits the ground and also increase my score when the block hits MyObject ( and restart the scene when I come back to it from restart.lua ). When I put composer.gotoScene it goes back to the scene . How do I include both collision listeners and have them function correctly .

Your restart.lua has to be a scene. It’s where you are trying to go to.

You should only have one collision listener function. In side that function you should use “if” statements to made decisions on what to do. Instead of:
 

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 onCollision = function( self, event ) local other = event.other if event.phase == "began" and event.target == block and event.other == myObject then timer.performWithDelay( 30, function ( increaseScore ) score.add(1) end ) self:removeEventListener( "collision" ) end return true end 

do:

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" ) elseif event.phase == "began" and event.target == block and event.other == myObject then timer.performWithDelay( 30, function ( increaseScore ) score.add(1) end ) self:removeEventListener( "collision" ) end return true end

What isn’t working,? Are the objects actually colliding? Is the collision registering correctly? Your best step forward right now is to include print statements in the collision function to see what is happening.

At line 119 you overwrite your first collision function with a second collision function. The second collision function does not have a composer.gotoScene() call in it.

Rob

Rob I don’t want to go to any scene . I want to be able to go to restart.lua when the block hits the ground and also increase my score when the block hits MyObject ( and restart the scene when I come back to it from restart.lua ). When I put composer.gotoScene it goes back to the scene . How do I include both collision listeners and have them function correctly .

Your restart.lua has to be a scene. It’s where you are trying to go to.

You should only have one collision listener function. In side that function you should use “if” statements to made decisions on what to do. Instead of:
 

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 onCollision = function( self, event ) local other = event.other if event.phase == "began" and event.target == block and event.other == myObject then timer.performWithDelay( 30, function ( increaseScore ) score.add(1) end ) self:removeEventListener( "collision" ) end return true end 

do:

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" ) elseif event.phase == "began" and event.target == block and event.other == myObject then timer.performWithDelay( 30, function ( increaseScore ) score.add(1) end ) self:removeEventListener( "collision" ) end return true end