Нужна помощь с спрайт-группами Pygame

1

Я изменил пример Pygame Chimp, заменив изображение Chimp кружком и линией, используя метод draw, извлеченный из центра круга, а также заменив кулак на поверхность размером 10 на 10 черных ящиков.

Моя проблема в этом.

Когда черный ящик (кулак) пробивает круг (шимпанзе), круг (шимпанзе) должен вращаться на 360 градусов. Он отлично работает для спрайта с одним кругом, который описан в классе шимпанзеров, но когда я создаю более одного спрайта и добавляю его в sprite.group, только первый созданный спрайт вращается, но другой круг (Chimp) t ответ. Может кто-нибудь, пожалуйста, скажите мне, как решить эту проблему. Я использую python 3x и 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
    Думаю, это не является причиной проблемы, но fistsprite = pygame.sprite.Group((fist)) - это то же самое, что fistsprite = pygame.sprite.Group(fist) . Если вы хотите передать кортеж, скажите fistsprite = pygame.sprite.Group((fist, )) .
Теги:
pygame
sprite

1 ответ

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)

Хотя это добавляет новую "особенность", которую вы можете пробивать снова, пока удар не был запущен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню