Python PyGame得分计数器递增秒而不是1

时间:2016-11-30 07:37:55

标签: python pygame

我创造了一个游戏,每当2个精灵碰撞时,得分应该增加1。现在,分数显示为0开始,然后一旦发生碰撞,它增加到39(有时它是27。数字的变化使我认为它以秒为单位递增)。在这里阅读其他一些答案让我意识到这很可能是我所拥有的问题

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()

1 个答案:

答案 0 :(得分:2)

首先,请注意您可以将movement功能重命名为updatesprites.update()将调用它们。

您必须了解,当您在kill上致电Sprite时,它不会神奇地从您的游戏中删除。它将从其所有精灵组中删除。你打电话给sspink.kill(),但对象仍在那里,住在sspink变量。

由于你调用sspink.movement(),它仍会移动(并在主循环的每次迭代时与你的其他精灵碰撞)。但它不会被绘制到屏幕上,因为您使用精灵组(sprites.draw(screen))处理绘图,并且从该组中删除了sspink

您应该做的是以下内容:

为下降的块创建一个新的sprite组:

blocks = pygame.sprite.RenderPlain(sspink)

然后,使用pygame的pygame.sprite.spritecollide函数,而不是调用tub.hit(sspink)来检查碰撞(事实上,只需删除hit函数),而不是:{/ p>

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

此函数将检查tub组中blocks和精灵之间的碰撞,如果发生碰撞则杀死该组中的精灵,然后返回与{{1}碰撞的精灵}。

所以我们只计算碰撞了多少块(目前,它最多只有一个,但让我们能够面向未来)并将这个数字添加到分数中。

由于tub会杀死精灵,因此spritecollide组中不再存在,因此仅检查碰撞一次。由于它们也不再属于blocks组,因此不会更新或绘制到屏幕上。

事实上,如果我们在开始时构建这样的组,你就不再需要sprites(我们将其抽象出来了):

sspink