2012-12-29 61 views
0

所以我正在學習基本的遊戲編程,並且我有這個子彈班,當然這是班上的子彈班。Python。如何從列表中刪除一個對象

bulletGroup = [i for i in bulletGroup if i.buly < screen.get_height()] 
for shot in bulletGroup: 
    shot.buly -=3 

這是我做的,所以我可以除去已經通過屏幕FRPM似乎abpve /然而,它沒有減少我的列表的長度,這樣的代碼行T第一可能不工作子彈。那麼,如何檢查對象列表,然後刪除所有我想要銷燬的對象。

編輯: 是的,我檢查對象是否在列表中打印出來,並且它們絕對小於屏幕高度。但他們仍然是名單的一部分?所有這些都在遊戲循環順便說一句。所以每個勾號都應該有bulletGroup爲那些失控的子彈更新。

+1

您確定有物件失效嗎?你能舉一些例子數據嗎? – GWW

回答

4

您每次從buly減去3,因此永遠不會大於screen.get_height()

根據您的遊戲是如何工作的,您應該比較buly0

bulletGroup = [i for i in bulletGroup if i.buly >= 0] 
for shot in bulletGroup: 
    shot.buly -= 3 

或加3〜buly代替:

bulletGroup = [i for i in bulletGroup if i.buly < screen.get_height()] 
for shot in bulletGroup: 
    shot.buly += 3 
+0

OH CRAP!我很愚蠢,不知怎的,我的大腦沒有注意到,但被笛卡爾和遊戲中使用的座標系統所困惑。 - 它現在可以工作。泰克斯爲此!簡直不敢相信我在那個上花了幾分鐘時間。 –

+1

現在很高興它的工作:)另外要記住的是,如果你正在做第一個選項(如'if.buly> = -bulletHeight'),你可能需要考慮項目符號的高度。 – grc

+0

我想到了這一點,但我認爲它並不重要,因爲它只是一個直徑約5px的圓。 :) –

0

您也可能會發現,最好是保持固定的子彈池,而不是將它們添加到列表中,然後刪除它們。相反,給他們一個'禁用'他們的標誌,以便他們不會更新或繪製每一幀,然後'激活'一個新的,當你需要更多。

如果您不斷創建並銷燬子彈對象,則會導致大量垃圾收集並在您的遊戲中創建週期性暫停。固定的對象池可以防止出現問題,並且可以避免一次性意外創建太多內容。

相關問題