2014-10-08 209 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