用pygam动态控制sprite blit顺序

2024-06-30 12:51:28 发布

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

我正在写一个塔防游戏。一切正常,但有一个视觉问题困扰着我。你知道吗

基本上,一个具有较低rect.y并且在地图上应该较高的精灵可以在一个具有较高rect.y的较慢的怪物后面通过,可以在前景精灵之后(因此在前面)闪动。你知道吗

我可以修复它,但不能同时保持随机分散产卵点,我喜欢。你知道吗

有人能给点建议吗?我省略了不相关的代码,所以没有太多要筛选的内容。你知道吗

class Pokemon(pygame.sprite.Sprite):
    def __init__(self, name, health, speed, attack, typeOf, typeOf2, level, order):
        pygame.sprite.Sprite.__init__(self)
        self.order = order
        self.image = pygame.image.load('C:/Users/#/#/#/pygames/tower_defense/Distributable/images/POKEMON/%sright.png'%(name))

        self.rect = self.image.get_rect()
        # X/Y axis locations
        self.rect.centerx = 0-self.rect.width - self.order*100
        self.rect.centery = random.randint(500, 540)

然后创建块-

for e in range(numberOfEnemies):
    poke = random.randint(1, 2)
    if poke == 1:
        level = random.randint(2, 5)
        Pidgey = Pokemon('Pidgey', 15, 2, 5, 'Normal', 'Flying', level, e)
        enemies.append(Pidgey)
        enemy_sprites.add(Pidgey)
    else:
        level = random.randint(2, 4)
        Rattata = Pokemon('Rattata', 13, 3, 5, 'Normal', None, level, e)
        enemies.append(Rattata)
        enemy_sprites.add(Rattata)
    enemyNumber += 1

Tags: rectimageselfinitorderrandomlevelpygame
1条回答
网友
1楼 · 发布于 2024-06-30 12:51:28

如果需要控制精灵的层,可以使用^{}精灵组。精灵需要self._layer属性,或者您可以在add将精灵传递给组时传递层,例如:

layered_group.add(sprite, layer=desired_layer)

移动精灵时,可以调用精灵组的change_layer方法:

layered_group.change_layer(sprite, sprite.rect.bottom)

但是,如果必须在每一帧更新所有精灵的层,则按精灵的rect.bottom位置对其进行排序、遍历列表并对其进行blit将更有效:

blit = screen.blit  # Local variable to improve the performance.
for sprite in sorted(all_sprites, key=lambda spr: spr.rect.bottom):
    blit(sprite.image, sprite.rect)

相关问题 更多 >