2014-10-08 207 views
2

我正在学习使用pygame,并且我在呈现文本时遇到了一些问题。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

这是应该做什么的? 'pygame.draw.rect(screen,(0,250,0),(10,10,10,10),2)' – 2014-10-08 14:51:43

+0

它只是画出一个对象的例子,我不想在屏幕更新时更新对象。 – 2014-10-08 14:52:34

回答

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) 

如果使用图片代替纯色,你就必须做块背景的适当区域。

编辑:

正如巴特洛梅耶表示,如果新的字符串分拣机比以前的,它不会完全消除。您可以每次清除整个屏幕,或尝试弄清楚如何清楚地清除您需要清除的内容,例如,存储前一个区域的区域:

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

还有一个问题,如果旧字符串比新字符串长,它将不会被覆盖。最好每帧画出整个画面。 – 2014-10-08 15:02:13

+0

所以,我认为最简单的方法是简单地在矩形中使用背景颜色和文本。有没有办法做到这一点? – 2014-10-08 15:12:00

+0

@DavidSousa确实。在['render'方法文档](http://www.pygame.org/docs/ref/font.html#pygame.font.Font.render)中说,你可以传递一个'background'参数来放置一个固体背景颜色。但是,请注意,如果文本尺寸不完全相同,则可能仍然存在问题。 – jdehesa 2014-10-08 15:15:04