为什么 Pygame 文字打印没有完全覆盖最后一个文字打印,并在文字周围留下奇怪的光环?
Why does Pygame text print doesn't fully cover the last text print, and leaves weird aura around the text?
我有 2 个函数,它们是我的程序的一部分,我在其中打印了一些不断变化的球,所以我打印了它,但每次打印之前(调用 set_text()然后打印),我调用 set_text2() 函数,这样前面的文本就会消失,
然而,这不起作用,它在数字周围留下了奇怪的光环。
这些是 Python 中的 2 个函数:
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 您可以通过传递 False
作为 font.render
的第二个参数而不是 True
。那么效果应该就没有了
但是,最好使用抗锯齿,而不是更改透支上一张图像的方法:
- 我假设您特别不想重绘整个屏幕。您可能需要重新考虑这一点,因为它将完全消除这些伪影的可能性。
- 使用
font.render
的background
参数。这不仅会透支数字,还会透支数字周围的内容,因此这可能不是一个选项。
1 我不完全确定为什么不以相同的方式将抗锯齿应用于黑色像素。我假设这是由透明背景也具有颜色值 (0, 0, 0)
引起的,见下文
经过更多的摆弄和调查,我明白了:AA 像素设置了 alpha 值,以允许与背景混合。但是,对黑色和白色应用 alpha 会产生不同的结果:与白色混合肯定会使像素可见,而与黑色混合不会使像素完全变黑。我不认为真的有解决这个问题的方法,除非有人知道一种方法可以使任何非零 alpha 表现得像 255 Alpha。
我有 2 个函数,它们是我的程序的一部分,我在其中打印了一些不断变化的球,所以我打印了它,但每次打印之前(调用 set_text()然后打印),我调用 set_text2() 函数,这样前面的文本就会消失, 然而,这不起作用,它在数字周围留下了奇怪的光环。
这些是 Python 中的 2 个函数:
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 您可以通过传递 False
作为 font.render
的第二个参数而不是 True
。那么效果应该就没有了
但是,最好使用抗锯齿,而不是更改透支上一张图像的方法:
- 我假设您特别不想重绘整个屏幕。您可能需要重新考虑这一点,因为它将完全消除这些伪影的可能性。
- 使用
font.render
的background
参数。这不仅会透支数字,还会透支数字周围的内容,因此这可能不是一个选项。
1 我不完全确定为什么不以相同的方式将抗锯齿应用于黑色像素。我假设这是由透明背景也具有颜色值 引起的,见下文(0, 0, 0)
经过更多的摆弄和调查,我明白了:AA 像素设置了 alpha 值,以允许与背景混合。但是,对黑色和白色应用 alpha 会产生不同的结果:与白色混合肯定会使像素可见,而与黑色混合不会使像素完全变黑。我不认为真的有解决这个问题的方法,除非有人知道一种方法可以使任何非零 alpha 表现得像 255 Alpha。