我查看了文档并尝试在线查找示例,但我没有设法将我的精灵分层。以下是代码的一部分:
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self, self.groups)
...
self.layer = 2
class Tree(pygame.sprite.Sprite):
def __init__(self, screen_size, tree_id):
pygame.sprite.Sprite.__init__(self, self.groups)
...
self.layer = 1
pygame.init()
...
sprites = pygame.sprite.LayeredUpdates()
players = pygame.sprite.LayeredUpdates()
trees = pygame.sprite.LayeredUpdates()
Player.groups = sprites, players
Tree.groups = sprites, trees
...
mario = Player()
nbtrees = 10
[Tree(size, x) for x in range(1,nbtrees+1)]
while 1:
...
sprites.clear(screen,background)
sprites.draw(screen)
pygame.display.flip()
我删除了不相关的部分,事件处理,碰撞检测等。问题是,它的工作非常精细;例如,使用组trees
进行的碰撞管理顺利进行,这似乎表明这些组是正常的。唯一的问题是:无论我在Player
的{{1}}和Tree
类中设置的值是什么,树木(所有树木)总是在玩家上方点亮。
documentation表示指定图层的几种方法,包括以下内容: “如果你添加的精灵有一个属性层,那么将使用该层。” 这正是我所做的,没有成功。
请注意,我并没有将精灵“添加”到组中;我将这些组分配给我的精灵类,因为这就是我以前用self.layer
做的事情,这很方便而且通常都是相同的。我尝试使用组的pygame.sprite.Group()
方法,但它没有改变任何内容。
我想也许我没有正确地初始化组,但奇怪的是一切都有效,除了分层。我非常感谢一些有用的例子。
答案 0 :(得分:2)
自己花了一些时间与pygame.sprite.LayeredUpdates()一起工作。
我知道这很晚了,但是当我想弄清楚如何自己使用它时,我看到了这篇文章。我解决了这个问题,想回答这个问题,希望对下一个家伙有所帮助。
精灵中的属性必须命名为 self._layer 而不是self.layer。注意名称中的下划线。
这不是我所期望的,文档中说“如果添加的精灵具有一个属性层,则将使用该层”,它实际上并没有告诉您属性的正确名称,但似乎建议您使用它会是“层”,尽管不是。
如果使用 self._layer ,则子画面图层将按预期方式工作,而不必通过add()调用。
在您的代码中,您需要:
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self, self.groups)
...
self._layer = 2
class Tree(pygame.sprite.Sprite):
def __init__(self, screen_size, tree_id):
pygame.sprite.Sprite.__init__(self, self.groups)
...
self._layer = 1
它应该可以工作。
编辑:
我刚刚在pygame.sprite.LayeredUpdates docs中对此进行了更正,因此人们可能不再需要到这里寻找答案了。
答案 1 :(得分:1)
我的一个程序遇到了同样的问题。我不知道为什么但精灵组无法识别图层属性。我的解决方案是使用关键字参数将图层传递给group.add()方法,如下所示:
class player(pygame.sprite.Sprite):
layer = 1
def __init__ (self):
pygame.sprire.Sprite.__init__(self)
sprites.add(self, layer = self.layer)
为方便起见,我想在 init 方法中为一个组添加一个精灵。
我认为没有必要让多个小组进行分层。绘制一个组更方便,LayeredUpdate组将负责所有分层。