我正在使用Python和Pygame中的横向卷轴射击游戏。在游戏开始时,我创建了一系列列表,例如敌人[]和镜头[]。当游戏重新开始时,我已经尝试了我能想到的一切,但所有实例仍然在最后一次游戏的屏幕上!
在我的重启代码中,我有这个......
for item in enemies:
enemies.remove(item)
del item
for item in shots:
shots.remove(item)
del item
我甚至在此之后添加了代码来重新初始化列表,所以:
enemies=[]
shots=[]
但是在新的游戏中,一切都还在那里。救命啊!
答案 0 :(得分:2)
您的主要问题是您的列表确实存在于多个上下文中(另一种方法或其他功能)
执行enemies = []
时,清除名为"敌人"的局部变量。 - 但它不再指向前一个对象,它在另一个funtcion /方法中使用(虽然你没有在此列出代码)。
你的另一种方法,使用for
尝试在修改它时迭代列表 - 它应该(并且确实)以意想不到的方式中断。
简单地说:
enemies[:] = []
shots[:] = []
相反:这些将更改当前由这些名称引用的对象,而不是创建新对象并在本地使用它们。这样,使用这些列表的任何其他函数的内容也将被清空。(这不是魔术:[:]
切片语法处理列表的所有元素 - 从第一个到最后一个,以及归因使这些元素被空列表的内容替换:没有)
虽然现在可以使用,但是如果你在几个函数/方法中使用敌人,镜头和其他数据结构,也许你使用class
进行更清洁的设计,保留所有数据结构作为该类的属性,并将您的函数提升为方法(即使您当前没有使用面向对象设计的其他用途)。这样,您可以明确地尝试修改代码其他部分中使用的相同对象。
另一个建议:阅读文档,熟悉pygame Groups(和Sprites) - 它们对于干净的设计非常方便,当然可以更好地执行上面列表对象的任何操作
(例如,如果enemies
是一个群组,那么您在这种情况下只需致电enemies.empty()
)
答案 1 :(得分:0)
您使用的是Pygame对象,例如Sprites
和Groups
吗?
Pygame有一个名为Sprite
的{{1}}存储对象。它有许多方便的方法来命中检测,绘制和添加/删除Sprite,这样你就不必删除任何东西。
此外,Sprites有一个Group
方法,可以将它们从它们所属的所有组中删除。通过这种方式,Sprite属于1组或703组并不重要;它将从所有这些中删除。
最后,您发布的所有代码似乎都没有涵盖屏幕上实际绘制的任何内容。您是否有可能错过某种对象的实例,这些对象是某种类型的"绘制这些到屏幕的"序列?如果是这样,那么尝试以您在此处执行的方式删除它们并不一定会从每个列表或每个相关范围中删除它们。例如:
self.kill()
最终,您可能希望利用>>> foo = {}
>>> bar = []
>>> bar.append(foo)
>>> del foo
>>> foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined
>>> bar
[{}] # the object lives!
和pygame.sprite.Sprite
对象让生活更简单一点 - 再次,他们有方便的方法处理所有这些东西,所以你不要&#当你不再需要它时,我必须寻找并摧毁一个物体的每个实例。
答案 2 :(得分:0)
对不起,我的回答取决于你的完整代码。
这主要取决于你如何调用敌人和镜头更新。
因此,如果您遍历列表并更新每个对象,这应该可以工作:
enemies = []
shots = []
但你说它不起作用。
你做错了两件最可信的事情:
enemies
和shots
不是真正的迭代列表,因此您可以通过其他列表更新它们。如果您使用其他库,则可能会将其列在更新列表中。enemies
也不会更新shots
,但您没有填写屏幕或熟悉的内容。请注意,如果您添加了更多代码并且仍然没有延迟,这个答案可能会更好。