2013-08-07 31 views
1

我有多級別的遊戲,並且所有的物體在內存之間都保持'空' 我的意思是,如果我設置物理混合,當我再來在關卡中(或其他關卡),它顯示一個盒子,但沒有圖片。 (關於這些空箱和物理法) 在destroyScene我已經確定,他們都是儘管removeSelf +設置爲零,但電暈+物體並沒有被清除

myObj:removeSelf() 
    myObj = nil 

和我打印的消息,證明它實際上做的。

在enterScene菜單

而且,萬一我做了

local prior_scene = storyboard.getprevious() 
    storyboard.purgescene(prior_scene) 

,也嘗試了

storyboard.removeAll() 

甚至

storyboard.purgeOnSceneChange = true 

沒有什麼作品時,我進入下一級,或再次進入同一級別,所有我以前的對象仍然在這裏,我只是不明白它

好吧,這會有點長,但在這裏的整個水平。它通過destroyscene,但不知何故顯示對象不會被刪除。

-- scene5 
---------------------------------------------------------------------------------- 

local storyboard = require("storyboard") 
local scene5 = storyboard.newScene() 

function scene5:createScene(event) 
    local group = self.view 
    puppetJColCount = 0 
    print ("createScene5", puppetJColCount) 
    ----------------------------------------------------------------------------- 
    -- CREATE display objects and add them to 'group' here. 
    -- Example use-case: Restore 'group' from previously saved state. 
    local physics = require("physics") 
    physics.start() 
    --physics.setScale(50) 
    puppetT_outside = false 
    puppetJ_outside = false 

end -- scene ------------------------- 


-- set and release the catapult for puppetT 
function arm_puppetT(event) 
    if event.phase == "began" then 
     display.getCurrentStage():setFocus(puppetT) 
     arming_puppetT = true 
    elseif event.phase == "moved" then 
     puppetT.x = event.x 
     puppetT.y = event.y 
    elseif event.phase == "ended" then 
      puppetT:applyLinearImpulse(event.xStart - event.x, event.yStart - event.y, puppetT.x, puppetT.y) 
      display.getCurrentStage():setFocus(nil) 
      arming_puppetT = false 
    end 
end -- arm_puppetT ---------------------------------------------------------------------------- 

function build_puppetT() 
-- setup puppetT   
    puppetT = display.newImage("assets/t-head-57-78.png") 
    puppetT.x = 80 
    puppetT.y = 100 
    physics.addBody(puppetT,"dynamic",{density=1.0, friction =0.3, bounce=0.2}) 
-- setup catapult event for arming puppetT 
    puppetT:addEventListener("touch", arm_puppetT) 
end -- build_puppetT 

function build_puppetJ_wall() 
puppetJColCount = puppetJColCount + 1 -- how many columns of puppetJ 
    puppetJIJ = {}    -- define puppetJ as an array 
    ij = 0 
    ipuppetJtot = 0 
--puppetJColCount = 1 
    print ("build_puppetJ_wall puppetJColCount>" , puppetJColCount); 
    for i=1, 4 do 
     for j=1, puppetJColCount do 
     ij = ij + 1   -- # of puppetJs on the screen 
     ipuppetJtot = ipuppetJtot + 1 
     puppetJIJ = display.newImageRect("assets/j-head-70-75.png",80,75) 

     puppetJIJ.x = 600 + j*22 
     puppetJIJ.y = 100 + (puppetJIJ.height /2 * (i -1)) 

     physics.addBody(puppetJIJ,"dynamic",{density=1.0,friction=0.3,bounce=0.2,isSensor=false,radius = var}) 
     end 
    end 
print ("building puppetJs #:" ,ipuppetJtot) 
end -- build_puppetJ_wall ------------------------------------------------------------- 


function every_frame(event) 
end -- every_frame -------------------------------------------------------------------- 

--reset level 
function tap_reset_level(event) 
     puppetT:applyLinearImpulse(0, 0, 0, 0) -- stop the kick 
     print "restarting physics?" 
     puppetT:setLinearVelocity(0, 0) -- stop the speed 
    puppetT.x = 80 
    puppetT.y = 100 

    for ij = 1,ipuppetJtot do 
     if (puppetJIJ) then 
      puppetJIJ:removeSelf() 
      puppetJIJ = nil ------ 
     end 
    end 
    puppetT:removeSelf() 
    puppetT = nil 

    build_puppetJ_wall() 
    build_puppetT() 

    puppetT_outside = false 
    puppetJ_outside = false 
    -- physics.addBody(puppetT,"dynamic",{density=1.0, friction =0.3, bounce=0.2}) 
    -- puppetT:addEventListener("touch", arm_puppetT) 
    --physics.start() 

end -- tap_reset_level ------------------------------------------------------------------------- 

function tap_main_menu(event) 
print ("going to main menu") 
    Runtime:removeEventListener("enterFrame", every_frame) 
    for ij = 1,ipuppetJtot do 
     if (puppetJIJ) then 
      puppetJIJ:removeSelf() 
      puppetJIJ = nil ------ 
     end 
    end 
    if (puppetT) then 
     puppetT:removeSelf() 
     puppetT = nil 
    end 


    -- scene5:exitScene(scene5) 
    storyboard.gotoScene("menu") 
end -- tap_main_menu --------------------------------------------------------------------------------- 
-- ====================================================================================== 
-- Called immediately after scene has moved onscreen: 
function scene5:enterScene(event) 
    local group = self.view 

    ----------------------------------------------------------------------------- 
    -- INSERT code here (e.g. start timers, load audio, start listeners, etc.) 
-- group:insert(reset_btn) 
-- load background 
print ("enterScene scene5 " , puppetJtot) 

    background = display.newImage("assets/parliament-1200-800.png",0,0) 
--create reset level button 
    reset_btn = display.newImageRect("assets/btn_reset_128.png", 50,50) 
    reset_btn.x = 50 
    reset_btn.y = 50 

--create main menu button 
    main_menu_btn = display.newImageRect("assets/btn_home_128.png", 50,50) 
    main_menu_btn.x = 100 
    main_menu_btn.y = 50 

-- show the level 
    local myText = display.newText("Level 5", display.contentWidth - 60, 50, "Helvetica", 24) 
    myText:setTextColor(255, 255, 255) 

-- insert(floor); 

    floor = display.newRect(20,display.contentHeight - 40,display.contentWidth - 40 ,10) 
    physics.addBody(floor,"static",{density=1.0, friction =-0.3,bounce=-0.2,isSensor=false}) 

-- build puppetT 
    build_puppetT() 


print ("width=" , display.contentWidth , "height=",display.contentHeight) 


-- setup puppetJs 
    build_puppetJ_wall() 

-- everything happens in everyframe function 
Runtime:addEventListener("enterFrame", every_frame) 

--add reset event 
    reset_btn:addEventListener("tap", tap_reset_level) 
--add mainmenu event 
    main_menu_btn:addEventListener("tap", tap_main_menu) 
end -- scene:enterScene ---------------------------------------------------------------- 
-- ====================================================================================== 


-- Called when scene is about to move offscreen: 
function scene5:exitScene(event) 
    local group = self.view 
print "scene:exitScene5" 
    ----------------------------------------------------------------------------- 
    -- INSERT code here (e.g. stop timers, remove listeners, unload sounds, etc.) 
end -- exitScene 


-- Called prior to the removal of scene's "view" (display group) 
function scene5:destroyScene(event) 
    local group = self.view 

    Runtime:removeEventListener("enterFrame", every_frame) 
    puppetJColCount = 0 

    if (reset_btn) then 
print ("destroyScene5 - removing tap_reset_level") 
     reset_btn:removeEventListener("tap", tap_reset_level) 
     reset_btn:removeSelf() 
    end 
     reset_btn = nil 
    if (main_menu_btn) then 
     main_menu_btn:removeEventListener("tap", tap_main_menu) 
     main_menu_btn:removeSelf() 
    end 
     main_menu_btn = nil 
    for ij = 1,ipuppetJtot do 
     if (puppetJIJ) then 
      puppetJIJ:removeSelf() 
     end 
      puppetJIJ = nil ------ 
    end 

    if (puppetT) then 
    puppetT:removeSelf() 

    end 
    puppetT = nil 

scene5 = nil 

end -- destroyScene ------------------------------------------------------------ 



scene5:addEventListener("createScene", scene5) 

scene5:addEventListener("enterScene", scene5) 

scene5:addEventListener("exitScene", scene5) 

scene5:addEventListener("destroyScene", scene5) 

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

return scene5 

更新:

嗨@DevfaR

哈,我已經從與電暈模板從頭重新開始想通了幾件事情:

1)exitScene /如果使用本地組對顯示對象進行分組,destroyScene實際上會執行某些操作。它將刪除顯示組! 不是很明顯,因爲它只有一個聲明,沒有代碼這樣的代碼

2)我之所以有這麼多的removeSelf對象的原因是因爲沒有任何工作。所以我嘗試了幾乎所有的東西。

3)它沒有工作的原因是因爲我創建我的顯示對象到一個函數。不知何故顯示組沒有通過那裏。如果我將代碼移動到createScene函數中,那麼在進入下一個場景時確實會清除它們。

問題是..我真的想組我的puppetCreation代碼! 例如

function scene:createScene(event) 
     local group = self.view 
     local physics = require("physics") 
     physics.start() 
     background = display.newImage("assets/bckg.png",0,0) 
    group:insert(background) 

     createPuppet1(group) 
     createPuppet2(group) 
end 
function createPuppet1(group) 
     puppet1= display.newImage("assets/puppet1.png",0,0) 
    group:insert(puppet1) 
end 
function createPuppet2(group) 
     puppet2= display.newImage("assets/puppet2.png",0,0) 
    group:insert(puppet2) 
end 

我通過(組),因爲功能createPuppet犯規讓我指定 本地組= self.view

我的電子郵件地址edualczatebed @ gmail的。COM

感謝你的幫助

+0

你能包括更多的代碼,很難指出你的問題發生在哪裏只是給它的一個片段 – DevfaR

回答

0

有一個在你的代碼了很多的bug,因爲當你去一個場景,然後切換到其他場景你刪除所有對象的你實現它的方式是不好在destroyScene以及它的監聽器,這是不是很有效,我不能指出是什麼原因導致的問題,因爲就像我說你的代碼中有很多錯誤。我想你不太明白如何在Corona上使用故事板。給你一個想法,你將如何解決你的問題,我將執行一些代碼,讓你明白,即使你沒有刪除destroyScene上的對象,你可以通過它在顯示組上移除該對象。

local rectangle 
local circle 

local function nextScene(event) 
    storyboard.gotoScene("scene_2", "fade", "500") 

end 

-- Called when the scene's view does not exist: 
function scene:createScene(event) 
    local group = self.view 

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

    rectangle = display.newRect(100,100,100,100) 
    rectangle:setFillColor(255,0,0) 
    rectangle.x = 100 
    rectangle.y = 100 

    circle = display.newCircle(100,100,50) 
    circle.x = 250 
    circle.y = 100 
    circle:setFillColor(0,255,0) 

    --inserting all of your object into display group so that if you destroy the scene the display group will be remove 
    group:insert(rectangle) 
    group:insert(circle) 


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

end 


-- Called immediately after scene has moved onscreen: 
function scene:enterScene(event) 
    local group = self.view 

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

    rectangle:addEventListener("tap", nextScene) 
    circle:addEventListener("tap", nextScene) 



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

end 


-- Called when scene is about to move offscreen: 
function scene:exitScene(event) 
    local group = self.view 

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


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

end 


-- Called prior to the removal of scene's "view" (display group) 
function scene:destroyScene(event) 
    local group = self.view 

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



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

end 

,你可以看到我創建2個對象的矩形和圓形後,我創建的對象將其插入到組,然後在enterScene我加了一個水龍頭監聽器,將前往第二個場景,如果我點擊的對象。請注意,當我到達scene_2時,我並沒有去掉destroyScene上的對象和偵聽器,這是因爲當我將對象插入顯示組時,只要我改變場景,它總是會刪除對象。所以在移動到下一個場景之後,您可以清除最後一個場景或完全移除它,因此當您回到該場景時,它將重新創建該對象。 希望這可以幫助你解決你的問題

+0

嗨@DevfaR。 這是正確的,我真的不明白如何使用故事板,因爲那裏沒有教程。只有一小部分的代碼和解決方法由論壇。所以你的幫助非常感謝,相信我。 – user2354185

+0

現在,你說的是非常有趣的: 「注意到,當我去scene_2時,我並沒有去掉destroyScene上的對象和監聽器,這是因爲當我將對象插入到顯示組中時,只要我改變場景它會一直刪除對象「是這樣嗎?爲什麼沒有destroy_scene? – user2354185

+0

就在上班之前,試着讓你的代碼直接進入我的level5.lus,這裏是我的問題.. 我的level5.lua從menu.lua調用 我需要有 本地故事板= require(「storyboard」) local scene = storyboard.newScene() 每個'levelx.lua'的開頭? (因爲就像這樣它不工作)=我得到一個scene5.lua:16嘗試索引全局'場景'(一個零值) – user2354185

相關問題