2017-07-11 6 views
0

シーンが終了すると、「sendObject」機能は終了しますが、画面上の残りの表示オブジェクトは、遷移プロセスが終了するまで次のシーンに進みます。私は "object:removeSelf()"をscene:hideとfinishGame関数の両方に含めようとしましたが、どちらもnil値エラーに終わりました。助言がありますか?Corona SDK、前のシーンからオブジェクトを削除する

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

あなたがシーンの self.viewグループにシーン表示オブジェクトを挿入する必要があることに注意してくださいコロナdocumentation

から

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

を試してみてください。表示オブジェクトを作成してもこのグループに を挿入しないと、それらは合成ステージの前に存在し、 はシーンの一部と見なされません。ディスプレイは をオブジェクトのためのそのシーンの一部であると作曲による「管理」必要があります - 例えば、シーンが削除されたときにクリーンアップ - あなたはシーンのself.viewグループに それらを挿入する必要があります

関連する問題