我有一个函数可以加载一个 sprite 表,找到一个 sprite block ,然后将每个单独的 sprite 放入一个列表中。在将 sprite 添加到列表中之前,它会将其 blit 到屏幕上。一旦完成加载 Sprite ,它就会遍历列表,在每个 Sprite 运行时进行 blit。两组 blits 应该相同,但第一个 Sprite 从列表中删除,最后一个 Sprite 被复制。两组 blit 看起来像这样:
每个 sprite 都按照它添加到列表中的顺序进行 blit,从左到右,从上到下,所以第一个 sprite 在左上角,最后一个在右下角。
这是加载 Sprite 的函数:
def assembleSprites(name, screen):
"""Given a character name, this function will return a list of all that
character's sprites. This is used to populate the global variable spriteSets"""
spriteSize = (35, 35)
spritesheet = pygame.image.load("./images/patchconsprites.png")
sprites = []
start = charCoords[name]
char = list(start)
image = pygame.Surface((35,35))
# load each sprite and blit them as they're added to the list
for y in range(5):
char[0] = start[0]
for x in range(9):
rect = (char[0], char[1], char[0]+spriteSize[0], char[1]+spriteSize[1])
image.blit(spritesheet, (0,0), rect)
image = image.convert()
colorkey = image.get_at((0,0))
image.set_colorkey(colorkey, RLEACCEL)
screen.blit(image, (x*40, y*40))
pygame.display.update()
sprites.append(image)
char[0] += spriteSize[0]+2
char[1] += spriteSize[1]+2
# check that the list was constructed correctly
count = 0
for y in range(6,11):
for x in range(9):
screen.blit(sprites[count], (x*40,y*40))
count += 1
pygame.display.update()
return sprites
有人看到我是如何搞砸列表的吗?
最佳答案
image.blit(spritesheet, (0,0), rect)
你没有在每次循环中重新初始化 image
,它仍然是你在上一次迭代中使用的相同表面,一个已经在列表中的表面。每次循环都会覆盖您在上一步中附加到列表中的 Sprite 。
我建议在该行之前而不是在循环开始之前抓取一个新的 image= pygame.Surface((35,35))
。
关于python - 一个 pygame Sprite 列表丢失了它的第一个元素,并获得了最后一个元素的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3729648/