【问题标题】:Removing a 'dead' thing from an array从数组中删除“死”的东西
【发布时间】:2015-01-14 15:55:48
【问题描述】:

我是科罗娜的新手。我正在开发一个简单的 TD 游戏。我有墙壁(路障),玩家可以将它们拖到战场上,然后敌人会蜂拥向目标目的地。如果他们遇到路障,他们会从路障中移除生命值,直到它达到零,然后路障就会消失。

我的路障被杀死和移除的代码如下:

if (barricadeCount == 0) then
    print ("No barricades left")
else
    for i = 1, totalBarricades do       
            if (barricade[i].isAttacked == true) and (barricade[i].health == 0) then 
                print ("REMOOOOOVING BARRICADE", i)
                local deadBarricade = table.remove(barricade,i)
                deadBarricade:removeSelf()
                deadBarricade = nil
                totalBarricades = totalBarricades - 1 --one less in the 'total'!
            end
            if (barricade[i].isAttacked == true) and (barricade[i].health > 0) then
                barricade[i].health = barricade[i].health - 10
                --and change graphic to show damage
                print ("barricade",i,"health is now",barricade[i].health)
            end
    end
totalBarricades = totalBarricades - 1

现在我遇到的问题是,当第一个路障“死亡”时,我会崩溃并且

'尝试索引字段'?' (零值)

我怀疑它与重新编号的路障阵列的内容有关,但我就是想不通。如果有人能指出我在这里做错了什么,我将非常感激。

【问题讨论】:

  • 如果一个对象死了,你将它从数组中删除,但你会立即访问相同的路障[i] 以检查运行状况 - 如果删除的条目是最后一个条目,你将在结束。我会这样做:1)减去健康2)如果健康

标签: arrays lua coronasdk null


【解决方案1】:

不要在表中删除它,让它保持。只要您的设备可以承载负载,Lua 表就可以处理不确定的值。只需执行deadBarricade:removeSelf() 即可清除一些内存。每次移除路障时,我预计当您从表中转移元素时会有一些滞后时间。如果同时拆除大量路障怎么办?我不知道它最终会出现什么错误,但我已经预料到了。

【讨论】:

    【解决方案2】:

    我认为当路障总数变为零并尝试在以下代码中检查活动路障时会发生错误。

    如果 (barricade[i].isAttacked == true) 和 (barricade[i].health > 0) 那么

    表超出索引并弹出错误。 您可以添加额外的检查以确保您没有引用 nil 对象。

    if (barricade[i] and barricade[i].isAttacked == true) and (barricade[i] and barricade[i].health > 0) then
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2023-03-27
      • 2014-06-25
      • 2021-10-06
      • 2014-12-15
      相关资源
      最近更新 更多