【问题标题】:remove all spawned coins移除所有生成的硬币
【发布时间】:2014-02-19 06:52:29
【问题描述】:

游戏结束后移除所有生成的硬币的最佳方法是什么?

这是生成硬币的代码:

 screenGroup = self.view
 coin = {}
 coinspawn = function()
 i = display.newSprite( imageSheet1, sequenceData1 )

    i.x = display.contentWidth
    i.y = math.random(0, display.contentHeight-50)
    i:play()
    i.collided = true
    i.name = "coin"
    physics.addBody(i, "dynamic", 
        {density=.1, bounce=0.1, friction=.2, shape= shape2 ,filter=playerCollisionFilter } 
    )   
    --player.gravityScale = 0.5
    coinIntro = transition.to(i,{time=2500, x=display.contentWidth - display.contentWidth -500  ,onComplete=jetReady , transition=easing.OutExpo } ) --
    coin[#coin+1] = i

end 
tmrcoin = timer.performWithDelay( 1000, coinspawn, 0 )

【问题讨论】:

  • 请记住,在以后的问题中,展示您尝试过的内容

标签: lua coronasdk


【解决方案1】:

首先,您要从显示器中取出所有硬币。然后你会清除coin 表:

for i=1,#coin do 
    coin[i]:removeSelf()
end
coin = {}  -- forget all coins

假设coin table 是您存放硬币的唯一其他地方,这可以做到。

注意不能在removeSelf之后的循环中使用coin[i]=nil:只要table有洞,#操作符基本就不能用了。你也不能使用 table.remove ,因为 i 每次都会增加,所以你会错过项目(试试,你会看到)。对也有同样的问题:您无法在迭代表格时对其进行编辑。但是你可以这样做:

local numCoins = #coin
for i=1,numCoins do 
    coin[i]:removeSelf()
    coin[i]=nil
end
-- now coin is {}

我能想到 nil N 个项目而不是让 gc 用一个 table = {} 语句来处理它的唯一原因是,如果您对您的硬币表有多个引用(顺便说一句,我会将其重命名为硬币) ,为清楚起见)。

【讨论】:

  • 由于某种原因,出现“尝试调用方法 'removeSelf'(一个 nil 值)”错误,但 'coin = {}' 本身似乎可以解决问题
  • @kevinver 该错误意味着一些重要的代码没有显示,因为for i=1,#coin 构造只会循环以coin[1] 开头的表的前N 个非零项。其他代码是否从coin 表中删除项目?如果是这样,您必须使用 ipairs()。此外,如果您不致电removeSelf(),您将得到泄漏,在您多次重新启动场景(不退出)之前可能不明显。除非(再次在您的问题中未显示的代码中,例如在 destroyScene 事件处理程序中)您破坏场景视图,这使得 removeSelf() 不必要。
  • 对不起,我试图使用“coin [i] = nil”删除它们,所以我认为“coin = {}”的组合解决了问题
  • 游戏在一个 lua 文件中,所以我没有退出场景
  • 你看到coin[i]=nil in my code了吗?这是有原因的:)我已经延长了帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多