chinchilla
chinchilla

Reputation: 3

composer.removeScene() not working, other display objects not disappearing

I'm working on an app in lua using Corona SDK.

I'm trying to go from my buildscene2 to my mainbuildscene, and I am successfully calling the new scene, but the objects from buildscene2 are not being removed. I have added the code to remove the previous scene, in the mainbuildscene.lua file. I've tried adding it in scene:create() and in scene:show(). Neither worked. This exact method has worked for me when transitioning from other scenes in the same application. What I've done here is created a function that uses composer.gotoScene("mainbuildscene") and then called the function when a button is pressed. I have a bunch of random prints in there just to see if the code is being read. It is.

I've looked for other people having this problem. Plenty of people have experienced this, but none of their solutions have worked for me. I've tried moving the event listener for when the next button is pressed to inside the snapTo function and then back out. If the listener is outside, it gives me an error.

Also, I know that the problem is not when I'm calling the new scene, because I put in a random picture to test if the objects from that scene would show up, and they did, except they were overtop of the objects from buildscene2. I even tried adding a function into the second scene that, when called, destroys the first scene. Didn't work.

Unless I did something wrong, all my display objects in buildscene2 are added to the group.

Here's my buildscene2 file. This is the file I'm transitioning away from and trying to destroy.

local composer = require( "composer" )

local scene = composer.newScene()

-- -----------------------------------------------------------------------------------------------------------------
-- All code outside of the listener functions will only be executed     ONCE unless "composer.removeScene()" is called.
-- -----------------------------------------------------------------------------------------------------------------

-- local forward references should go here

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


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

local sceneGroup = self.view

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

local group = display.newGroup()
composer.removeScene("thirdscene")



----------EMPTY BOXES
local itemFrame1=display.newImageRect("images/selection-box.png", 200,200)
itemFrame1.x=140
itemFrame1.y=130
group:insert(itemFrame1)

local itemFrame2=display.newImageRect("images/selection-box.png", 200,200)
itemFrame2.x=387
itemFrame2.y=130
group:insert(itemFrame2)

local itemFrame3=display.newImageRect("images/selection-box.png", 200,200)
itemFrame3.x=635
itemFrame3.y=130
group:insert(itemFrame3)

---------------HEADS
local robotHead=display.newImageRect("images/robot-head.png", 195,180)
robotHead.x=137
robotHead.y=130
robotHead.rotation = 180
robotHead.headtype=1

local rabbitHead=display.newImageRect("images/rabbit-head.png", 200, 180)
rabbitHead.x=387
rabbitHead.y=130
rabbitHead.rotation = 180
rabbitHead.headtype=2

local dinoHead=display.newImageRect("images/dino-head.png", 210, 190)
dinoHead.x=665
dinoHead.y=140
dinoHead.rotation = 180
dinoHead.headtype=3

-------------------OTHER

local nextButton=display.newImageRect("images/donebutton.png", 130, 130)
nextButton.x=140
nextButton.y=710
group:insert(nextButton)
nextButton.isVisible = false

local nextText=display.newText("NEXT", 100,100, native.systemFontBold, 40)
nextText.x=140
nextText.y=710
nextText:setTextColor (0,0,0)
group:insert(nextText)

function snapTo (event)

    function makeVisible (event)
            nextButton.isVisible = true
    end


    if event.phase == "began" then
        event.target.markX = event.target.x    -- store x location of object
        event.target.markY = event.target.y    -- store y location of object
        torsoPlaced=event.target.torsoName
    end

    function addHeadsToGroup (event)
        group:insert(robotHead)
        group:insert(rabbitHead)
        group:insert(dinoHead)
    end


    if event.phase == "moved" then
        local x = (event.x - event.xStart) + event.target.markX
        local y = (event.y - event.yStart) + event.target.markY
        event.target.x, event.target.y = x, y    -- move object based on calculations above

        function demolish1 (event)
            robotHead.x = 1000
            robotHead.y = 900
            robotHead.width = 10
            robotHead.length = 10
            robotHead.isVisible = false
            group:insert(robotHead)
            local staticRobot = display.newImageRect("images/robot-head.png", 195, 180)
            staticRobot.x=137
            staticRobot.y=130
            staticRobot.rotation = 180
            group:insert(staticRobot)
        end

        function demolish2 (event)
            rabbitHead.x = 1000
            rabbitHead.y = 900
            rabbitHead.width = 10
            rabbitHead.length = 10
            rabbitHead.isVisible = false
            group:insert(rabbitHead)
            local staticRabbit = display.newImageRect("images/rabbit-head.png", 200, 180)
            staticRabbit.x=387
            staticRabbit.y=130
            staticRabbit.rotation = 180
            group:insert(staticRabbit)
        end

        function demolish3 (event)
            dinoHead.x = 1000
            dinoHead.y = 900
            dinoHead.width = 10
            dinoHead.length = 10
            dinoHead.isVisible = false
            group:insert(dinoHead)
            local staticDino = display.newImageRect("images/dino-head.png", 210, 190)
            staticDino.x=665
            staticDino.y=140
            staticDino.rotation = 180
            group:insert(staticDino)
        end 

        if (event.target.headtype == 1) then
            event.target.width = 220
            event.target.height = 200
            if event.target.y > 400 then
                event.target.isVisible = false
                local newHead1 = display.newImageRect("images/robot-head.png",220, 200)
                newHead1.x=150
                newHead1.y=500
                newHead1.rotation = 270
            end
            addHeadsToGroup()
            makeVisible()
            demolish2()
            demolish3()
        end


        if (event.target.headtype == 2) then
            event.target.width = 340
            event.target.height = 240
            if event.target.y > 400 then
                event.target.isVisible = false
                local newHead2 = display.newImageRect("images/rabbit-head.png",340, 240)
                newHead2.x=140
                newHead2.y=500
                newHead2.rotation = 270
            end
            addHeadsToGroup()
            makeVisible()
            demolish1()
            demolish3()
        end

        if (event.target.headtype == 3) then
            event.target.width = 280
            event.target.height = 250
            if event.target.y > 400 then
                event.target.isVisible = false  
                local newHead3 = display.newImageRect("images/dino-head.png",280, 250)
                newHead3.x=140
                newHead3.y=540
                newHead3.rotation = 270
            end
            addHeadsToGroup()
            makeVisible()
            demolish1()
            demolish2()
        end


        local function nextButtonClicked2 (event)

            if event.phase=="ended" then
                function sceneChange (event)
                    composer.gotoScene("mainbuildscene")
                    print("jererefs")
                end

                print("egsijegij")
                sceneChange()

            end
        end
        nextButton:addEventListener("touch", nextButtonClicked2)
    end 
end--end of snapTo


robotHead:addEventListener( "touch", snapTo)
rabbitHead:addEventListener( "touch", snapTo)
dinoHead:addEventListener("touch", snapTo)






end -- end


-- "scene:show()"
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.
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

Here's my mainbuildscene file, the file I'm trying to load. It's loading in but the previous scene isn't going away.

local composer = require( "composer" )

local scene = composer.newScene()

-- -----------------------------------------------------------------------------------------------------------------
-- All code outside of the listener functions will only be executed  ONCE unless "composer.removeScene()" is called.
-- -----------------------------------------------------------------------------------------------------------------

-- local forward references should go here

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


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



    local sceneGroup = self.view
    function removeTheScene (event)
        print("this is not working, unless it is...?")
        composer.removeScene("buildscene2")

    end
    removeTheScene()
-- Initialize the scene here.
-- Example: add display objects to "sceneGroup", add touch listeners, etc.
local group=display.newGroup()
--   
--    
        local picture=display.newImageRect("images/bee-torso.png", 100, 100)
        picture.x=display.contentCenterX
        picture.y=display.contentCenterY
        group:insert(picture)





end


-- "scene:show()"
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.
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

Please let me know what I did wrong or give me any advice you can. Thanks for reading.

Upvotes: 0

Views: 951

Answers (1)

Westerlund.io
Westerlund.io

Reputation: 2833

You must add them to "sceneGroup". You are adding all the object into your own group but they should be added to the "sceneGroup".

In buildscene2.lua remove these lines:

local group = display.newGroup()
composer.removeScene("thirdscene")

And make sure you add all your display object into the sceneGroup, and not the group:

Change this group:insert(itemFrame1) to this sceneGroup:insert(itemFrame1) but for all your display objects and on all your scenes.

If you're planning to reuse the scene (i.e. being able to go back and forth) you don't need to use the removeScene because Corona handles all the display objects belonging to the scenes i.e. when you go from Scene A to Scene B Corona will automatically move away the display objects belonging to Scene A from the screen and move the display objects belonging to Scene B to the screen.

Upvotes: 1

Related Questions