Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用pygame动态控制精灵blit顺序_Python_Pygame - Fatal编程技术网

Python 用pygame动态控制精灵blit顺序

Python 用pygame动态控制精灵blit顺序,python,pygame,Python,Pygame,我现在正在写一个塔防游戏。一切正常,但有一个视觉问题困扰着我 基本上,一个具有较低的rect.y且在地图上应该较高的精灵可以在具有较高rect.y的较慢怪物后面通过,可以在前景精灵后面(因此在前面)闪烁 我可以修复它,但不能同时保持随机分散的产卵点,我喜欢 有人能给我提些建议吗?我省略了不相关的代码,所以没有太多要筛选的内容 class Pokemon(pygame.sprite.Sprite): def __init__(self, name, health, speed, attac

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

基本上,一个具有较低的
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

如果需要控制精灵的层,可以使用精灵组。精灵需要一个
self.\u layer
属性,或者当您
将精灵添加到组中时,您可以传递该层,例如:

layered_group.add(sprite, layer=desired_layer)
移动精灵时,可以调用精灵组的
change\u 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)

我不是100%确定你想要实现什么,但听起来你可以使用一个精灵小组。我认为精灵需要一个
self.\u层
属性IIRC。如果你把它们放在列表中,那么使用
sort()/sorted()
key=
一起使用
rect.y
。我查看了
layeredUpdates()
,这正是我所需要的。再次感谢!