Почему текстовая печать Pygame не полностью покрывает последнюю текстовую печать и оставляет странную ауру вокруг текста?

#python #text #printing #pygame

Вопрос:

У меня есть 2 функции, которые являются частью моей программы, в которой я печатаю количество шариков, которое постоянно меняется, поэтому я печатаю его, но каждый раз перед печатью (вызываю set_text (), а затем печатаю) я вызываю функцию set_text2 (), чтобы предыдущий текст исчез, однако это не работает, и это оставляет странную ауру вокруг числа.

Это 2 функции в Python:

 def set_text(string, coord_x, coord_y, font_size):  """  This is a function to set the text of the amount of balls (white)  :param string: The text to display (in this case the amount of current balls)  :type string: string  :param coord_x: The x coordinate of the text  :type coord_x: int  :param coord_y: The y coordinate of the text  :type coord_y: int  :param font_size: The size of the text  :type font_size: int  :return: The text  :rtype: tuple  """   font = pygame.font.Font('freesansbold.ttf', font_size)  # (255, 255, 255) is black, to make black text  text = font.render(string, True, (255, 255, 255))  text_rect = text.get_rect()  text_rect.center = (coord_x, coord_y)  return text, text_rect   def set_text2(string, coord_x, coord_y, font_size):  """  This is a function to set the text of the amount of balls (black)  :param string: The text to display (in this case the amount of current balls)  :type string: string  :param coord_x: The x coordinate of the text  :type coord_x: int  :param coord_y: The y coordinate of the text  :type coord_y: int  :param font_size: The size of the text  :type font_size: int  :return: The text  :rtype: tuple  """   # font_size 2 - trying to make the black text cover the white text  font = pygame.font.Font('freesansbold.ttf', font_size)  # (0, 0, 0) is black, to make black text  text = font.render(string, True, (0, 0, 0))  text_rect = text.get_rect()  text_rect.center = (coord_x, coord_y)  return text, text_rect  

Как это исправить?

Кроме того, именно здесь я на самом деле печатаю текст:

 # Printing to the screen the current amount of balls on the screen  print_amount = current_amount  totalText = set_text(str(print_amount), 350, 20, 35)  screen.blit(totalText[0], totalText[1])   # If the amount of balls has changed, covering the previous amount (Black text)  if print_amount != current_amount:  totalText = set_text2(str(print_amount), 350, 20, 35)  screen.blit(totalText[0], totalText[1])  

Ответ №1:

Проблема в том, что вы используете антиализ. Это означает, что некоторые пиксели на самом деле не являются цветом, который вы изначально выбрали, но, по сути, был сделан проход сглаживания, который также проникает в окружающие пиксели.1 Вы можете проверить это сами, передав False в качестве второго параметра font.render вместо True . Тогда эффект должен исчезнуть.

Однако, вероятно, лучше использовать сглаживание, а вместо этого изменить метод, с помощью которого вы перерисовываете предыдущее изображение:

  • Я предполагаю, что вы специально не хотите перерисовывать весь экран. Возможно, вам захочется пересмотреть это, так как это полностью устранит возможность появления этих артефактов.
  • Используйте background параметр font.render . Это приведет не только к перерисовке чисел, но и к тому, что находится вокруг них, так что это может быть не вариант.

1 Я не совсем уверен, почему выравнивание не применяется к черным пикселям таким же образом. Я предполагаю, что это вызвано тем, что прозрачный фон также имеет значение цвета (0, 0, 0) Смотреть ниже


После еще немного повозки и исследований я понял: пиксели типа АА имеют значение альфа, позволяющее смешиваться с фоном. Однако применение альфы для черного и белого дает разные результаты: в то время как смешивание с белым делает пиксель видимым наверняка, смешивание с черным не делает его полностью черным. Я не думаю, что на самом деле есть способ обойти это, если только кто-то не знает, как заставить любую ненулевую альфа вести себя как 255 Альфа.

Комментарии:

1. Изменение второго параметра с False на True сделало свое дело, спасибо!