2017-12-04 32 views
0

저는 현재 마스크와 collide_rect 함수를 사용하여 퐁볼과 플레이어의 패들 사이의 완벽한 충돌을하려고합니다. 나는 완벽한 완벽한 충돌을 검사 할 pong 클래스에서 자체 checkCollision 함수를 만들었습니다. 그러나 지금은 "Pong 객체가 반복 가능하지 않기 때문에 Sprite가 작동하거나 화면에 표시되지 않습니다."회전 된 개체와 스프라이트가 나타나고 충돌하는 문제가 발생합니다. 파이 게임 객체가 반복 가능하지 않습니다

다음은 중요한 기능이 포함 된 내 pong 클래스입니다.

데프 주() :. 내 PlayerPaddle 클래스에서)

class Pong(pygame.sprite.Sprite): 

    def __init__(self, screensize): 

     pygame.sprite.Sprite.__init__(self) 

     self.screensize = screensize 

     self.centerx = screensize[0] // 2 
     self.centery = screensize[1] // 2 
     self.radius = 25 
     self.rect = pygame.Rect(self.centerx-self.radius, 
           self.centery-self.radius, 
           self.radius*2, self.radius*2) 

     self.pokeimage = pygame.image.load("pokeball.png") 
     self.pokeimage = pygame.transform.scale(self.pokeimage, (self.radius, self.radius)) 

     #Create the mask 
     self.mask = pygame.mask.from_surface(self.pokeimage) 

    def checkCollision(self, player_paddle, ai_paddle): 

     col = pygame.sprite.collide_rect(self, player_paddle) 

     return col 

    def collisionFormula(self, player_paddle, ai_paddle): 

     if self.checkCollision(self, player_paddle): 

    def collision_checks(self, player_paddle, ai_paddle): 

     #if the ball hits the top or bottom of the screen, change the y direction 
     if self.rect.top <= 0 or self.rect.bottom >= self.screensize[1] - 1: 
      self.direction[1] *= -1 

     #if the pong hits the paddles, change how the pong ball moves 
     if self.rect.colliderect(player_paddle.rect) or self.rect.colliderect(ai_paddle.rect): 
      self.collisionFormula(player_paddle, ai_paddle) 

    def update(self, player_paddle, ai_paddle): 

     self.update_ball_position() 
     self.reset_ball() 
     self.collision_checks(player_paddle, ai_paddle) 

필요, 나는 나의 주요 기능은 여기

class PlayerPaddle(pygame.sprite.Sprite): 
    def __init__(self, screensize): 

     pygame.sprite.Sprite.__init__(self) 
     self.screensize = screensize 

     self.centerx = 50 
     self.centery = screensize[1]//2 

     self.height = 100 
     self.width = 20 
     self.imageMaster = pygame.image.load("naruto.png").convert_alpha() 
     self.imageMaster = pygame.transform.scale(self.imageMaster, (self.width, self.height)) 
     self.image = self.imageMaster 

     #mask 
     self.mask = pygame.mask.from_surface(self.image) 


    def turnLeft(self): 
     self.dir += 45 
     if self.dir > 360: 
      self.dir = 45 

    def turnRight(self): 
     self.dir -= 45 
     if self.dir < 0: 
      self.dir = 315 
    def update(self): 
     #Rotate functions 
     oldCenter = self.rect.center 
     self.image = pygame.transform.rotate(self.imageMaster, self.dir) 
     self.rect = self.image.get_rect() 
     self.rect.center = oldCenter 

을 같은 마스크 초기화를 그리고pygame.init는()

screensize = (640,700) 
screen = pygame.display.set_mode(screensize) 

background = pygame.Surface(screen.get_size()) 
background.fill((0, 255, 0)) 

clock = pygame.time.Clock() 

pong = Pong(screensize) 
player_paddle = PlayerPaddle(screensize) 
ai_paddle = AIPaddle(screensize) 


paddleSprite = pygame.sprite.Group(player_paddle) 
pongSprite = pygame.sprite.Group(pong) 

while running: 
    running = True 

     #object updating phase 
     ai_paddle.update(pong, player_paddle) 
     player_paddle.update() 
     pong.update(player_paddle, ai_paddle) 

     if pygame.sprite.spritecollide(player_paddle, pong, False, pygame.sprite.collide_mask): 
      print("Collided") 



    #rendering phase 
     ai_paddle.render(screen) 
     player_paddle.render(screen) 
     pong.render(screen) 

     paddleSprite.clear(screen, background) 
     paddleSprite.update() 
     paddleSprite.draw(screen) 

     pongSprite.clear(screen,background) 
     pongSprite.update() 
     pongSprite.draw(screen) 

     pygame.display.flip() 

    pygame.quit() 


main() 

나는이 "그룹"오브젝트 (퐁과 player_paddle)을했지만 나는 심지어 프로그램을 실행하는 데 실패하고있어 이유를 모르겠어요. 또한, 퐁 공이 원래 이미지의 사각형을 칠 수는 있지만 회전 된 이미지는 표시하지 않으므로 충돌이 작동하지 않는다는 것을 알고 있습니다. 그러나 스프라이트 함수를 사용하면 왜 그런 일이 일어날 지 잘 모르겠습니다. 감사. spritecollide

Find sprites in a group that intersect another sprite.
spritecollide(sprite, group, dokill, collided = None) -> Sprite_list

두 번째 인수에 대한

+0

은 전체 오류 메시지 (Traceback)를 문제의 텍스트로 표시합니다 (스크린 샷이 아님). 다른 유용한 정보가 있습니다. 즉. 어떤 코드 행이 문제가되는지를 보여줍니다. – furas

+0

안녕하세요, 오류가 반환됩니다 [충돌하는 경우 그룹에 s (스프라이트,들)] TypeError : 'Pong'객체가 반복 가능하지 않습니다 – turtlefish12

+0

QUESTION에 항상 FULL 오류가 발생했습니다. 더 읽기 쉬울 것입니다. – furas

답변

0

읽기 문서는 그룹 (pygame.sprite.Group)가 아닌 하나의 스프라이트에게이어야한다.

하나의 스프라이트로 그룹 이벤트가 될 수 있습니다. 하지만 그룹이 아닌 단일 스프라이트 인 pong을 사용합니다.


참조 설명서 collide_mask

Collision detection between two sprites, using masks.
collide_mask(SpriteLeft, SpriteRight) -> point

것은 마스크를 사용하여 두 스프라이트 사이의 충돌을 검사합니다.


편집 : 코드에서 당신은 pong 단일 Sprite하지 Group입니다

spritecollide(player_paddle, pong,...) 

때문에에 문제가 있습니다.

pong하면 당신은 BTW Group

spritecollide(player_paddle, pongSprite,...)` 

spritecollidepongSprite와 함께 사용할 수있는 collide_mask

collide_mask(player_paddle, pong) 

를 사용한다 : 당신은 더 나은 이름 즉, 사용할 수 있습니다. pongSprite 대신 pong_group입니다.
결국 pong 대신 pong_sprite이됩니다 (단 pong도 괜찮습니다).