2012-03-27 140 views
0

我在64位win7上使用python 2.7.1和pygame 1.9.1。我使用http://www.pygame.org/wiki/GradientCode的漸變代碼來繪製我的背景。我然後顯示文字,如下所示:如何在pygame中重繪漸變背景上的文字?

countText = font.render("%d" % secs_left, 1, (255, 0, 0)) 
countRect = countText.get_rect() 
countRect.y, countRect.centerx = yPos, screen.get_rect().width/2 
screen.blit(countText, countRect) 
pygame.display.flip() 

我用它來顯示倒數計時器,但問題是數字相互繪製。我可以在font.render()調用中指定一個背景顏色來解決這個問題,但後來我發現另一個問題,即純色背景與漸變背景不匹配。

我認爲這可以通過在另一個表面保存一個漸變背景的副本,然後在繪製下一個數字之前將保存的表面的相關部分繪製到背景上來解決,但我不知道如何做到這一點。

我可以節省這樣的漸變背景的副本:

# save a surface with same size and gradient as background 
bg_image = pygame.Surface(screen.get_size()) 
fill_gradient(bg_image, BG_COLOR, GRADIENT_COLOR) 

但是我怎麼選擇bg_image的相關部分,它借鑑到我的主屏幕背景?我想這樣的事情,做一個screen.blit(),試圖阻擊器的新號碼之前刪除當前的倒計時數字,但它不工作:

countText = usefont.render("%d" % secs_left, 1, (255, 0, 0)) 
countRect = countText.get_rect() 
countRect.y, countRect.centerx = yPos, screen.get_rect().width/2 
screen.blit(bg_image, (0,0), countRect) 
screen.blit(countText, countRect) 
pygame.display.flip() 

這將是最好的方法(與代碼這樣可行)?還是有更好的方法來做到這一點?

感謝您的幫助。

回答

0

我可以使用Surface.set_clip()來限制該地區正在更新只包含文本倒計時矩形:

countText = usefont.render("%d" % secs_left, 1, (255, 0, 0)) 
countRect = countText.get_rect() 
countRect.y, countRect.centerx = yPos, screen.get_rect().width/2 
screen.set_clip(countRect)  # Allow updates only to area in countRect 
screen.blit(bg_image, (0,0))  # bg_img will only be drawn within countRect 
screen.blit(countText, countRect) 
pygame.display.flip() 
0
  • 使用pygame.display.set_mode(size, 0, 32)得到你的屏幕表面,它支持透明。
  • 使用的表面,以節省您的背景下,我們將其命名爲bg_surface
  • 你每次你做font.render時間得到一個新的文字表面,將其命名爲txt_surface
  • pygame.display.flip()之前每次的blit的bg_surface然後txt_surfacescreen

這就是你需要的嗎?如果你正在渲染一個計數器,那麼每一幀都可以使整個背景閃爍。

+0

塊傳輸bg_surface時,這將刪除所有內容。我想只刪除倒數文本區域。我在屏幕上還有其他東西,不僅僅是倒計時文字。 – dcr 2012-03-27 19:40:33

+0

然後你可以使用'Surface.subsurface(rect)'方法來獲取'bg_surface'的一部分。 – Ray 2012-03-29 05:32:22