Object 科罗纳+;尽管removeSelf+;设为零

Object 科罗纳+;尽管removeSelf+;设为零,object,coronasdk,Object,Coronasdk,我有多层次的游戏,我所有的对象在不同层次之间的内存中都是空的 我的意思是,如果我将物理设置为混合,当我再次进入这个级别(或另一个级别)时,它会显示一个方框,但没有图片。(物理作用于这些空盒子) 在销毁场景中我已经确定它们都是 myObj:removeSelf() myObj = nil 我打印了一条信息来证明它确实做到了 也在enterScene的菜单中,以防万一我要 local prior_scene = storyboard.getprevious() storybo

我有多层次的游戏,我所有的对象在不同层次之间的内存中都是空的 我的意思是,如果我将物理设置为混合,当我再次进入这个级别(或另一个级别)时,它会显示一个方框,但没有图片。(物理作用于这些空盒子) 在
销毁场景中
我已经确定它们都是

   myObj:removeSelf()
    myObj = nil
我打印了一条信息来证明它确实做到了

也在enterScene的菜单中,以防万一我要

  local prior_scene = storyboard.getprevious()
  storyboard.purgescene( prior_scene )
还试了一个

  storyboard.removeAll()
甚至是

  storyboard.purgeOnSceneChange = true
当我进入下一个关卡,或者再次进入同一关卡时,什么都不起作用,我以前的所有对象都还在这里,我就是不明白

好的,会有点长,但这里是整个关卡。它确实会穿过场景,但不知何故,显示对象不会被删除

-- 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

哈,我已经用corona模板从零开始重新启动,并解决了一些问题:

1) 如果使用本地组对显示对象进行分组,exitScene/destroyScene实际上会执行一些操作。它将删除显示组! 不是很明显,因为其中只有一个声明,没有这样的代码

2) 我之所以要把所有的东西都拿走,是因为什么都没用。所以我几乎尝试了网络下的一切

3) 它不起作用的原因是因为我把我的显示对象创建成了一个函数。不知怎的,显示组没有传递到那里。如果我将代码移动到createScene函数中,那么在进入下一个场景时,它确实会被清除

问题是。。我真的很想分组我的木偶创作代码! e、 g

我通过了(组),因为createPuppet函数不允许我指定 本地组=self.view

我的电子邮件地址是edualczatebed@gmail.com


感谢您的帮助

您的代码中有很多错误,您实现它的方式不太好,因为当您转到一个场景,然后切换到另一个场景时,您删除了
destroyScene
上的所有对象以及它的侦听器,这不是很有效,我无法指出问题的原因,因为就像我说的,你的代码中有很多bug。我想你不太明白如何在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
如您所见,我创建了两个对象矩形和圆形,在创建对象后将其插入到组中,然后在
entersecene
上添加了一个点击侦听器,如果我点击对象,它将转到第二个场景。请注意,当我转到场景2时,我没有费心删除
destroyScene
上的对象和侦听器,这是因为每当我更改场景时,将对象插入显示组时,它总是会删除对象。因此,在移动到下一个场景后,您可以清除最后一个场景,也可以完全删除它,这样当您返回到该场景时,它将重新创建对象。
希望这能帮助你解决你的问题

你能提供更多的代码吗?仅仅给出一个ITI@DevfaR的片段就很难指出你的问题发生在哪里。这是正确的,我真的不明白如何使用故事板,因为那里没有教程。论坛只提供少量代码和解决方法。因此,非常感谢您的帮助,相信我。现在,您所说的非常有趣:“注意,当我转到场景2时,我没有费心删除destroyScene上的对象和侦听器,这是因为每当我更改场景时,将对象插入显示组时,它总是会删除对象”是这样吗?为什么没有销毁场景?就在开始工作之前,试图通过将代码直接放入我的level5.lus来让代码正常工作,下面是我的问题。。我的level5.lua是从菜单中调用的。lua我是否需要在每个“levelx.lua”的开头有local storyboard=require(“storyboard”)local scene=storyboard.newScene()?(因为就像这样它不起作用)=我得到了一个scene5.lua:16尝试索引全局“scene”(一个nil值)我在exitScene下面的代码中添加了destroyScene。关于您的问题如果您需要在每个级别上使用故事板是的,您需要使用故事板切换不同的布局这就是为什么如果您使用故事板创建新项目,会生成场景模板。我很想解释story board中的所有功能试着了解它是如何工作的如果你有问题,请转到这个链接,在这里问一下信不信由你我浏览了这个文档大约10次。它没有解释为什么我们需要在每个函数中添加“localgroup=self.view”?(我们知道吗?)它的作用和方式?调用exit_场景时,是否会删除场景中的所有对象?函数场景也一样:CreateSecene(事件)我应该调用场景吗:。。或者场景一:场景二:。。对于每一个级别(scene1.lua,scene2.lua),都有很多没有解释的东西,我希望你能解释。有人会的。无论如何谢谢你
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