2010-09-16 1 views
3

У меня есть функция, которая загружает лист спрайтов, находит блок спрайтов и затем помещает каждый отдельный спрайт в список. Прежде чем он добавит спрайт в список, он будет блистерить его на экране. После того, как это будет сделано при загрузке спрайтов, он будет перебираться по списку, blitting каждый спрайт по мере его поступления. Два набора близок должны быть быть идентичными, но вместо этого первый спрайт отбрасывается из списка, а последний спрайт дублируется. Два набора БЛИЦ выглядеть следующим образом:список спрайтов pygame теряет свой первый элемент и получает дубликат последнего

alt text

Каждый спрайт выведено в порядке, он был добавленным к списку, идя слева направо, сверху вниз, так что первый спрайт верхний левый один, а последний - нижний правый.

Вот функция, которая загружает спрайтов:

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 

Кто-нибудь видел, как я завинчивания список вверх?

+0

попробуйте обновить дисплей после каждого blit для второго набора. Посмотрите, что на самом деле находится внутри 'спрайтов'. – SilentGhost

+0

@SilentGhost: они отображаются так же, как на картинке, только по одному. – Max

+0

Автономный код (+ ссылка на исходный файл png) может пригодиться. – tokland

ответ

7
image.blit(spritesheet, (0,0), rect) 

Вы не инициализирован заново image каждый раз вокруг петли, это все та же поверхность вы использовали в предыдущей итерации, поверхность, которая уже есть в списке. Каждый раз в цикле вы перезаписываете спрайт, который вы добавили в список на предыдущем шаге.

Я предлагаю захватить новый image= pygame.Surface((35,35)) непосредственно перед линией, а не перед началом цикла.

+0

Вот и все. Спасибо за вашу помощь. – Max