2011-09-06 5 views
1

J'ai modifié l'exemple de chimp pygame en remplaçant l'image Chimp par le cercle et une ligne en utilisant la méthode de tirage au centre du cercle et en remplaçant le poing par une boîte noire de 10 x 10 surface.Aide nécessaire avec les groupes de sprites de pygame

Mon problème est le suivant.

Lorsque la boîte noire (poing) frappe le cercle (chimpanzé), le cercle (chimpanzé) doit tourner de 360 ​​degrés. Cela fonctionne bien pour un sprite de cercle unique qui est décrit dans la classe de chimp, mais quand je crée plus d'un sprite et les ajoute à un sprite.group seul le premier sprite créé tourne mais l'autre cercle (Chimp) sprites don ' t répondre. Quelqu'un peut-il s'il vous plaît dites-moi comment résoudre ce problème. J'utilise python 3x et Pygame 1,9

#Import Modules 
    import os, pygame 
    from pygame.locals import * 
    from pygame.compat import geterror 
    import random 

    def load_image(x=40,y=40,r=0,g=0,b=0): 
     image = pygame.Surface((x,y)) 
     image.fill((r,g,b)) 
     pygame.draw.circle(image,(r,g,255),(20,20),10) 
     pygame.draw.line(image,(r,255,b),(20,20),(30,30),2) 
     image = image.convert() 
     image.set_colorkey((255,0,0)) 
     return image, image.get_rect() 
    class Fist(pygame.sprite.Sprite): 
     def __init__(self): 
      pygame.sprite.Sprite.__init__(self) 
      self.image,self.rect = load_image(x=10,y=10) 
      self.punching = 0 

     def update(self): 
      pos = pygame.mouse.get_pos() 
      self.rect.midtop = pos 
      if self.punching: 
       self.rect.move_ip(5,10) 

     def punch(self,target) : 
      if not self.punching: 
       self.punching = 1 
       hitbox = self.rect.inflate(-5,-5) 
       return hitbox.colliderect(target.rect) 

     def unpunch(self): 
       self.punching = 0 

    class Chimp (pygame.sprite.Sprite): 

     def __init__(self): 
      pygame.sprite.Sprite.__init__(self) 
      self.image,self.rect = load_image(r=255) 
      screen = pygame.display.get_surface() 
      self.area = screen.get_rect() 
      self.rect.topleft = random.randint(0,300),random.randint(0,300) 
      self.move = 0 
      self.dizzy = 0 
     def update(self): 
      if self.dizzy: 
        self._spin() 
      else: 
        self._walk() 
     def _walk(self): 
      newpos = self.rect.move((self.move,0)) 
      if self.rect.left < self.area.left or self.rect.right > self.area.right: 
        self.move = -self.move 
        newpos = self.rect.move((self.move,0)) 
      self.rect = newpos 
     def _spin(self) : 
      center = self.rect.center 
      self.dizzy = self.dizzy + 6 
      if self.dizzy >= 360: 
        self.dizzy = 0 
        self.image = self.original 
      else : 
        rotate = pygame.transform.rotate 
        self.image = rotate(self.original,self.dizzy) 
      self.rect = self.image.get_rect(center=center) 

     def punched(self): 
      if not self.dizzy: 
        self.dizzy = 1 
        self.original = self.image 

    def main(): 

     pygame.init() 
     screen = pygame.display.set_mode((640,480)) 

     background = pygame.Surface(screen.get_size()) 
     background = background.convert() 
     background.fill((250,250,250)) 

     screen.blit(background,(0,0)) 
     pygame.display.flip() 

     clock = pygame.time.Clock() 

     fist = Fist() 
     allsprites = pygame.sprite.Group() 
     for i in range(10): 
      chimp = Chimp() 
      allsprites.add(chimp) 
     fistsprite = pygame.sprite.Group((fist)) 
     going = True 
     while going: 
      clock.tick(60) 

      for event in pygame.event.get(): 
        if event.type == QUIT: 
         going = False 
        elif event.type == MOUSEBUTTONDOWN: 
         for chimp in allsprites.sprites: 
          if fist.punch(chimp): 
           chimp.punched() 

        elif event.type == MOUSEBUTTONUP: 
         fist.unpunch() 

      allsprites.update() 
      fistsprite.update() 

      screen.blit(background,(0,0)) 
      allsprites.draw(screen) 
      fistsprite.draw(screen) 
      pygame.display.flip() 
     pygame.quit() 

    if __name__ == '__main__': 
     main() 
+0

Ce n'est pas la cause du problème, je suppose, mais 'fistsprite = pygame.sprite.Group ((fist))' est le même que 'fistsprite = pygame.sprite.Group (fist)'. Si vous voulez passer un tuple, dites 'fistsprite = pygame.sprite.Group ((fist,))'. –

Répondre

1

La réponse réside dans la méthode punch:

def punch(self,target) : 
    if not self.punching: 
     self.punching = 1 
     hitbox = self.rect.inflate(-5,-5) 
     return hitbox.colliderect(target.rect) 

L'attribut self.punching est défini sur 1 pour le premier chimpanzé. Pour tous les autres, le bloc ne sera exécuté plus, puisque self.punching est déjà 1.

Essayez désindendation les deux dernières lignes à la place:

def punch(self,target) : 
    if not self.punching: 
     self.punching = 1 
    hitbox = self.rect.inflate(-5,-5) 
    return hitbox.colliderect(target.rect) 

Bien que cela ajoute la nouvelle « fonction » que vous pouvez frapper encore une fois avant que le coup de poing a été débouché.