2013-06-27 4 views
0

Bonjour les gars, je viens à vous encore besoin d'aide. Aujourd'hui je travaillais avec des sprites et faisais un système qui hacherait une feuille de sprites et mettrait toutes les tranches dans une liste avec python et pygame. Le problème vient quand je veux passer cette liste dans une classe de lutin pour la mettre à jour et prendre dans le mouvement de joueur. quand je tente de gérer mon code dans Idel il me dit,sprite_sheet système en python et pygame

slef.image = sprites[frame] 
    TypeError: 'Group' object does not support indexing 

et je ne sais pas comment je peux obtenir ce fonctionne correctement.

Voici le système que j'utilise pour couper la feuille de sprite jusqu'à:

class sprite_system(object): 
    def slice_sheet(self,sprite_sheet,sprite_start_x,sprite_start_y,sprite_size_x,sprite_size_y,sheet_frames): 
     frame = [] 
     sheet_start = 1 
     frame_pos = 0 
     sprite_start_x_base = sprite_size_x 
     while sheet_start <= sheet_frames: 
      sheet = sprite_sheet 
      sheet.set_clip(pygame.Rect(sprite_start_x,sprite_start_y,sprite_size_x,sprite_size_y)) 
      sprite_clip = sheet.subsurface(sheet.get_clip()) 
      frame.append(sprite_clip) 
      sprite_start_x += sprite_start_x_base 
      sheet_start += 1 
     return frame 

Voici le système que j'utilise pour faire et mettre à jour l'image-objet:

class player(pygame.sprite.Sprite): 
    def __init__ (self,sprites,*groups): 
     super(player,self).__init__(*groups) 
     frame = 0 
     slef.image = sprites[frame] 
     self.rect = pygame.rect.Rect((320,240),sprites.get_size()) 
    def update(self): 
     key = pygame.key.get_pressed() 
     if key[pygame.K_LEFT]: 
      self.rect.x -= 10 
      frame += 1 
     if key[pygame.K_RIGHT]: 
      self.rect.x += 10 
      frame += 1 
     if key[pygame.K_UP]: 
      self.rect.y -= 10 
      frame += 1 
     if key[pygame.K_DOWN]: 
      self.rect.y += 10 
      frame += 1 
     if frame > 3: 
      frame = 0 

Et enfin la boucle principale du jeu J'utilise pour mettre tout cela ensemble:

class Game(object): 
    def main(self, screen): 

     sprite = pygame.image.load('test.png') 
     image = sprite_system().slice_sheet(sprite,0,0,64,64,4) 
     sprites = pygame.sprite.Group() 
     self.player = player(sprites) 
     while 1: 
      for event in pygame.event.get(): 
       if event.type == pygame.QUIT: 
        return 
       if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: 
        return 

      screen.fill((200, 200, 200)) 

      sprites.update() 
      sprites.draw(screen) 
      pygame.display.flip() 

if __name__ == '__main__': 
    pygame.init() 
    screen = pygame.display.set_mode((640, 480)) 
    Game().main(screen)   

J'espère que tout cela est suffisant pour obtenir de l'aide et si vous avez besoin de savoir quoi que ce soit d'autre id être heureux de vous aider grâce ~ Eddy

+0

Voir aussi ce démo d'animation spritesheet: http://www.pygame.org/wiki/Spritesheet?parent=CookBook – ninMonkey

Répondre

0

Je pense que vous devriez changer quelques noms, parce que vous utilisez un spritesframes pour la même chose. Aussi vous avez le mot slef au lieu de self.

Je propose ce qui suit:

class Player(pygame.sprite.Sprite): 
    def __init__ (self, frames, *groups): 
     super(player,self).__init__(*groups) 
     frame = 0 
     self.image = frames[frame] 
     ... 


class Game(object): 

    def main(self, screen): 
     sprite = pygame.image.load('test.png') 
     frames = sprite_system().slice_sheet(sprite,0,0,64,64,4) 
     sprites = pygame.sprite.Group() 
     self.player = Player(frames, sprites) 
     ... 

Notes:

  • changé player classe au capital P Player (standard pour les classes Python)
  • Changé le premier argument de joueur aux cadres
  • Changé la variable qui reçoit la feuille de découpe à frames
  • Ajout de frames à la création Player.

Mise à jour

En ce qui concerne l'obtenir des commentaires, vous devez garder la collection cadres comme un attribut de joueur, de sorte que vous pouvez changer le cadre de la méthode mise à jour():

class Player(pygame.sprite.Sprite): 
    def __init__ (self, frames, *groups): 
     super(player,self).__init__(*groups) 
     self.frame = 0 
     self.frames = frames 
     ... 

    def update(self): 
     ... # code to select the current frame 

     self.frame = frame 
     self.image = self.frames[self.frame] 
+0

tout cela a fonctionné, mais quand je veux faire défiler mes images, il ne jouera que la première image. Je pense que c'est parce que le cadre est à 0 à chaque fois qu'il est appelé, mais je ne sais pas d'autre moyen de le faire des conseils? – IdecEddy

+0

Salut @IdecEddy J'ai mis à jour la réponse. – pmoleri