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

Python PyGame分数计数器以秒而不是1递增,python,pygame,Python,Pygame,我正在创建一个游戏,每当两个精灵碰撞时,分数应该增加1。现在分数开始显示为0,然后一旦发生碰撞,它就会增加到39(有时是27。数字的可变性让我觉得它在以秒为单位增加)。在这里阅读一些其他的答案让我意识到这很可能是一个我在哪里的问题 t = f.render("Score = " + str(score), False, black) screen.blit(t, (0,0)) 位于for循环中。但是我试着把它放在其他地方,然后分数就根本没有出现在屏幕上 下面是我代码中创建分数的部分 clas

我正在创建一个游戏,每当两个精灵碰撞时,分数应该增加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()

首先,请注意,您可以将
移动
函数重命名为
更新
,它们将由
精灵.update()调用

你必须明白,当你在
精灵
上调用
杀死
时,它不会神奇地从你的游戏中移除。它将从所有精灵群中移除。您调用了
sspink.kill()
,但对象仍然存在,位于
sspink
变量中

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

您应该做以下几点:

为下落的块创建新的精灵组:

blocks = pygame.sprite.RenderPlain(sspink)
然后,不要调用
tub.hit(sspink)
检查碰撞(实际上,只需删除
hit
函数),而是使用pygame的函数:

global score
score += len(pygame.sprite.spritecollide(tub, blocks, True))
此函数将检查
tub
组中的精灵之间的碰撞,如果发生碰撞,则杀死该组中的精灵,然后返回与
tub
碰撞的精灵

因此,我们只需计算碰撞的块数(目前,最多一个,但让我们以防万一),然后将该数字添加到分数中

由于
spritecollide
会杀死精灵,因此
组中不再有精灵,因此只会检查碰撞一次。而且,由于它们也不再位于
精灵组中,因此它们不会被更新或绘制到屏幕上

事实上,如果我们一开始就这样构建团队,那么您根本不需要
sspink
(我们将其抽象出来):

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

首先,请注意,您可以将
移动
函数重命名为
更新
,它们将由
精灵.update()调用

你必须明白,当你在
精灵
上调用
杀死
时,它不会神奇地从你的游戏中移除。它将从所有精灵群中移除。您调用了
sspink.kill()
,但对象仍然存在,位于
sspink
变量中

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

您应该做以下几点:

为下落的块创建新的精灵组:

blocks = pygame.sprite.RenderPlain(sspink)
然后,不要调用
tub.hit(sspink)
检查碰撞(实际上,只需删除
hit
函数),而是使用pygame的函数:

global score
score += len(pygame.sprite.spritecollide(tub, blocks, True))
此函数将检查
tub
组中的精灵之间的碰撞,如果发生碰撞,则杀死该组中的精灵,然后返回与
tub
碰撞的精灵

因此,我们只需计算碰撞的块数(目前,最多一个,但让我们以防万一),然后将该数字添加到分数中

由于
spritecollide
会杀死精灵,因此
组中不再有精灵,因此只会检查碰撞一次。而且,由于它们也不再位于
精灵组中,因此它们不会被更新或绘制到屏幕上

事实上,如果我们一开始就这样构建团队,那么您根本不需要
sspink
(我们将其抽象出来):

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

我以前做过一些游戏编程,但是我以前没有使用过pygame,所以我不确定你是如何处理碰撞的,但这可能与增加秒数无关,但可能是精灵接触了不止一帧?请记住,如果你的游戏以每秒60帧的速度运行,它将每秒运行你的主游戏循环60次,因此可能是你的精灵接触了超过一帧,每秒增加分数多次。这正是问题所在。非常感谢。我以前做过一些游戏编程,但是我以前没有使用过pygame,所以我不确定你是如何处理碰撞的,但这可能与增加秒数无关,但可能是精灵接触了不止一帧?请记住,如果你的游戏以每秒60帧的速度运行,它将每秒运行你的主游戏循环60次,因此可能是你的精灵接触了超过一帧,每秒增加分数多次。这正是问题所在。非常感谢。非常感谢您的详细解释和其他PyGame提示。这解决了我的得分问题。非常感谢。非常感谢您的详细解释和其他PyGame提示。这解决了我的得分问题。非常感谢。