Pygame从一个组中删除一个精灵

时间:2016-11-16 12:40:01

标签: python python-2.7 class pygame

我正在制作游戏,当精灵在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

我有一个背景,其他一切正常,我无法从敌人组中删除正确的精灵。

2 个答案:

答案 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}}。