2014-02-18 20 views
0

當遊戲結束時刪除所有衍生硬幣的最佳方法是什麼?刪除所有衍生硬幣

這裏是滋生硬幣代碼:

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) 
+0

請記住,在未來的問題,以顯示你已經嘗試 – Schollii

回答

1

首先,你會從顯示中刪除所有的硬幣。然後,你將清零coin表:

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

假設coin表是您存儲硬幣唯一的其他地方,這將做到這一點。

請注意,您不能在removeSelf之後的循環中使用coin[i]=nil:只要表有空洞,#操作符基本上不可用。你也不能使用table.remove,因爲我每次都增加,所以你會錯過物品(嘗試,你會看到)。成對的同一個問題:在迭代時無法編輯表格。然而,你可以這樣做:

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

我能想到的零N項,而不是讓GC照顧它與一個table = {}語句的唯一原因是,如果你有一個以上的參考你的硬幣表(爲了清楚起見,我將其重新命名爲硬幣,順便說一句)。

+0

因爲某種原因得到一個'試圖調用方法'removeSelf'(一個無值)'錯誤,但'硬幣= {}'似乎自己做詭計 –

+0

@kevinver這個錯誤意味着一些重要的代碼沒有顯示,因爲'for i = 1,#coin'構造將只循環以'coin [1]'開始的前N個非零項表。其他代碼是否從'coin'表中移除了物品?如果是這樣,你必須使用ipairs()。此外,如果您不調用'removeSelf()',則會發生泄漏,直到您重新啓動場景多次(不退出)纔會明顯。除非(在代碼中沒有顯示在你的問題中,例如在destroyScene事件處理程序中),你會銷燬使'removeSelf()'不必要的場景視圖。 – Schollii

+0

對不起,我試圖刪除他們使用「硬幣[我] =零」,所以我認爲組合惠特「硬幣= {}」修復了問題 –