2016-11-30 34 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