Corona SDK,从上一个场景中删除对象

时间:2017-07-11 06:22:14

标签: corona

当场景结束时,“sendObject”功能结束,但屏幕上剩余的显示对象继续到下一个场景,直到它们的转换过程结束。我试过在场景中包含“object:removeSelf()”:hide和finishGame函数,两者都导致nil值错误。有什么建议吗?

local composer = require("composer")
local scene = composer.newScene()
local physics = require("physics")
local gameData = require("gamedata")
physics.start()
local player
local object = {}
local gameIsOver = false;
local objectCounter = 1
local objectFrequency = 2500
local objectTmr
local numberOfLives = 1


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

    sendObject()
end

function scene:show(event)
    local phase = event.phase
    local previousScene = composer.getSceneName("previous")
    composer.removeScene(previousScene)
    local group = self.view
    if ( phase == "did" ) then
        Runtime:addEventListener("collision", onCollision)
    end
end

function scene:hide(event)
    local phase = event.phase
    local group = self.view
    if ( phase == "will" ) then
        Runtime:removeEventListener("collision", onCollision)
        timer.cancel(objectTmr)
    end
end

function sendObject()
    object[objectCounter] = display.newImageRect("object.png", 40, 40)
    object[objectCounter].name = "object"
    object[objectCounter].x = math.random(5, 475)
    object[objectCounter].y = -125
    physics.addBody(object[objectCounter])
    object[objectCounter].bodyType = "kinematic"

    transition.to(object[objectCounter], {y=display.contentHeight+object[objectCounter].height+20, time=8500, onComplete=function(self) display.remove(self); end})

    objectCounter = objectCounter + 1
    if(objectCounter%2 == 0) then
        objectFrequency = objectFrequency - 200
        if(objectFrequency < 800) 
            then objectFrequency = 800
        end
        timer.cancel(objectTmr)
        objectTmr = timer.performWithDelay(objectFrequency, sendObject, 0)
    end
end
objectTmr = timer.performWithDelay(objectFrequency, sendObject, 0)

function onCollision(event)
    if ( event.phase == "began" ) then
        if(event.object1.name == "player" and event.object2.name == "object") then
            canMove = false
            numberOfLives = 0
            finishGame()
        end
        if(event.object1.name == "object" and event.object2.name == "player") then
            canMove = false
            numberOfLives = 0
            finishGame()
        end
    end
end

function finishGame()
    gameIsOver = true
    numberOfLives = numberOfLives - 1
    if(numberOfLives <= 0) then
        composer.gotoScene("gameover")
    end
end

function scene:destroy(event)

end

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


return scene

1 个答案:

答案 0 :(得分:1)

尝试

function sendObject()
    object[objectCounter] = display.newImageRect(scene.view, "object.png", 40, 40)
...

来自Corona documentation

  

请记住,您必须将场景显示对象插入场景中   自我观点小组。如果创建显示对象但不插入它们   进入这个群体,他们将驻留在作曲家阶段和   他们不会被视为现场的一部分。用于显示对象   这应该是场景的一部分,由作曲家“管理” - 为   例如,在删除场景时清理 - 您必须插入它们   进入场景的self.view小组