2016-11-30 1 views
0

2 개의 스프라이트가 충돌 할 때마다 점수가 1 씩 증가해야하는 게임을 만들고 있습니다. 지금은 점수가 0으로 시작되고 충돌이 발생하면 39로 증가합니다 (때로는 27입니다. 숫자의 변동성으로 인해 초 단위로 증가한다고 생각합니다). 여기에 다른 답변을 읽어 주시면 내가 가지고있는 곳의 문제 일 가능성이 높습니다.Python PyGame 점수 카운터가 1 대신 1 씩 증가합니다.

t = f.render("Score = " + str(score), False, black) 
screen.blit(t, (0,0)) 

for for 루프에 있습니다. 하지만 다른 곳으로 옮기려고했는데 점수가 화면에 전혀 나타나지 않습니다. 여기

class Tub(Sprite): 
    def __init__(self): 
     Sprite.__init__(self) 
     self.image = image.load("tub.bmp").convert_alpha() 
     self.image = transform.scale(self.image, (100, 100)) 
     self.rect = self.image.get_rect() 
     self.rect.x = width/2 
     self.rect.y = height - 100  
    def movement(self): 
     keys = pygame.key.get_pressed() 
     dist = 5 
     if keys [pygame.K_LEFT]: 
      self.rect.x -= dist 
     if keys [pygame.K_RIGHT]: 
      self.rect.x += dist 
    def hit(self, target): 
     return self.rect.colliderect(target) 

class Singlescoop_pink(Sprite): 
    def __init__(self): 
     Sprite.__init__(self) 
     self.image = image.load("singlescoop_pink.bmp").convert_alpha() 
     self.image = transform.scale(self.image, (100, 100)) 
     self.rect = self.image.get_rect() 
     self.rect.x = random.randint(0, width-100) #random x position, minus 100 so image does not go off screen 
     self.rect.y = -600 #start off screen so starting point to fall down is not visible 
    def movement(self): 
     self.rect.y += 5 
     if self.rect.y > height: 
      self.kill() 


tub = Tub() 
sspink = Singlescoop_pink() 
sprites = pygame.sprite.RenderPlain(tub, sspink) 
score = 0 

def game_loop(): 

    gameExit = False 
    while not gameExit: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       quit() 
       sys.exit() 

     if tub.hit(sspink): 
      sspink.kill() 
      global score 
      score += 1 

     tub.movement() 
     sspink.movement() 
     screen.fill(white) 
     t = f.render("Score = " + str(score), False, black) 
     screen.blit(t, (0,0)) 
     sprites.update() 
     sprites.draw(screen) 
     display.update() 
     clock.tick(60) 

game_loop() 
+2

하지만 사용 파이 게임을를 havent : 우리가 처음에 다음과 같이 우리의 그룹을 구성하는 경우

는 사실, 당신은 더 이상 (우리가 그것을 멀리 추상화) 모두에서 sspink 필요가 없습니다 전에는 충돌을 어떻게 처리하는지 모르겠지만 초를 늘리는 것과 관련이 없을 수도 있지만 스프라이트가 둘 이상의 프레임에 대해 접촉하고있을 수 있습니다.게임이 60fps로 실행되는 경우 기본 게임 루프가 초당 60 회 실행되므로 스프라이트가 여러 프레임에 걸쳐 접촉하여 초당 여러 번 점수를 증가시킬 수 있습니다. – RichSmith

+0

정확히 문제였습니다. 고맙습니다! – Zanne

답변

2

먼저, 당신은 단지 updatemovement 기능의 이름을 바꿀 수 있습니다 점수를 만들어 내 코드의 일부이며, 그들은 sprites.update()에 의해 호출됩니다.

Sprite에서 kill을 호출하면 마술처럼 게임에서 제거되지 않는다는 것을 알아야합니다. 모든 스프라이트 그룹에서 제거됩니다. sspink.kill()으로 전화를 걸었지만 해당 개체는 여전히 sspink 변수에 있습니다.

그리고 sspink.movement()을 호출했기 때문에 여전히 이동하고 (메인 루프의 반복마다 다른 스프라이트와 충돌합니다). 스프라이트 그룹 (sprites.draw(screen))으로 그리기를 처리하고 sspink이 그룹에서 제거 되었기 때문에 화면에는 그려지지 않습니다.

떨어지는 블록에 대한 새로운 스프라이트 그룹 만들기 : 다음

blocks = pygame.sprite.RenderPlain(sspink) 

을 대신 사실 (충돌를 확인하기 위해 tub.hit(sspink)를 호출, 단지 제거

당신이해야 할 것은이 다음과 같다 hit 기능)를 사용 파이 게임의 pygame.sprite.spritecollide 기능 :이 기능은 콜리스에 대한

global score 
score += len(pygame.sprite.spritecollide(tub, blocks, True)) 

확인합니다 이온이 tub 사이에 있고 blocks 그룹에있는 스프라이트가 있고 충돌이있는 경우 해당 그룹의 스프라이트를 죽인 다음 tub과 충돌 한 스프라이트를 반환합니다.

그래서 우리는 얼마나 많은 블록이 충돌했는지 계산합니다 (현재는 최대 1 개이지만 미래 보장형이됩니다). 그리고 그 숫자를 점수에 추가하십시오.

spritecollide은 스프라이트를 죽이므로 더 이상 blocks 그룹에 없기 때문에 충돌 확인을 한 번만 수행합니다. 또한 그룹이 더 이상 sprites 그룹에 없기 때문에 업데이트되거나 화면에 그려지지 않습니다. 내가 전에 몇 가지 게임 프로그래밍을 한 적이

blocks = pygame.sprite.RenderPlain(Singlescoop_pink()) 
sprites = pygame.sprite.RenderPlain(tub, *blocks) 
+0

매우 자세한 설명과 다른 PyGame 팁을 보내 주셔서 감사합니다. 이것은 내 점수 문제를 해결했습니다. 고맙습니다!! – Zanne

관련 문제