为什么 Pygame 文本打印没有完全覆盖最后的文本打印,并在文本周围留下奇怪的光环?



我有两个函数,它们是程序的一部分,我在其中打印了一些不断变化的球,所以我打印它,但每次在打印它之前(调用set_text()然后打印),我调用set_text2()函数,以便之前的文本将消失,然而,这不起作用,它在数字周围留下了一种奇怪的光环。

以下是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您可以通过将False作为第二个参数传递给font.render而不是True来自己检查这一点。然后效果就会消失。

然而,最好使用抗锯齿,而不是改变你透支前一张图像的方法:

  • 我想你特别不想重画整个屏幕。您可能需要重新考虑,因为它将完全消除这些工件的可能性。
  • 使用font.renderbackground参数。这不仅会透支数字,还会透支它们周围的东西,所以这可能不是一个选择。

1我不完全确定为什么反化不以同样的方式应用于黑色像素。我认为这是由于透明背景也有颜色值(0, 0, 0),参见下面的


经过更多的摆弄和调查,我弄清楚了:AA像素有一个alpha值设置,允许与背景混合。然而,对黑色和白色应用alpha会产生不同的结果:虽然与白色混合会使像素可见,但与黑色混合并不能使像素完全黑色。我不认为真的有办法解决这个问题,除非有人知道一种方法使任何非0 alpha表现得像255 alpha。

相关内容

  • 没有找到相关文章

最新更新