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

2024-05-13 09:29:48 发布

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

在游戏开始之前,从类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, mobs, False, 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, (self.rect.x+20,self.rect.y-100, 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

基本上,我试图创造一个僵尸的浪潮,但产生的僵尸都以某种方式相互联系,就像当一个死亡时,所有其他人都与之一起死亡,等等


Tags: rectimageselffalseforifdefupdate
1条回答
网友
1楼 · 发布于 2024-05-13 09:29:48

而不是在序列上迭代:

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, mobs, False, pygame.sprite.collide_mask):
    player.shoot = False
    player.startShoot = True
    zomb.damage()
    if zomb.health() <= 0:
        zomb.dying()
    ...

因为它已经返回来自mobs的所有与player冲突的精灵

在代码中,实际上并不知道spritecollide返回什么

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

相关问题 更多 >