Как перерисовать текст на градиентном фоне в Pygame? - PullRequest
0 голосов
/ 27 марта 2012

Я использую python 2.7.1 с pygame 1.9.1 на 64-битной win7. Я использую код градиента http://www.pygame.org/wiki/GradientCode, чтобы нарисовать фон. Затем я отображаю текст так:

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()

Будет ли это наилучшим подходом (с работающим кодом)? Или есть лучший способ сделать это?

Спасибо за вашу помощь.

Ответы [ 3 ]

0 голосов
/ 28 марта 2012

Я могу использовать 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 голосов
/ 15 февраля 2019

Нашел этот пост, исследуя небольшую вариацию того же вопроса.Вот работающее универсальное решение, созданное после объединения информации из разных мест.В этом случае bg_image может использоваться напрямую, поскольку заголовок, который (также) помещен сверху, не перекрывается с количеством.Я использовал другой метод генерации градиента, но это не важно.Особенно при использовании screen.copy() создать опорную поверхность для использования во время восстановления.

1003 *
0 голосов
/ 27 марта 2012
  • используйте pygame.display.set_mode(size, 0, 32), чтобы получить поверхность экрана, она поддерживает прозрачность.
  • Используйте поверхность, чтобы сохранить фон, мы называем ее bg_surface
  • Вы получаете новыйПоверхность текста каждый раз, когда вы делаете font.render, назовите его txt_surface
  • Когда каждый раз перед pygame.display.flip(), бите bg_surface и затем txt_surface до screen.

Это то, что тебе нужно?Если вы рендерите счетчик, то достаточно будет перетаскивать весь фон каждый кадр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...