简体   繁体   中英

how to destroy display objects in lua?

There are two files scene2.lua and scene3.lua. When i click on back button[scene3.lua] second time, the extraText and gameOver display objects won't destroy completely. They showup in scene2.lua ,on going back to scene2. Help me fix the bug please!! I have shared scene3.lua file only.

local physics = require("physics")
    local composer = require( "composer")
    local scene = composer.newScene()

     local kineticEnergy
     local potentialEnergy
     local height
     local gameOver

    local timer1
    local timer2
    local  timer3
    local  timer4
    local backBtn
    local textback

    local extraText

    function scene:create()

    local sceneGroup = self.view

    soundEffect = audio.loadSound( "bowling1.wav")
    mybg = display.newImage("bg.png")
    mybg.x = 480 * 0.5
    mybg.y = 320 * 0.5

    path = display.newRect(200, 330, 600, 200)
    path:setFillColor( 0.3, 0.3, 0.3 )
    path.rotation = 15

    rightWall = display.newRect( 500, 300, 20, 300 )

    road = display.newRect( 0, 0, 500, 10 )
    road.x =  display.contentCenterX 
    road.y = display.contentCenterY * 1.5
    road:setFillColor( 0.3, 0.3, 0.3 )
    road.rotation = 15

    myrect = display.newRect(61, 160, 95, 25)
    myrect:setFillColor( 0.54, 0.03 ,0.31 )
    myrect.rotation = 15

    wheelFront = display.newCircle( 32, 166, 12 )
    wheelFront:setFillColor(1, 0.72, 0.75)

    wheelRear = display.newCircle( 82, 179, 12 )
    wheelRear:setFillColor(1,  0.72, 0.75)

    text1 = display.newText("K.E", 200, 100, "Eraser", 25)
    text1:setFillColor( 1,0,0 )
    text2 = display.newText("P.E", 340, 100, "Eraser", 25)
    text2:setFillColor( 1,0,0 )
    text3 = display.newText("Height ", 70, 295, "Eraser", 20)
    text3:setFillColor( 1,1,1 )
    text3:toFront( )
    text4 = display.newText("Velocity ", 70, 250, "Eraser", 20)
    text4:setFillColor( 1,1,1 )

     startGame = display.newText( "TAP TO START", 250, 180, "KG Happy Solid", 30  )
     startGame:setFillColor( 0.86, 0.07, 0.20 )


    backBtn = display.newRoundedRect( 250, 300, 100, 30, 5 )

    backBtn:setFillColor( 0.8, 0.2, 0 )
    backBtn.isVisible = false


     textback = display.newText( "Back" , 250, 301, "Eraser", 20 )
     textback:setFillColor( 1, 1, 1 )
     textback.isVisible = false








    sceneGroup:insert( mybg )
    sceneGroup:insert( path )
    sceneGroup:insert(rightWall)
    sceneGroup:insert(road)
    sceneGroup:insert(myrect)
    sceneGroup:insert(wheelFront)
    sceneGroup:insert(wheelRear)
    sceneGroup:insert(text1)
    sceneGroup:insert(text2)
    sceneGroup:insert(text3)

    sceneGroup:insert(backBtn)
    sceneGroup:insert(textback)
    sceneGroup:insert(startGame)
    sceneGroup:insert(text4)
    --sceneGroup:insert(extraText)
    --sceneGroup:insert(soundEffect)
    --sceneGroup:insert(playBtn)
    --sceneGroup:insert(textPlay)




    end


    function scene:show(event)

    local sceneGroup = self.view

    local phase = event.phase

        if phase == "did" then
           composer.removeScene("scene2")
            physics.start()
             function playGame(event)
            numTaps = event.numTaps
            if numTaps == 2 then
                --if event.phase == "ended" then
                audio.play( soundEffect )

                display.remove(startGame)
                startGame = nil



            physics.setGravity( 0,  9.8)

            physics.addBody(rightWall, "static")
            physics.addBody( road, "static", {groupIndex = -1} )
            physics.addBody( myrect, "dynamic", {density = 2, groupIndex = -1} )
            physics.addBody( wheelFront, "dynamic", {density =10, radius = 12, groupIndex = -1})
            physics.addBody(wheelRear,"dynamic", {density=10, radius = 12, groupIndex = -1})

            local LeftwheelJoint = physics.newJoint( "pivot", myrect, wheelFront, 32, 166)

            local RightwheelJoint = physics.newJoint( "pivot",  myrect, wheelRear ,  82, 179)

            LeftwheelJoint.isMotorEnabled = true
            LeftwheelJoint.motorSpeed = 200
            RightwheelJoint.isMotorEnabled = true
            RightwheelJoint.motorSpeed = 200

            --LeftwheelJoint.maxMotorTorque = 1000
            --RightwheelJoint.maxMotorTorque = 1000



                                                                function energyFirst()

                                                                     if(extraText) then
                                                                    extraText.parent:remove( extraText )
                                                                    --print("K.E medi removed")
                                                                end
                                                                extraText = nil

                                                                local options = {
       text = "As the cart rolls down the hill from its elevated position, its mechanical energy is transformed from potential energy to kinetic energy.",
       x = display.contentCenterX,
       y = 50,
      fontSize = 18,
      font = "Eraser",

       width = 480,
       height = 0,
       align = "center"
    }
                                                                    extraText = display.newText( options)
                                                                    --extraText.font = native.newFont("Eraser")
                                                                    extraText:setFillColor( 0.54, 0.03 ,0.31 )

                                                                     if(kineticEnergy) then
                                                                    kineticEnergy.parent:remove( kineticEnergy )
                                                                    --print("K.E medi removed")
                                                                end

                                                                    if (potentialEnergy) then
                                                                    potentialEnergy.parent:remove( potentialEnergy )
                                                                    --print("p.E medi removed")
                                                                end

                                                                if (height) then
                                                                  height.parent:remove( height )
                                                                    --print("p.E medi removed")
                                                                end

                                                                 if (velocity) then
                                                                  velocity.parent:remove( velocity)
                                                                    --print("p.E medi removed")
                                                                end



                                                                 kineticEnery = nil
                                                                 potentialEnergy = nil
                                                                 height = nil
                                                                 velocity = nil


                                                             kineticEnergy = display.newText("zero", 250, 100, "Eraser", 20)
                                                             potentialEnergy = display.newText("Maximum", 410, 100, "Eraser", 20)
                                                             height = display.newText("2 ", 120, 295, "Eraser", 20)
                                                            velocity = display.newText("1 ", 120, 250, "Eraser", 20)



                                                            end

                                                        function energySecond()

                                                                if(kineticEnergy) then
                                                                    kineticEnergy.parent:remove( kineticEnergy )
                                                                   -- print("K.E zero removed")
                                                                end

                                                                if (potentialEnergy) then
                                                                    potentialEnergy.parent:remove( potentialEnergy )
                                                                    --print("p.E max removed")
                                                                end

                                                                 if (height) then
                                                                  height.parent:remove( height )
                                                                    --print("p.E medi removed")
                                                                end

                                                                if (velocity) then
                                                                  velocity.parent:remove( velocity)
                                                                    --print("p.E medi removed")
                                                                end
                                                              velocity = nil

                                                                 kineticEnery = nil
                                                                 potentialEnergy = nil
                                                                 height = nil
                                                         --print(kineticEnergy)
                                                         --print(potentialEnergy)


                                                                 kineticEnergy = display.newText("MidValue", 270, 100, "Eraser", 20)
                                                                 potentialEnergy = display.newText("MidValue", 410, 100, "Eraser", 20)
                                                                  height = display.newText("1 ", 120, 295, "Eraser", 20)
                                                                    velocity = display.newText("2 ", 120, 250, "Eraser", 20)


                                                        end
                                                         ---------


                                                        function energyThird()


                                                                    if(kineticEnergy) then
                                                                    kineticEnergy.parent:remove( kineticEnergy )
                                                                    --print("K.E medi removed")
                                                                end
                                                                kineticEnergy = nil

                                                                    if (potentialEnergy) then
                                                                    potentialEnergy.parent:remove( potentialEnergy )
                                                                    --print("p.E medi removed")
                                                                end
                                                                potentialEnergy = nil

                                                                if (height) then
                                                                  height.parent:remove( height )
                                                                    --print("p.E medi removed")
                                                                end
                                                                height = nil

                                                                 if (velocity) then
                                                                  velocity.parent:remove( velocity)
                                                                    --print("p.E medi removed")
                                                                end
                                                                 velocity = nil


                                                                 --kineticEnery = nil
                                                                 --potentialEnergy = nil
                                                                 --height = nil
                                                         --print(kineticEnergy)
                                                         --rint(potentialEnergy)

                                                                 kineticEnergy = display.newText("Maximum", 270, 100, "Eraser", 20)
                                                                 potentialEnergy = display.newText("Zero", 400, 100, "Eraser", 20)
                                                                  height = display.newText("0 ", 120, 295, "Eraser", 20)
                                                                    velocity = display.newText("0 ", 120, 250, "Eraser", 20)
                                                                    gameOver = display.newText( "GAME OVER", 250, 180, "KG Happy Solid", 30  )
                                                                     gameOver:setFillColor( 0.86, 0.07, 0.20 )





                                                        end

                                                            function energyForth()

                                                                     if(extraText) then
                                                                    extraText.parent:remove( extraText )
                                                                    --print("K.E medi removed")
                                                                end
                                                                extraText = nil

                                                                local options = {
       text = "The amount of potential energy loss equals the amount of kinetic energy gained.",
       x = display.contentCenterX,
       y = 50,
      fontSize = 18,
      font = "Courier New",

       width = 480,
       height = 0,
       align = "center"
    }

                                                                    extraText = display.newText(options)
                                                                    extraText:setFillColor( 0.54, 0.03 ,0.31 )


                                                                    if(kineticEnergy) then
                                                                    kineticEnergy.parent:remove( kineticEnergy )
                                                                    --print("K.E medi removed")
                                                                end
                                                                kineticEnergy = nil

                                                                    if (potentialEnergy) then
                                                                    potentialEnergy.parent:remove( potentialEnergy )
                                                                    --print("p.E medi removed")
                                                                end
                                                                potentialEnergy = nil

                                                                if (height) then
                                                                  height.parent:remove( height )
                                                                    --print("p.E medi removed")
                                                                end
                                                                height = nil

                                                                 if (velocity) then
                                                                  velocity.parent:remove( velocity)
                                                                    --print("p.E medi removed")
                                                                end
                                                                 velocity = nil


                                                               --[[ if (gameOver) then
                                                                  gameOver.parent:remove( gameOver)
                                                                    --print("p.E medi removed")
                                                                end]]--
                                                                --gameOver = nil
                                                                 backBtn.isVisible = true
                                                                 textback.isVisible = true








                                                        end


    -------calling functions----

                                                timer1 = timer.performWithDelay(200, energyFirst, 1)
                                                timer2 = timer.performWithDelay(1500, energySecond, 1)
                                                timer3 = timer.performWithDelay(2500, energyThird, 1)
                                                timer4 = timer.performWithDelay( 3100, energyForth, 1 )




     ------





    end
    end

      function showScreen2(event)
      if event.phase == "ended" then

        composer.gotoScene("scene2")

        backBtn:removeEventListener( "touch", showScreen2 )
       end

      end


       function showScreen3(event)
      if event.phase == "ended" then
        composer.gotoScene("scene3", "fade", 500)
        playBtn:removeEventListener( "touch", showScreen3)
       end

      end


         backBtn:addEventListener( "touch", showScreen2 )
         Runtime:addEventListener("tap", playGame)
         --playBtn:addEventListener( "touch", showScreen3 )


        end 
    end

    function scene:hide(event)

    local sceneGroup = self.view
    local phase = event.phase
    if phase == "will" then

    physics.stop()
    timer.cancel( timer1 )
     timer.cancel( timer2 )
     timer.cancel( timer3 )
     timer.cancel( timer4 )



      --end  
    elseif phase == "did" then



    --display.remove( gameOver )

     display.remove( extraText )
    extraText = nil


         end
    end

    function scene:destroy(event)


         print("Destroyed Game OVER")
        display.remove( kineticEnergy )
         kineticEnergy = nil
        display.remove( potentialEnergy )
         potentialEnergy = nil
        display.remove( height )
         height = nil

        display.remove( velocity )
        velocity = nil
       -- display.remove( gameOver )
        --gameOver = nil
       -- gameOver.isVisible = false
    display.remove( extraText )
    extraText = nil



        display.remove(sceneGroup)
        sceneGroup = nil
        audio.dispose( soundEffect )
        soundEffect = nil

        display.remove(gameOver)
          gameOver = nil



    end

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

    return scene

Your Code:

--sceneGroup:insert(extraText)

You need to insert it into the sceneGroup for it to get handled automatically. You commented out this insertion, thus not allowing composer to handle the object.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM