Pygame从组中移除单个精灵

2024-04-28 23:49:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个游戏,当精灵在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

我有一个背景和其他一切工作良好,我只是不能删除正确的精灵从敌人集团。


Tags: rectimageselftimeinitdefdisplaypygame
2条回答

在列表上迭代时,不能从列表中删除项:

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,在本例中,它不在其作用域内。

或者将要删除的敌人存储到另一个列表中,然后再将其删除。

一个更简单的方法是使用Sprite方法kill(),该方法将Sprite从它当前所在的所有pygame.sprite.Group中移除。

def die(self):
    if self.rect.x < 100:
        self.kill()

在你的update()中调用die()将允许你检查是否要杀死你的精灵每个游戏循环,但是给定die()中的代码量,你只需将代码移动到update()中即可。根据您当前的代码,您的EnemyList已经是一个pygame.sprite.Group对象,因此不需要进行任何更改。

你现在的方法对我来说很难理解。你正在创建一个敌人,它检查是否所有的敌人(自身和列表中的另一个)都应该死亡。所以在你的游戏循环中,你从一个敌人那里调用这个方法来控制所有的敌人。换句话说,您正在创建具有不同职责的相同对象。根据经验:对象的方法应该只改变其自身的状态。

最后,draw()方法是不必要的,因为超类完全按照您的方式定义方法。所以删除你的将调用draw()pygame.sprite.Sprite

相关问题 更多 >