2011-09-06 28 views
1

我修改了pygame的Chimp例子,用圓圈和一條線代替了Chimp圖片,使用從圓圈中心繪製的繪製方法,還用一個10×10的黑色框代替了拳頭表面。pygame spritegroups需要的幫助

我的問題是這樣的。

當黑框(拳頭)拳打圓(黑猩猩),圓(黑猩猩)必須旋轉360度。它適用於在chimp類中描述的單個圓形精靈,但是當我創建多個精靈並將它們添加到sprite.group中時,只有創建的第一個精靈旋轉,而另一個圓形(Chimp)精靈不會'沒有迴應。任何人都可以請告訴我如何解決這個問題。我使用python的3倍和1.9的Pygame

#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

這不是問題的原因,我想,但'fistsprite = pygame.sprite.Group((fist))'與'fistsprite = pygame.sprite.Group(fist)'是一樣的。如果你想傳遞一個元組,請說'fistsprite = pygame.sprite.Group((fist,))'。 –

回答

1

答案在於punch方法:

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

屬性self.punching設置爲1的第一個黑猩猩。對於所有其它的,則不再執行該塊,因爲self.punching已經是1

嘗試撤消縮進的最後兩行,而不是:

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

雖然這增加了新的「功能」,你可以衝再次衝壓之前。