Ste*_*104 4 python pygame class python-2.7
我正在做一个游戏,当精灵在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)
Run Code Online (Sandbox Code Playgroud)
主循环(敌人的一部分)
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
Run Code Online (Sandbox Code Playgroud)
我有背景并且其他所有东西都工作正常,我只是无法从敌方队伍中删除正确的精灵。
一种更简单的方法是使用 Sprite 方法kill(),该方法从pygame.sprite.Group当前所在的所有对象中删除一个精灵。
def die(self):
if self.rect.x < 100:
self.kill()
Run Code Online (Sandbox Code Playgroud)
调用die()你的update()will 允许你检查是否在每个游戏循环中杀死你的精灵,但考虑到代码量,die()你可以简单地将代码移动到update(). 根据您当前的代码,您EnemyList已经是一个pygame.sprite.Group对象,因此无需更改。
你目前的die()方法我很难理解。您正在创建一个敌人,用于检查是否所有敌人(自身和列表中的另一个)都应该死亡。因此,在您的游戏循环中,您可以从单个敌人调用该方法以控制所有敌人。换句话说,您正在创建具有不同职责的相同对象。根据经验:一个对象的方法应该只改变它自己的状态。
最后,该draw()方法是不必要的,因为超类完全按照您的方式定义了该方法。因此,移除你会改为调用draw()的pygame.sprite.Sprite。
遍历列表时,不能从列表中删除项目:
def die(self):
for enemy in EnemyList:
if enemy.rect.x<100:
EnemyList.remove(enemy)
Run Code Online (Sandbox Code Playgroud)
您可以改写这样的东西:
def die(self):
global EnemyList
EnemyList = [enemy for enemy in EnemyList if enemy.rect.x>=100]
Run Code Online (Sandbox Code Playgroud)
global需要该语句,以便函数可以修改EnemyList,在这种情况下,其范围之外。
或将要删除的敌人存储到另一个列表中,然后再删除它们。
| 归档时间: |
|
| 查看次数: |
4785 次 |
| 最近记录: |