#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 сделало свое дело, спасибо!