【问题标题】:How to remove copies of one object under the same variable name如何删除同一变量名下的一个对象的副本
【发布时间】:2016-06-01 05:41:44
【问题描述】:

这是我开始的代码:

numTrumps=100

  local function startGame()
    myTrump=display.newImageRect("tp.png",25,25)
     myTrump.x=Random(50,_W-50)
     myTrump.y=(_H+10)
     physics.addBody(myTrump,"dynamic",{density=.1,friction=0,bounce=.9,radius=9})

    function myTrump:touch(event)

    if(timeLeft~=false) then

        if (playerReady==true) then
            if(event.phase=="ended") then
            removeTrumps(self)
        end

    end
end
end
        myTrump:addEventListener("touch",myTrump)

trumps=trumps+1

if(trumps==numTrumps) then
    gameTimer=timer.performWithDelay(1000,countDown,totalTime)
else

    playerReady=false
end
end



  local gameTimer=timer.performWithDelay(20,startGame,numTrumps)


local function Restart(event)
    if "began"==event.phase then 

if(timeLeft~=false) then

    timer.cancel(gameTimer)
     gameTimer1=timer.performWithDelay( 20, ByeTrump, 96)

    end

end
        if "moved"==event.phase then

end
            if "ended"==event.phase then

            composer.gotoScene("restarttest")

            end
        end


function ByeTrump()
    display.remove(myTrump)
end

所以从 numTrumps=100 开始,基本上 startGame 函数会重复 100 次,因此每次都会创建同一对象 (myTrump) 的新图像。一旦我重新启动,我想删除该对象的副本,所以我创建了一个函数(ByeTrump),其中一个 myTrump 被删除,我通过在重新启动函数中创建另一个游戏计时器重复了 96 次。出于测试目的,我让 96 消失而不是 100,但在我的游戏中,您有 20 秒的时间来触摸尽可能多的 100 个 myTrumps,并且在触摸它们时它们消失了。一旦 20 秒结束,您就无法再触摸它们,因此您必须重新开始。

所以我的问题是,当我单击重新启动时,只有一个 myTrump 消失,而不是剩余的 99 个(出于测试目的,我在 20 秒内没有触摸任何 myTrump)。因此,当新的 100 个 myTrump 在重新启动后出现时,它们会发生碰撞与上一轮的那些,即使最后一个不再可见,就像它们是不可见的一样 a=但仍然与新的碰撞。

【问题讨论】:

    标签: lua coronasdk displayobject


    【解决方案1】:

    通过将所有 Trumps (lol) 存储在同一个变量中,您正在创建每个对象,然后下一步,通过将连接与另一个对象链接来删除与它的连接,因此第一个对象仍然存在,但你再也无法到达它了。

    可能对collectgarbage() 的一次调用应该有效(虽然不确定),因为垃圾收集器所做的是消除您不再与之有任何联系的任何对象,但我不确定它是否适用于您的对象的类型,所以这是执行此操作的标准方法。

    如果您不想用第二个对象替换与第一个对象的连接,您需要大量不同的变量 (trump1, trump2... trump100),或者更好的是,一个可以容纳多个变量的数据结构变量。

    也就是表格。

    所以你应该初始化那个表:

    allTrumps = {}
    

    然后,在 startGame 函数中,不是将新对象存储在 myTrump 中,而是将一个新字段添加到将保存该对象的表中:

    allTrumps[#allTrumps + 1] = display.newImageRect(...)
    

    您正在做的是检查桌子的长度(或其中的对象数量)并将对象存储在下一个位置。

    当您想要移除王牌时,您可以从您添加的第一张或最后一张王牌开始。为了简洁起见,我们将从最后开始。

    function ByeTrump()
        display.remove(allTrumps[#allTrumps])
    
    end
    

    这将删除您创建的最后一个王牌,因此表格将包含一个少一个对象,大小将减少一,您已经可以再次调用该函数以删除另一个王牌。

    【讨论】:

    • 谢谢,但是如何为生成的每个 myTrump(每个图像)添加一个触摸事件侦听器,以及如何为每个生成的每个图像添加一个物理体?
    • 我将我的 startgame 函数全部添加到代码中,这样你就知道我的触摸监听器在哪里了。
    • 我对电晕不够熟悉,无法回答这个问题,抱歉。试着写另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2021-03-15
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    相关资源
    最近更新 更多