Python - Pygame - 渲染半透明文本

时间:2013-12-16 20:19:07

标签: python pygame

我正在使用pygame.font.Font.render()呈现一些文字。我希望文本是半透明的,即具有不是255的alpha值,所以我尝试将带有alpha值的颜色参数(例如(255, 0, 0, 150))作为pygame.font.Font.render()的颜色参数传递但是它没有任何影响。我也尝试在生成的Surface对象上使用pygame.Surface.convert_alpha(),但这也没有做任何事情。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

我不知道为什么,但经过一些实验后,我发现用font.render创建的曲面不能改变它的alpha值。只需将表面blit到另一个表面,然后更改新曲面的alpha值。

textsurface=font.render('Test', True, (0, 0, 0))
surface=pygame.Surface((100, 30))
surface.fill((255, 255, 255))
surface.blit(textsurface, pygame.Rect(0, 0, 10, 10))
surface.set_alpha(50)
window.blit(surface, pygame.Rect(0, 30, 10, 10))

答案 1 :(得分:1)

使用pygame.font模块时,渲染文本时不考虑文本颜色的alpha通道,但请参见pygame.font.Font.render

抗锯齿图像被渲染为24位RGB图像。如果背景是透明的,则将包含像素alpha。

pygame.Surface.set_alpha

在pygame 2.0中进行了更改:每个表面的alpha可以与每个像素的alpha组合。

因此,用set_alpha渲染文本后设​​置透明度就足够了。这甚至适用于抗锯齿的文本:

font = pygame.font.SysFont(None, 150)

text_surf = font.render('test text', True, (255, 0, 0))
text_surf.set_alpha(127)

window.blit(text_surf, (x, y))

最小示例: repl.it/@Rabbid76/PyGame-TransparentText

import pygame

pygame.init()
window = pygame.display.set_mode((500, 300))
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 150)

text_surf = font.render('test text', True, (255, 0, 0))
text_surf.set_alpha(127)

background = pygame.Surface(window.get_size())
ts, w, h, c1, c2 = 50, *window.get_size(), (128, 128, 128), (64, 64, 64)
tiles = [((x*ts, y*ts, ts, ts), c1 if (x+y) % 2 == 0 else c2) for x in range((w+ts-1)//ts) for y in range((h+ts-1)//ts)]
for rect, color in tiles:
    pygame.draw.rect(background, color, rect)

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.blit(background, (0, 0))
    window.blit(text_surf, text_surf.get_rect(center = window.get_rect().center))
    pygame.display.flip()

pygame.quit()
exit()

通过使用pygame.freetype模块,您可以在创建文本表面时直接使用透明颜色:

ft_font = pygame.freetype.SysFont('Times New Roman', 150)

text_surf2, text_rect2 = ft_font.render('test text', (255, 0, 0, 128))
window.blit(text_surf2, (x, y))

或者如果您将文本直接渲染到曲面上:

ft_font = pygame.freetype.SysFont('Times New Roman', 150)

ft_font.render_to(window, (x, y), 'test text', (255, 0, 0, 128))

最小示例: repl.it/@Rabbid76/PyGame-TransparentFreeTypeText

import pygame
import pygame.freetype

pygame.init()

window = pygame.display.set_mode((500, 300))
clock = pygame.time.Clock()
ft_font = pygame.freetype.SysFont('Times New Roman', 150)

text_surf2, text_rect2 = ft_font.render('test text', (255, 0, 0, 128))

background = pygame.Surface(window.get_size())
ts, w, h, c1, c2 = 50, *window.get_size(), (128, 128, 128), (64, 64, 64)
tiles = [((x*ts, y*ts, ts, ts), c1 if (x+y) % 2 == 0 else c2) for x in range((w+ts-1)//ts) for y in range((h+ts-1)//ts)]
for rect, color in tiles:
    pygame.draw.rect(background, color, rect)

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.blit(background, (0, 0))
    
    text_rect = ft_font.get_rect('test text')
    text_rect.center = (window.get_width() // 2, window.get_height() // 2 - 70)
    ft_font.render_to(window, text_rect.topleft, 'test text', (255, 0, 0, 128))
    
    text_rect2.center = (window.get_width() // 2, window.get_height() // 2 + 70)
    window.blit(text_surf2, text_rect2)
    
    pygame.display.flip()

pygame.quit()
exit()

另请参阅Text and font

答案 2 :(得分:1)

您可以使用单个 Alpha 值更改整个表面的透明度。 使用surf=pygame.Surface((size,pygame.SRCALPHA)。现在,如果您通过设置屏幕的 surf.set_alpha(alpha) 来更改 alpha 值,文本周围的表面将不再是黑色的。