Search code examples
luacoronasdkcorona-storyboard

corona storyboard buttons not removed properly from next scene


OK there are many answers to this question, but I cant seem to get it to work. My buttons are created in function scene:createScene( event ) and when I move on to the next scene, I'm trying scenePurge and removing buttons individually but it does not seem to be working. On the next scene the button is not visible, but if I press where the button was on the previous scene it is still active. What is the best way to remove these objects?

        local storyboard = require( "storyboard" )
        local scene = storyboard.newScene()

        --storyboard.removeScene( "login" )

---------------------------------------------------------------------------------
-- BEGINNING OF YOUR IMPLEMENTATION
---------------------------------------------------------------------------------

local image, image2


-- Called when the scene's view does not exist:
function scene:createScene( event )
    local widget = require( "widget" )

    local p1ButtonRelease = function( event )
    storyboard.gotoScene( "maths_dif", "slideLeft", 1000  )
        print("touch")
        return true 
    end

    local p2ButtonRelease = function( event )
    storyboard.gotoScene( "words", "slideLeft", 1000  )
        print("touch")
        return true


end

    local screenGroup = self.view

    image = display.newImage( "images/Background(640x480).png", -20 ,0 )
    image2 = display.newImage( "Logo_small.png", 170,0)
    --screenGroup:insert( image )

    print( "\n2: createScene event" )


    local p1Button = widget.newButton{
    default = "images/SinglePlayer_button.png",
    over = "images/SinglePlayer_button.png",
    --onPress = button1Press,
    onRelease = p1ButtonRelease,
    -- fontSize = 20,
    -- labelColor = { default={ 255, 250, 250}, over={ 0, 0, 0,} },
    -- label = "+",
    -- emboss = true
    }


    local p2Button = widget.newButton{
    default = "images/2Player_button.png",
    over = "images/2Player_button.png",
    --onPress = button1Press,
    onRelease = p2ButtonRelease,
    -- fontSize = 20,
    -- labelColor = { default={ 255, 250, 250}, over={ 0, 0, 0,} },
    -- label = "+",
    -- emboss = true
    }

    p1Button.x = 240; p1Button.y = 180
    p2Button.x = 240; p2Button.y = 260
end


-- Called immediately after scene has moved onscreen:
function scene:enterScene( event )

    print( "2: enterScene event" )

    -- remove previous scene's view
    storyboard.purgeScene( "login" )
    display.remove(p1Button)
    -- -- Update Lua memory text display
    -- local showMem = function()
        image:addEventListener( "touch", image )
        -- text3.isVisible = true
        -- text2.text = text2.text .. collectgarbage("count")/1000 .. "MB"
        -- text2.x = display.contentWidth * 0.5
    -- end
    -- memTimer = timer.performWithDelay( 1000, showMem, 1 )
end


-- Called when scene is about to move offscreen:
function scene:exitScene()

    print( "2: exitScene event" )
    storyboard.removeScene("login")
    storyboard.removeScene("words")
    storyboard.removeScene("guess_word")
    storyboard.removeScene("maths_dif")
    storyboard.removeScene("scene1")
    display.remove(p1Button)
    p1Button = nil
    display.remove(p2Button)
    p2Button = nil
    -- remove touch listener for image
    image:removeEventListener( "touch", image )

end


-- Called prior to the removal of scene's "view" (display group)
function scene:destroyScene( event )

    print( "((destroying scene 2's view))" )
end

---------------------------------------------------------------------------------
-- END OF YOUR IMPLEMENTATION
---------------------------------------------------------------------------------

-- "createScene" event is dispatched if scene's view does not exist
scene:addEventListener( "createScene", scene )

-- "enterScene" event is dispatched whenever scene transition has finished
scene:addEventListener( "enterScene", scene )

-- "exitScene" event is dispatched before next scene's transition begins
scene:addEventListener( "exitScene", scene )

-- "destroyScene" event is dispatched before view is unloaded, which can be
-- automatically unloaded in low memory situations, or explicitly via a call to
-- storyboard.purgeScene() or storyboard.removeScene().
scene:addEventListener( "destroyScene", scene )

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

return scene

I'm trying to remove objects, so that the won't affect the next scene, but cant seem to do it.


Solution

  • It has been suggested to use storyboard.removeAll() at the start of each scene, but the solution I have found personally is not to use widget button release function to change scene instead I'm creating an image object and giving it an EventListener e.g.

        p1Button = display.newImage("images/SinglePlayer_button.png", 90, 140)
        p1Button.touch = onSceneTouch
    p1Button:addEventListener("touch", p1Button)
    
        local function onSceneTouch( self, event )
        if event.phase == "began" then
            storyboard.gotoScene( "words", "slideLeft", 1000  )
            return true 
        end
    end
    

    I then remove the objects event listener in the exitScene() function. On my next scene these previous buttons have no effect.