2012-03-27 2 views
0

Я использую python 2.7.1 с pygame 1.9.1 на 64-разрядном win7. Я использую код градиента от 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(), блитированиями bg_surface, а затем txt_surface к screen ,

Это то, что вам нужно? Если вы создаете счетчик, то enougth blit весь фон в каждом кадре.

+0

Это удалит все, когда блиттинг bg_surface. Я хочу удалить только область обратного отсчета. У меня есть другие вещи на экране, а не только обратный отсчет текста. – dcr

+0

Тогда вы можете использовать метод 'Surface.subsurface (rect)', чтобы получить только часть 'bg_surface'. – Ray

Смежные вопросы