为什么 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.renderbackground参数。这不仅会透支数字,还会透支数字周围的内容,因此这可能不是一个选项。

1 我不完全确定为什么不以相同的方式将抗锯齿应用于黑色像素。我假设这是由透明背景也具有颜色值 (0, 0, 0) 引起的,见下文


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