pygame - 更新评分框

时间:2014-10-08 14:49:54

标签: python pygame blit

我正在学习使用pygame,我在渲染文本方面遇到了一些问题。

我使用的简化代码是这样的:

import pygame

sizex =200; sizey =200

pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((sizex,sizey))
myfont = pygame.font.Font(None, 32)

score=pygame.Rect(100,100,100,50)

screen.fill((255,255,255))
pygame.draw.rect(screen, (0,250,0), (10,10,10,10), 2)
pygame.display.update()

for i in xrange(0,1000): 
    msElapsed = clock.tick(2)
    text="I = %d" %i
    label = myfont.render(text, 1, (0,0,250))
    screen.blit(label, (100, 100))

    pygame.display.update(score)

我只想更新包含文本框的屏幕部分。但是这段代码并没有这样做。文本会覆盖自己,并在一段时间后变得不可读。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

问题在于,当您对文本进行blit时,文本的背景是透明的(请注意,这很重要,例如,当您想要拥有背景图像时)。你必须首先“清除”矩形,然后blit文本。在您的情况下,当您使用纯色作为背景时,您可以执行以下操作:

for i in xrange(0,1000): 
    msElapsed = clock.tick(2)
    text="I = %d" %i
    label = myfont.render(text, 1, (0,0,250))
    screen.fill((255,255,255), rect=label.get_rect(topleft=(100,100)))
    screen.blit(label, (100, 100))

    pygame.display.update(score)

如果使用图像而不是纯色,则必须在背景的适当区域进行blit。

修改

正如Bartlomiej所指出的,如果新的字符串是分拣机而不是前者,它将不会完全被删除。您可以每次清除整个屏幕,或尝试弄清楚如何清除您需要清除的内容,例如,存储前一个blit的区域:

previous_rect = None
for i in xrange(0,1000): 
    msElapsed = clock.tick(2)
    text="I = %d" %i
    if prev_rect:
        screen.fill((255,255,255), rect=prev_rect)
    label = myfont.render(text, 1, (0,0,250))
    previous_rect = label.get_rect(topleft=(100,100))
    screen.blit(label, (100, 100))

    pygame.display.update(score)