如何创建重复的精灵,使用pygame中的同一类独立工作?

在游戏开始之前,通过从Mob类调用它来启动5个对象(僵尸)。然后,存储在名为zombie的列表中。

zombie = [None]*5
def newmob():
    for i in range(5):
        zombie[i] = Mob()
        all_sprites.add(zombie[i])
        mobs.add(zombie[i])

newmob()在进入游戏循环之前被调用。

newmob()
while running:
    for i in range(len(zombie)):
        hits = pygame.sprite.spritecollide(player,mobs,False,pygame.sprite.collide_mask)
        if hits:
            player.shoot = False
            player.startShoot = True
            zombie[i].damage()
            if zombie[i].health() <= 0:
                zombie[i].dying()
        atks = pygame.sprite.spritecollide(barricade,pygame.sprite.collide_mask)
        if atks:
            zombie[i].attacking()
            barricade.damage()
            print(barricade.health())
            if barricade.health() <= 0:
                barricade.destroyed()
                zombie[i].walking()

暴民类如下:

class Mob(pygame.sprite.Sprite):
    zom3_walk = [pygame.image.load(path.join(img_folder,'3go_%s.png' % frame)) for frame in range(1,17)]
    zom3_die = [pygame.image.load(path.join(img_folder,'3die_%s.png' % frame)) for frame in range(1,17)]
    zom3_atk = [pygame.image.load(path.join(img_folder,'3hit_%s.png' % frame)) for frame in range(1,17)]
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = zom3_walk[0]
        self.x = random.randrange(1000,1200)
        self.y = 400
        self.rect = self.image.get_rect()
        self.rect.center = (self.x,self.y)
        self.vx = random.uniform(0.02,1)
        self.hpbar = 2
        self.walkCount = 0
        self.Dead = False
        self.Attack = False
        self.Walk = True
        self.frame = 0
        self.last_update = pygame.time.get_ticks()
        self.frame_rate = 100

    def die_animation(self):
        now = pygame.time.get_ticks()
        if self.frame < 16:
            self.image = self.zom3_die[self.frame]
            if now - self.last_update > self.frame_rate:
                self.last_update = now
                self.frame += 1
        else:
            self.kill()
    def attack_animation(self):
        if self.attacking:
            now = pygame.time.get_ticks()
            if self.frame < 16:
                self.image = self.zom3_atk[self.frame]
                if now - self.last_update > self.frame_rate:
                    self.last_update = now
                    self.frame += 1
            else:
                self.frame = 0
                if now - self.last_update > 600:
                    self.frame = 0
    def dying(self):
        self.Dead = True
    def attacking(self):
        self.Attack = True
        self.Walk = False
    def walking(self):
        self.Attack = False
        self.Walk = True
    def health(self):
        return self.hpbar
    def damage(self):
        self.hpbar -=1
    def update(self):
        now = pygame.time.get_ticks()
        pygame.draw.rect(screen,RED,(self.rect.x+20,self.rect.y-100,self.hpbar*100,45))
        pygame.draw.rect(screen,WHITE,200,45),2)
        if self.Attack:
            self.vx = 0
            self.attack_animation()
        if self.Dead:
            self.die_animation()
        if self.Walk:
            if now - self.last_update > 800:
                if self.rect.x > 0:
                    self.vx = random.uniform(0.02,0.03)
                    self.rect.x -= self.vx
                if self.walkCount + 1 >= 20:
                    self.walkCount = 0
                if self.vx > 0:
                    self.image = self.zom3_walk[self.walkCount // 3]
                    self.walkCount += 1

基本上,我正在尝试创建一堆僵尸,但是生成的僵尸却以某种方式彼此关联,就像当一个人将所有其他死者一起死等时一样……

ou562970340 回答:如何创建重复的精灵,使用pygame中的同一类独立工作?

代替遍历序列:

for i in range(len(zombie)):
    hits = pygame.sprite.spritecollide(player,mobs,False,pygame.sprite.collide_mask)
    if hits:
        player.shoot = False
        player.startShoot = True
        zombie[i].damage()
        if zombie[i].health() <= 0:
            zombie[i].dying()
        ...

spritecollide返回的精灵列表中重复:

for zomb in pygame.sprite.spritecollide(player,pygame.sprite.collide_mask):
    player.shoot = False
    player.startShoot = True
    zomb.damage()
    if zomb.health() <= 0:
        zomb.dying()
    ...

因为它已经返回了mobsplayer相撞的所有精灵。

在您的代码中,实际上并没有spritecollide返回的内容。

您可能应该删除zombie列表,或者至少停止通过索引访问其元素。

本文链接:https://www.f2er.com/2976574.html

大家都在问