我正在制作游戏,当精灵在x轴上低于100时,它应该被删除。精灵都位于一个班级。当第一个精灵到达结尾时,它会删除该组的最终精灵而不是第一个精灵。
敌人类
class Enemy(pygame.sprite.Sprite):
def __init__(self,x,y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('Enemy.gif').convert()
self.rect = self.image.get_rect(x=x, y=y)
def update(self):
self.rect.x -= 4
def die(self):
for enemy in EnemyList:
if enemy.rect.x<100:
EnemyList.remove(enemy)
def draw(self, DISPLAY):
DISPLAY.blit(self.image, self.rect)
主循环(敌人的一部分)
time = 0
while not Gameover: #Loop of the gameplay
if time in (0,50,100,150,200):
enemy = Enemy(DIS_HEIGHT,random.randrange(0,DIS_HEIGHT)
enemy.add(EnemyList)
EnemyList.update()
EnemyList.draw(DISPLAY)
enemy.die()
time +=1
我有一个背景,其他一切正常,我无法从敌人组中删除正确的精灵。
答案 0 :(得分:4)
迭代时,您无法从列表中删除项目:
def die(self):
for enemy in EnemyList:
if enemy.rect.x<100:
EnemyList.remove(enemy)
你可以改为写下这样的东西:
def die(self):
global EnemyList
EnemyList = [enemy for enemy in EnemyList if enemy.rect.x>=100]
需要global
语句,以便函数可以修改EnemyList
,在这种情况下,它不在其范围内。
或者将要删除的敌人存储到另一个列表中,然后将其删除。
答案 1 :(得分:3)
更简单的方法是使用Sprite方法kill()
,该方法从当前所有pygame.sprite.Group
中删除精灵。
def die(self):
if self.rect.x < 100:
self.kill()
在die()
中调用update()
将允许您检查是否在每个游戏循环中杀死精灵,但考虑到die()
中的代码量,您只需将代码移到内部update()
。根据您当前的代码,您的EnemyList
已经是pygame.sprite.Group
个对象,因此不需要进行任何更改。
您当前的die()
方法很难让我理解。你正在创造一个敌人,检查所有敌人(本身和列表中的其他人)是否应该死亡。因此,在你的游戏循环中,你可以从一个敌人那里调用该方法来控制所有敌人。换句话说,您正在创建具有不同职责的相同对象。根据经验:对象的方法应该只改变自己的状态。
最后,draw()
方法是不必要的,因为超类以您的方式完全定义方法。因此,删除您的邮件会调用draw()
的{{1}}。