Hi, I’m simply trying to get the Game working after it goes thru the Restart. When you try to play the game a second time, it produces the error game.lua 300: attempt to call method ‘insert’ (a nil value). This error refers to my spawn2 function. I have tried moving functions around to fix it to no avail. Here is game file https://www.dropbox.com/s/bt4h7ngvgy40nqd/FIX.zip?dl=0
I should note that I have been using the restart.lua method of restarting the game.Also to restart the game simply drag the red square to the green square.
-------VARIABLES local background local failedSound local pickUpSound local powerUpSound local menu --local score local highScore local scoreLabel local rewardLabel local rewardBar local penaltyLabel local penaltyBar local player local objects = {} local tPrevious = system.getTimer( ) local speedFactor = 1 --------------------- local Player = require( "Player" ) local Spawn = require( "Spawn" ) local sceneGroup, player1,spawn,timerId local composer = require( "composer" ) local scene = composer.newScene() local physics = require ("physics") --local score = require( "Score" ) physics.start() physics.setGravity( 0, 0 ) physics.setScale( 60 ) --physics.setDrawMode( "hybrid" ) --------------- FUNCTION VARIABLES --------------- -- Variables to hold the function pointers. -- This is only to have one place to show them off. local loadScores local saveScores local createPlayer local randomSpeed local calculateNewVelocity local showMenu local startGame local createMenu local gameOver local coerceOnScreen local onTouch local spawn local gameSpecial local onCollision local animate local randomSpeed --Hide the status bar. display.setStatusBar( display.HiddenStatusBar) --local function realCollision ( event ) --------Collision Event --if ( event.phase == "began" ) then --composer.gotoScene( "Restart" ) --end --end local function addColumns() local PillarCollisionFilter = { categoryBits = 10 , maskBits = 6 } height = math.random(display.contentCenterY - 100, display.contentCenterY + 100) topColumn = display.newRect (40, -20, 52, 280) topColumn.objectType = "pillar" topColumn:setFillColor( 1, 1, 1 ) topColumn.anchorX = 0.5 topColumn.anchorY = 0.9 topColumn.x = display.contentWidth + 300 topColumn.y = height - 160 topColumn.scoreAdded = false physics.addBody(topColumn, "static",{ density=1, bounce=0.1, friction=.2, filter=PillarCollisionFilter} ) elements:insert(topColumn) bottomColumn = display.newRect (40, 340, 52, 280) bottomColumn:setFillColor( 1, 1, 1 ) bottomColumn.objectType = "pillar" bottomColumn.anchorX = 0.5 bottomColumn.anchorY = 0.65 bottomColumn.x = display.contentWidth + 300 bottomColumn.y = height + 160 physics.addBody(bottomColumn, "static", {density=1, bounce=0.1, friction=.2, filter=PillarCollisionFilter} ) elements:insert(bottomColumn) end local function moveColumns() for a = elements.numChildren,1,-1 do if(elements[a].x \> -100) then elements[a].x = elements[a].x - 17 else elements:remove(elements[a]) end end end -- Actual Scene function scene:create( event ) print( "Hello" ) local sceneGroup = self.view ----Setting Up Reset Values -- local gameIsOver = false ---speedFactor = 1 local background = display.newRect( 0, 0, display.contentWidth, display.contentHeight ) -----Sets Background to White background:setFillColor( .085, .78, 1 ) background.x = display.contentCenterX background.y = display.contentCenterY sceneGroup:insert(background) ---------------------------------------------------------------------Add as score label -- local score = {} -- local score = 0 --local scoreLabel = display.newText( score, 0,0, native.systemFontBold, 24) -- scoreLabel.x = display.viewableContentWidth / 1.5 -- scoreLabel.y = display.viewableContentHeight / 15 -- scoreLabel :setTextColor(1, 1, 1 ) --scoreLabel.isVisible = true --sceneGroup:insert(score) --------------------------------------------------------------------Collision Detection--------- local function reset () -- timer.performWithDelay(100, function() display.remove( event.object2 ) end ) -- timer.performWithDelay(100, function() display.remove( player1) end ) -- player1 = nil -- timer.performWithDelay(100,function() display.remove(score) end) -- score = nil --timer.cancel( timerId ) timer.cancel(addColumnTimer) timer.cancel(moveColumnTimer) --timer.cancel(timerId2) --sceneGroup = nil --self.player1:removeSelf() -- table.remove(sceneGroup) --for index,ref in pairs(world) do display.remove(world) -- background:removeEventListener( "touch", background ); Runtime:removeEventListener ( "collision", realCollision ) composer.gotoScene ("Restart" , transitionOptions) end elements = display.newGroup() elements.anchorChildren = true elements.anchorX = 0 elements.anchorY = 1 elements.x = 0 elements.y = 0 sceneGroup:insert(elements) ----------------------------------------------------Insert Player1 local player1 = Player.new(50, 50, "player1") physics.addBody( player1, "dynamic", {density=10.0, bounce=0.0, friction=0.2} ) player1.objectType = "player1" player1:setFillColor( 1, .2 , .2 ) player1BodyElement = { filter=player1CollisonFilter} player1.isBullet = true player1.isSensor = true player1.value = 0 sceneGroup:insert(player1) -------------------------------------------------------Enemies------------------ local spawnCollisionFilter = { groupIndex = -2 } local function addspawn ( ) local spawn = Spawn.spawn( 10, 10, "food" ) physics.addBody( spawn, "dynamic", { density=0.1, filter=spawnCollisionFilter } ) spawnBodyElement = { groupIndex = -2 } spawn:applyForce( 8, 0, spawn.x, spawn.y ) -- spawn:applyForce( 8, 0, 0 \* spawn.mass, 1 \* spawn.mass, spawn.x, spawn.y ) --spawn.objectType = objectType2 spawn.objectType = "food" spawn.isFixedRotation = true spawn.isBullet = true spawn.value = -2 sceneGroup:insert(spawn) print( "Working REpeat" ) end timerId = timer.performWithDelay( 1000, addspawn ,-1 ) ----------------------------------------------------------------------------------------------- local GreenCollisionFilter = { groupIndex = -2 } local function addspawn2 ( ) local spawn2 = Spawn.spawn(10, 10, "food3") physics.addBody( spawn2, "dynamic", {density=0.1,filter=GreenCollisionFilter} ) spawn2.objectType = "food3" spawn2:setFillColor( 0, 255, 0 ) spawn2.isFixedRotation = true spawn2.speedFactor = 1 spawn2.isBullet = true spawn2:applyForce( 0, 8, spawn2.x, spawn2.y ) spawn2.value = -2 --spawn2:applyForce( 0, 8, 0 \* spawn2.mass, 1 \* spawn2.mass, spawn2.x, spawn2.y ) spawn2.y = .3 sceneGroup:insert(spawn2) print( "Working REpeat2" ) end timerId2 = timer.performWithDelay( 1000, addspawn2 ,-1 ) function background:touch( event )------------------------ --print ("Player Touched") if gameisOver then return end if event.phase == "began" then player1.isFocus = true player1.x0 = event.x - player1.x player1.y0 = event.y - player1.y elseif player1.isFocus then if "moved" == event.phase then player1.x = event.x - player1.x0 player1.y = event.y - player1.y0 --coerceOnScreen( player1 ) elseif "ended" == phase or "cancelled" == phase then self.isFocus = false end end -- Return true if touch event has been handled. return true end -- background:addEventListener( "touch", background ) -----------------------------------------------------------Player1 Move Table------------ local movetable = {} local function animate( event ) player1.rotation = player1.rotation + 2 return true end --Runtime:addEventListener( "enterFrame", animate ); --end ------------------------------------------------------End of Player1 Table---------- -------------------------------------------------------Creation of COlumns----------- local function realCollision ( event ) if "began" == event.phase then local food = "food" local food3 = "food3" local pillar = "pillar" --local object1 = "player1" if event.object1.objectType == "player1" and food == event.object2.objectType then ---INCREASE SCORE print ( " YOU GAIN POINTS ") -- Score.add(value) --score = score + 1 --scoreLabel.text = tostring(score) timer.performWithDelay(100, function() display.remove( event.object1.objectType ) end ) timer.cancel(timerId ,timerId2 ,addColumnTimer , moveColumnTimer) else if event.object2.objectType == "food3" and "player1" == event.object1.objectType then print ( " YOU LOSE POINTS ") -- score = score - 1 -- scoreLabel.text = tostring(score) timer.performWithDelay(1,reset) ---elseif other.type == "player1" then -- local function removeObj () -- physics.removeBody( player1 ) -- other:removeSelf( ) -- timer.performWithDelay(100, function() display.remove( event.object2 ) end )else --if event.object1.objectType == "player" and pillar == event.object2.objectType then print ( "GAME OVER") --timer.performWithDelay(100, reset) end end end end --end -- Start listening to collision events. --Runtime:addEventListener ( "collision", realCollision ) ----------------------------------------------------------------END OF SCENE CREATE -------------Start function scene: show (event) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then -- Called when the scene is still off screen (but is about to come on screen). 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. addColumnTimer = timer.performWithDelay(2050, addColumns, -1) moveColumnTimer = timer.performWithDelay(1, moveColumns, -1) Runtime:addEventListener( "enterFrame", animate ); Runtime:addEventListener ( "collision", realCollision ); background:addEventListener( "touch", background ) --physics.start() end end end -- "scene:hide()" add end and this should b bottom function scene:hide( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then -- Runtime:removeEventListener("collision", onCollision) -- background:removeEventListener( "touch", background ); --Runtime:removeEventListener ( "collision", realCollision ) -- Runtime:removeEventListener ( "enterFrame", animate ); --local function leavingNow() composer.gotoScene( "Restart" ) timer.cancel(timerId,timerId2,addColumnTimer,moveColumnTimer) --print("EXCUTED") -- end elseif ( phase == "did" ) then -- Called immediately after scene goes off screen. end end -- "scene:destroy()" function scene:destroy( event ) Runtime:removeEventListener ( "enterFrame", animate ); -- table.remove(sceneGroup , elements) -- package.loaded[physics] = nil --physics = nil -- 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