我正在 pyglet 中编写一个简单的“避免坠落的敌人”类型的游戏。对象在屏幕上方生成,向下移动,并在通过可见屏幕下方时被销毁。但是,我做错了,程序运行的时间越长,对象的数量就会越来越多。(它变慢了,我发现了 objgraph 的问题。)当我删除这个类时,问题就消失了。
堕落的敌人等级:
class Enemy(pyglet.sprite.Sprite):
def __init__(self, **kwargs):
super(Enemy, self).__init__(img=images.enemy_anim["front"], **kwargs)
self.out_of_bounds = False
def update(self, dt):
self._move(dt)
self._check_boundaries(dt)
self._check_kill_condition()
def _move(self, dt):
self.y -= ENEMY_SPEED * dt
def _check_boundaries(self, dt):
if self.y + self.height < 0:
self.out_of_bounds = True
def _check_kill_condition(self):
if self.out_of_bounds:
enemy_list.remove(self)
self.delete
主要方法代码:
enemy_list = []
def add_enemy(*args, **kwargs):
randx = random.randint(0,
WINDOW_WIDTH - images.enemy_anim["front"].get_max_width())
randy = WINDOW_HEIGHT + images.enemy_anim["front"].get_max_height()
enemy_list.append(Enemy(x=randx, y=randy, batch=update_batch))
def update(dt):
for sprite in enemy_list:
sprite.update(dt)
#send the above functions to the pyglet scheduler
pyglet.clock.schedule_interval(update, 1/TICKS_PER_SECOND)
pyglet.clock.schedule_interval(add_enemy, 1/ENEMY_ADD_RATE)
我将敌人动画存储在字典(images.enemy_anim)中的一个单独模块(图像)中。
我用列表中的引用创建了一个敌人。
当敌人死亡时,我告诉它从列表中删除自己。我在运行时检查了列表的长度,它总是合适的长度。所以这个名单并没有失去控制。该对象从列表中删除后应该没有引用,对吗?
我究竟做错了什么?
编辑:
问题是我有self.delete
而不是self.delete()
. 愚蠢的错误...