2016-11-30 72 views
0

我正在創建一個遊戲,每當2個精靈發生碰撞時分數應該增加1。現在分數顯示爲0開始,然後一旦發生碰撞,它會增加到39(有時候是27。數字的變化使我認爲它是以秒爲單位遞增的)。在這裏閱讀一些其他答案讓我意識到這很可能是我的問題Python PyGame分數計數器以秒爲單位遞增而不是1

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

位於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

我之前做了一些遊戲編程,但我還沒有使用pygame的所以我不確定你是如何處理碰撞的,但它可能不是增加秒數,但可能是精靈在多個幀中接觸?請記住,如果您的遊戲運行速度爲60 fps,則它將以每秒60次的速度運行主遊戲循環,因此您的精靈可能會接觸到多個幀,每秒會多次增加分數。 – RichSmith

+0

完全是問題。謝謝! – Zanne

回答

2

首先,請注意,你可以重命名movement功能update的一部分,他們將sprites.update()被調用。

您必須明白,當您撥打kill上的Sprite時,它不會奇蹟般地從您的遊戲中刪除。它將從它的所有精靈組中刪除。您可以撥打sspink.kill(),但該對象仍然存在,生活在sspink變量中。

並且由於您調用sspink.movement(),它仍然會移動(並在主循環的每次迭代中與您的其他精靈發生衝突)。但它不會被繪製到屏幕上,因爲您使用Sprite組處理繪圖(sprites.draw(screen)),並且sspink已從該組中移除。

你應該做的是:

創建下跌塊新的精靈羣體:

blocks = pygame.sprite.RenderPlain(sspink) 

然後,而不是調用tub.hit(sspink)檢查衝突(其實只是刪除該hit功能),使用pygame中的pygame.sprite.spritecollide功能:

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

此功能將檢查科利斯tubblocks組中的精靈之間的離子,如果發生碰撞,則殺死該組中的精靈,然後返回與tub相沖突的精靈。因此,我們只是計算有多少塊相撞(目前最多隻有一塊,但我們可以預見未來),並將該數字添加到分數中。

由於spritecollide殺死了精靈,因此blocks組中不再存在,因此它們只被檢查一次。並且由於它們也不在sprites組中,因此它們不會更新或繪製到屏幕上。

其實,你不再需要sspink在所有(我們抽象它拿走),如果我們構建我們的團體像這樣開頭:

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

非常感謝您提供非常詳細的解釋和其他PyGame技巧。這已經解決了我的得分問題。謝謝!! – Zanne