2010-09-16 9 views
3

J'ai une fonction qui charge une feuille de sprite, trouve un bloc de sprites, puis met chaque sprite dans une liste. Avant d'ajouter un sprite dans la liste, il va le faire apparaître sur l'écran. Une fois le chargement des sprites terminé, il parcourra alors la liste, en mélangeant chaque sprite au fur et à mesure. Les deux ensembles de blocs doivent être identiques à, mais le premier sprite est supprimé de la liste et le dernier est dupliqué. Les deux ensembles de blits ressemblent à ceci:une liste de sprites pygame perd son premier élément, et gagne un doublon de la dernière

alt text

Chaque sprite est blittée dans l'ordre qu'il a été ajouté à la liste, de gauche à droite, de haut en bas, de sorte que le premier sprite est en haut à gauche un, et le dernier est en bas à droite.

Voici la fonction qui charge les sprites:

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 

Tout le monde voir comment je vissant la liste des?

+0

Voyez ce qui est réellement à l'intérieur des 'sprites'. – SilentGhost

+0

@SilentGhost: Ils s'affichent de la même manière que dans l'image, juste un à la fois. – Max

+0

Un code autonome (+ un lien vers le fichier png source) peut s'avérer utile. – tokland

Répondre

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

Vous n'êtes pas réinitialisée image chaque fois autour de la boucle, il est toujours la même surface que vous avez utilisé dans l'itération précédente, une surface qui est déjà dans la liste. Chaque fois que vous bouclez la boucle, vous écrasez l'image-objet que vous avez ajoutée à la liste à l'étape précédente.

Je suggère d'attraper un nouveau image= pygame.Surface((35,35)) juste avant la ligne au lieu d'avant le début de la boucle. Essayez l'affichage de mise à jour après chaque blit pour le second jeu.

+0

C'était tout. Merci de votre aide. – Max