Search code examples
luacoronasdk

The output on console twice and the lanes overlap the player


The output I should get are the chick can jump right when i tap right and vice versa. But the two problems that I can't solve here are when I tap it will output in console like I tap twice. The second problem is the lanes are in array and keep on overlap everything, even the chick which is the player.

For this i include 2 lua files and 3 png.

This is my main.lua

display.setStatusBar( display.HiddenStatusBar )

local composer = require( "composer" )
print("entering gotoScene")
composer.gotoScene( "game2" )
print("out from gotoScene")

This is my game2.lua

---REQUIRES
local composer = require( "composer" )
local scene = composer.newScene()
local widget = require( "widget" )
local physics = require "physics"
physics.start()
physics.setGravity(0,0)
local lanes = {}
local laneID = 1

scroll = 2

    ---SIZE PHONE DECLARATION

    local screenW = display.contentWidth --640
    local screenH = display.contentHeight --1136
    local halfX = display.contentWidth * 0.5 --half width 320
    local halfY = display.contentHeight * 0.5 --half height 568

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

---WHEN TAP CHICK MOVE
local function tapListener( event )
    local object = event.target
       if object.name == "Right Side" then
        print( object.name.." TAPPED!" )
            if laneID < 3 then
            laneID = laneID + 1;
            transition.to(chick, {x=lanes[laneID].x,time=50})
            print( "At lane "..laneID.." to the right")
            end
        return true
       end

       if object.name == "Left Side" then
        print( object.name.." TAPPED!" )
            if laneID > 1 then
            laneID = laneID - 1;
            transition.to(chick, {x=lanes[laneID].x,time=50})
            print( "At lane "..laneID.." to the left")
            end
        return true
        end
end
    ----------------------

---CREATE 
-- Initialize the scene here.
-- Example: add display objects to "sceneGroup", add touch listeners, etc.

function scene:create(  )
    local group = self.view

    ---TAP BACKGROUND
    RightSide = display.newRect(500,halfY, halfX+50, screenH + 100 )
    RightSide.alpha = 0.1
    RightSide.name = "Right Side"

    LeftSide = display.newRect(140, halfY,halfX+50, screenH + 100)
    LeftSide.alpha = 0.1
    LeftSide.name = "Left Side"
    ----------------------

    ---TAP LABEL
    rightLabel = display.newText({ text = "", x = 0, y = 0 , fontSize = 50 } )
    rightLabel:setTextColor( 0 ) ; rightLabel.x = 500 ;rightLabel.y = halfY

    leftLabel = display.newText({ text = "", x = 0, y = 0, fontSize = 50 } )
    leftLabel:setTextColor( 0 ) ; leftLabel.x = 150 ; leftLabel.y = halfY
    ----------------------

    ---PATHWAY (BACKGROUND)
    path1 = display.newImageRect("road.png",screenW,screenH)
    path1.x = halfX
    path1.y = halfY

    path2 = display.newImageRect("road.png",screenW,screenH)
    path2.x = halfX
    path2.y = halfY - screenH 
    ----------------------

    ---LANES
    for i=1,3 do -- loop 3 times to create 3 lanes for our game
        --myGroup=display.newGroup()
        laneimg = display.newImageRect("lanesroad.png", 150, 1300)
            lanes[i] = laneimg
            lanes[i].x = (display.contentCenterX - 140*2) + (i*140)
            lanes[i].y = display.contentCenterY
            lanes[i].id = i
    end
    ----------------------

    ---CHICK
    chick = display.newImageRect("chick.png",100,100)
    chick.anchorY = 1
    chick.x = lanes[2].x
    chick.y = 1000
    physics.addBody(chick) 
    chick.bodyType = "dynamic"

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



path1:toBack();
path2:toBack();
group:insert( RightSide )
group:insert( LeftSide )
group:insert( rightLabel )
group:insert( leftLabel )
group:insert( laneimg)
group:insert( chick )

end

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


---BACKGROUND SCROLL
function pathScroll (self,event)
    path1.y = path1.y + scroll
    path2.y = path2.y + scroll

    if path1.y == screenH * 1.5 then
        path1.y = screenH * -.5
    end

    if path2.y == screenH * 1.5 then
        path2.y = screenH * -.5
    end
end
----------------------


---SHOW --that will show in scene
function scene:show (event)

---FOR ROAD TO SCROLL
path1.enterFrame = pathScroll
Runtime:addEventListener("enterFrame", pathScroll)
path2.enterFrame = pathScroll
Runtime:addEventListener("enterFrame", pathScroll)
----------------------

---WHEN TAP TO RIGHT
RightSide:addEventListener( "tap", tapListener )
rightLabel.text = "right"
----------------------

---WHEN TAP TO LEFT
LeftSide:addEventListener( "tap", tapListener )
leftLabel.text = "left"
----------------------

end
----------------------

---HIDE 
function scene:hide (event)



end
----------------------

scene:addEventListener( "create", scene )
scene:addEventListener( "show", scene )
scene:addEventListener( "hide", scene )


return scene

enter image description here

enter image description here


Solution

  • The method scene:show is called twice. Once with event.phase paramater equal to will and second time with event.phase paramater equal to did. It also apply to scene.hide method. Code below check that.

    At botom I put scene template from Corona documentation. It can be used as start point for new scene.

    I commented out line with Runtime:addEventListener("enterFrame", pathScroll). You have two but one is enough.

    More information you find with these links

    Try (tested)

    ...
    
    ---SHOW --that will show in scene
    function scene:show (event)
    local phase = event.phase
    
    if ( phase == 'will' ) then
    
    elseif ( phase == 'did' )  then   
    ---FOR ROAD TO SCROLL
    path1.enterFrame = pathScroll
    Runtime:addEventListener("enterFrame", pathScroll)
    path2.enterFrame = pathScroll
    --Runtime:addEventListener("enterFrame", pathScroll)
    ----------------------
    
    ---WHEN TAP TO RIGHT
    RightSide:addEventListener( "tap", tapListener )
    rightLabel.text = "right"
    ----------------------
    
    ---WHEN TAP TO LEFT
    --LeftSide:addEventListener( "tap", tapListener )
    leftLabel.text = "left"
    
    ----------------------
    end
    
    end
    ----------------------
    
    ...
    

    Scene template

    local composer = require( "composer" )
    
    local scene = composer.newScene()
    
    -- -----------------------------------------------------------------------------------
    -- Code outside of the scene event functions below will only be executed ONCE unless
    -- the scene is removed entirely (not recycled) via "composer.removeScene()"
    -- -----------------------------------------------------------------------------------
    
    
    
    
    -- -----------------------------------------------------------------------------------
    -- Scene event functions
    -- -----------------------------------------------------------------------------------
    
    -- create()
    function scene:create( event )
    
        local sceneGroup = self.view
        -- Code here runs when the scene is first created but has not yet appeared on screen
    
    end
    
    
    -- show()
    function scene:show( event )
    
        local sceneGroup = self.view
        local phase = event.phase
    
        if ( phase == "will" ) then
            -- Code here runs when the scene is still off screen (but is about to come on screen)
    
        elseif ( phase == "did" ) then
            -- Code here runs when the scene is entirely on screen
    
        end
    end
    
    
    -- hide()
    function scene:hide( event )
    
        local sceneGroup = self.view
        local phase = event.phase
    
        if ( phase == "will" ) then
            -- Code here runs when the scene is on screen (but is about to go off screen)
    
        elseif ( phase == "did" ) then
            -- Code here runs immediately after the scene goes entirely off screen
    
        end
    end
    
    
    -- destroy()
    function scene:destroy( event )
    
        local sceneGroup = self.view
        -- Code here runs prior to the removal of scene's view
    
    end
    
    
    -- -----------------------------------------------------------------------------------
    -- Scene event function listeners
    -- -----------------------------------------------------------------------------------
    scene:addEventListener( "create", scene )
    scene:addEventListener( "show", scene )
    scene:addEventListener( "hide", scene )
    scene:addEventListener( "destroy", scene )
    -- -----------------------------------------------------------------------------------
    
    return scene