0
votes

Here is my code. I'm making a 3 lane car racing game. Here's the screen shot.

enter image description here

On collision of the red car with any of the other cars I'm going into the restart.lua file where on tap of the screen I'm coming back to the game.lua file (code shown below). The problem occurs when control shifts back from the restart.lua to game.lua.

What happens is that the collision event occurs for no reason causing the game to continuously glitch and shift between restart and game.lua . Does anyone know why this is happening and how it could be stopped?

    local composer = require( "composer" )


local scene = composer.newScene()
local pix=0
local no=0
local physics=require "physics"
physics.start()
local x=2000
local prevP=0
local prevS=5
local count=1
-- -----------------------------------------------------------------------------------------------------------------
-- All code outside of the listener functions will only be executed ONCE unless "composer.removeScene()" is called
-- -----------------------------------------------------------------------------------------------------------------

-- Local forward references should go here

-- -------------------------------------------------------------------------------

local opp1
local opp
local sceneGroup
local roadCopy
local road
local car

function removeAllListeners(self)
  self._functionListeners = nil
  self._tableListeners = nil
end



local function touchScreen(event)
    print("touchScreen")

    if event.x < dw/2 then

        if car.current==car.posB then
            car.x=car.posA
            car.current=car.posA
        elseif car.current == car.posC then
            car.x=car.posB
            car.current=car.posB    
        end
    else

        if car.current==car.posB then
            car.x=car.posC
            car.current=car.posC
        elseif car.current == car.posA then
            car.x=car.posB
            car.current=car.posB    
        end

    end
end

local function removeListeners()
    removeAllListeners(road)
    removeAllListeners(roadCopy)
    removeAllListeners(opp)
    removeAllListeners(car)
    road:removeEventListener("tap",touchScreen)
    roadCopy:removeEventListener("tap",touchScreen)
    car:removeEventListener( "collision",onLocalCollision)
    composer.removeScene( "game")
    composer.gotoScene( "restart")
end
function onLocalCollision( event )
    print( "collision" )
    removeListeners()
end


local function moveRoad(self,event)


    if self.y > dh-20 then
        self.y=20
        pix=pix+10
        if pix > 100 then 
            road.speed=road.speed+1
            roadCopy.speed=roadCopy.speed+1
            pix=0
        else

        end
    else
        self.y=self.y+self.speed 
        pix=pix+1
         if pix > 100 then 
            road.speed=road.speed+1
            roadCopy.speed=roadCopy.speed+1
            pix=0
        else

        end
    end
    if road.speed>30 or roadCopy.speed>30 then
        road.speed=30
        roadCopy.speed=30
    end

end

local function moveoppcar(self, event)
   --to move the incoming cars
    if(self.y==nil)then
        return
    end
    if(self.y>dh) then
        Runtime:removeEventListener( "enterFrame", self )
        self:removeSelf()  
        self=nil 
        randomobject1()

    else

        self.y=self.y+self.speed+roadCopy.speed
    end
end

function randomobject1(event)
    --to randomly generate the incoming cars
    math.randomseed( os.time() )
    opp=display.newRect( center-dw/4.75, 30, dw/8, dw/4.5 )

    local position = math.random(1, 3)
    local cartype = math.random(1, 3)

    if(position==prevP) then
        position=(prevP+2)%3
    end 

    if position==1 then
        opp.x=center-dw/4.75
    end
    if position == 2 then
        opp.x=center
    end
    if position == 3 then
        opp.x=center+dw/4.75
    end
    if cartype == 1 then
        opp.fill={type="image", filename="car_green_1.png"}
    end
    if cartype == 2 then
        opp.fill={type="image", filename="car_blue_1.png"}
    end
    if cartype == 3 then
        opp.fill={type="image", filename="car_red_1.png"}
    end
    opp.speed=math.random(1,10)

    sceneGroup:insert(opp)
    prevP=position
    prevS=opp.speed
    local r=opp.width
    physics.addBody(opp,"static",{density=1, bounce=0.1, friction=0.2,radius=5})
    opp.gravityScale=0
    opp.enterFrame=moveoppcar
    Runtime:addEventListener("enterFrame", opp)
end





-- "scene:create()"
function scene:create( event )
    print("Scene:create")
    sceneGroup = self.view


    ---------ROAD---------
    road=display.newRect( 0, 0, dw, dh )
    road.fill={type="image",filename="road.png"}
    road.anchorX,road.anchorY=0,0
    road.contentHeight=dh
    sceneGroup:insert(road)
    road.speed=5

    roadCopy=display.newRect( 0, 0, dw, dh )
    roadCopy.fill={type="image",filename="road.png"}
    roadCopy.anchorX,roadCopy.anchorY=0,1
    roadCopy.contentHeight=dh
    sceneGroup:insert(roadCopy)
    roadCopy.speed=5


    ----PLAYER CAR--------
    car=display.newRect( dw/2, dh-10, dw/8, dw/4.5 )
    car.fill={type="image", filename="player.png"}
    car.anchorY=1
    center=dw/2
    car.posA=center-dw/4.75
    car.posB=center
    car.posC=center+dw/4.75
    car.current=car.posB
    sceneGroup:insert(car)
    physics.addBody(car,"dynamic",{density=1, bounce=0.1, friction=0.2})
    car.gravityScale=0
    --[[randomobject1()
    randomobject1()]]
end



-- "scene:show()"
function scene:show( event )

    if(event.phase=="did") then
        print("Scene:show")

        addList()
        randomobject1()
        randomobject1()
    end
end


function addList()
    --adding event listeners
    car.collision = onLocalCollision
    car:addEventListener( "collision", car )
    road.enterFrame=moveRoad
    Runtime:addEventListener( "enterFrame", road)
    roadCopy.enterFrame=moveRoad
    Runtime:addEventListener( "enterFrame", roadCopy)
    road:addEventListener("tap",touchScreen)
    roadCopy:addEventListener("tap",touchScreen)
end



-- "scene:hide()"
function scene:hide( event )
    print("Scene:hide")
    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 )
    print("Scene:destroy")
    local sceneGroup = self.view
    -- Called prior to the removal of scene's view
    -- 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
1

1 Answers

0
votes

You have to remove physics bodies manually., I suggest to create a group and keep all the physics bodies inside that., and remove it manually when screen hides.