2012-12-29 63 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

您也可能会发现,最好是保持固定的子弹池,而不是将它们添加到列表中,然后删除它们。相反,给他们一个'禁用'他们的标志,以便他们不会更新或绘制每一帧,然后'激活'一个新的,当你需要更多。

如果您不断创建并销毁子弹对象,则会导致大量垃圾收集并在您的游戏中创建周期性暂停。固定的对象池可以防止出现问题,并且可以避免一次性意外创建太多内容。

相关问题