我正在做一个游戏,当精灵在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
我有一个背景和其他一切工作良好,我只是不能删除正确的精灵从敌人集团。
在列表上迭代时,不能从列表中删除项:
你可以这样写:
需要
global
语句,以便函数可以修改EnemyList
,在本例中,它不在其作用域内。或者将要删除的敌人存储到另一个列表中,然后再将其删除。
一个更简单的方法是使用Sprite方法
kill()
,该方法将Sprite从它当前所在的所有pygame.sprite.Group
中移除。在你的
update()
中调用die()
将允许你检查是否要杀死你的精灵每个游戏循环,但是给定die()
中的代码量,你只需将代码移动到update()
中即可。根据您当前的代码,您的EnemyList
已经是一个pygame.sprite.Group
对象,因此不需要进行任何更改。你现在的方法对我来说很难理解。你正在创建一个敌人,它检查是否所有的敌人(自身和列表中的另一个)都应该死亡。所以在你的游戏循环中,你从一个敌人那里调用这个方法来控制所有的敌人。换句话说,您正在创建具有不同职责的相同对象。根据经验:对象的方法应该只改变其自身的状态。
最后,
draw()
方法是不必要的,因为超类完全按照您的方式定义方法。所以删除你的将调用draw()
的pygame.sprite.Sprite
。相关问题 更多 >
编程相关推荐