我正在学习使用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)
我只想更新包含文本框的屏幕部分。但是这段代码并没有这样做。文本会覆盖自己,并在一段时间后变得不可读。
我做错了什么?
答案 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)