Pygame - 更新得分框

3
我是一个正在学习使用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)

我想仅更新包含文本框的屏幕部分。 但是这段代码没有做到这一点。 文本会互相覆盖,并在一段时间后变得难以阅读。
我做错了什么?

这段代码的作用是什么?pygame.draw.rect(screen, (0,250,0), (10,10,10,10), 2) - Bartlomiej Lewandowski
它只是绘制一个对象的示例,当屏幕更新时,我不希望该对象被更新。 - David Sousa
1个回答

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)

1
还有一个问题,如果旧字符串比新字符串长,它将不会被覆盖。最好每帧重新绘制整个屏幕。 - Bartlomiej Lewandowski
所以,我认为实现我想要的最简单的方法就是在带有文本的矩形中使用背景颜色。有没有什么办法可以做到这一点? - David Sousa
我明白了,我只需要在每次迭代中在文本区域上方绘制一个白色矩形,然后再次 blit 文本即可。问题解决了! - David Sousa
@javidcf score 矩形框的大小是固定的,始终大于文本。 - David Sousa
1
只是为了好奇,我正在处理的整个代码是这个:http://pastebin.com/1y6quQKw 它是牛顿运动定律的积分器,可以显示计算出的位置。 - David Sousa
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接