Corona SDK,从上一个场景中删除对象
Corona SDK, Removing object from previous scene
当场景结束时,"sendObject"函数结束,但是屏幕上剩余的显示对象继续到下一个场景,直到它们的过渡过程完成。我已经尝试将 "object:removeSelf()" 包含在 scene: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
尝试
function sendObject()
object[objectCounter] = display.newImageRect(scene.view, "object.png", 40, 40)
...
来自科罗纳 documentation
Remember that you must insert scene display objects into the scene's
self.view group. If you create display objects but do not insert them
into this group, they will reside in front of the Composer stage and
they will not be regarded as part of the scene. For display objects
which should be part of the scene and "managed" by Composer — for
example, cleaned up when the scene is removed — you must insert them
into the scene's self.view group
当场景结束时,"sendObject"函数结束,但是屏幕上剩余的显示对象继续到下一个场景,直到它们的过渡过程完成。我已经尝试将 "object:removeSelf()" 包含在 scene: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
尝试
function sendObject()
object[objectCounter] = display.newImageRect(scene.view, "object.png", 40, 40)
...
来自科罗纳 documentation
Remember that you must insert scene display objects into the scene's self.view group. If you create display objects but do not insert them into this group, they will reside in front of the Composer stage and they will not be regarded as part of the scene. For display objects which should be part of the scene and "managed" by Composer — for example, cleaned up when the scene is removed — you must insert them into the scene's self.view group