Python Pygame设置颜色透明度。

4
我希望在屏幕上创建一个透明按钮和文本,我搜索了一下如何实现这个功能,发现第四个RGB参数和set_alpha函数可以使颜色透明。
所以我使用self.button_color=(0,100,100,128)来设置按钮的颜色,而self.text.set_alpha(128)则用于改变文本的颜色。
但是当我运行脚本时,什么都没有改变。
以下是代码:
#!/usr/bin/python
import sys,os
import pygame


class Setting():
    def __init__(self,width,height):
        self.w=width
        self.h=height
        self.flag=pygame.RESIZABLE
        self.screen=pygame.display.set_mode((self.w,self.h),self.flag)
        self.screen_rect=self.screen.get_rect()
        pygame.display.set_caption("Test")

class Button():
    def __init__(self,setting,text):            
        self.width,self.height = 400,100

        self.button_color=(0,100,100,128)

        self.text_color=(255,0,0)
        self.text = pygame.font.Font(None,100).render(text,True,self.text_color)
        self.text.set_alpha(128)
        self.rect = pygame.Rect(0,0,self.width,self.height)
        self.rect.center = setting.screen_rect.center
        self.text_rect = self.text.get_rect()
        self.text_rect.center = self.rect.center
    def draw_button(self,setting):
        setting.screen.fill(self.button_color,self.rect)
        setting.screen.blit(self.text,self.text_rect)


def game():
    pygame.init()
    setting=Setting(1200,800)
    button=Button(setting,'PLAY')
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        setting.screen.fill((0,0,0))
        button.draw_button(setting)
        pygame.display.flip()
game()
1个回答

4

阅读pygame.font.Font.render的文档:

[...] 根据所使用的背景和抗锯齿类型,将返回不同类型的Surface。出于性能原因,了解将使用哪种类型的图像是很好的。[...] 如果背景是透明的,则会设置颜色键。抗锯齿图像呈现为24位RGB图像。如果背景是透明的,则将包括像素alpha

这意味着,如果antialias参数为True,则必须设置透明的background颜色以生成透明的文本。例如:

self.button_color=(0,100,100,128) # transparent alpha=128
self.text_color=(255,0,0)
self.text = pygame.font.Font(None,100).render(text,True,self.text_color, self.button_color)

阅读 pygame.Surface.fill 的文档:

[...] 颜色参数可以是一个RGB序列、RGBA序列或映射的颜色索引。如果使用RGBA,Alpha通道(RGBA中的A部分)将被忽略,除非表面使用每像素Alpha(Surface带有SRCALPHA标志)

您需要创建一个具有属性SCRALPHA的pygame.Surface对象来绘制透明矩形:

rectsurf = pygame.Surface(self.rect.size,pygame.SRCALPHA)
rectsurf.fill(self.button_color)
setting.screen.blit(rectsurf,self.rect.topleft)

为了实现你想要的效果,你需要使用特殊标志BLEND_MAX,将文本blit到矩形上。而draw_button只需将包含文本的按钮矩形blit到屏幕上即可。例如:

class Button():
    def __init__(self,setting,text):
        self.width,self.height = 400,100

        self.button_color=(0,100,100,128)
        self.text_color=(255,0,0,128)
        self.text = pygame.font.Font(None,100).render(text,True,self.text_color, self.button_color)

        self.rect = pygame.Rect(0,0,self.width,self.height)
        self.text_rect = self.text.get_rect()
        self.text_rect.center = self.rect.center

        self.btnsurf = pygame.Surface(self.rect.size,pygame.SRCALPHA)
        self.btnsurf.fill(self.button_color)
        self.btnsurf.blit(self.text, self.text_rect, special_flags=pygame.BLEND_MAX)

        self.rect.center = setting.screen_rect.center

    def draw_button(self,setting):
        setting.screen.blit(self.btnsurf,self.rect)

我发现无论我设置self.text.set_alpha(128)还是self.text.set_alpha(255),它都会绘制相同颜色的文本,这是不是由self.button_color=(0,100,100,128)控制的文本颜色? - M_Sea
@M_Sea 抱歉我的错。self.text.set_alpha(128) 是多余的,因为表面具有每像素alpha。在这种情况下,set_alpha 没有任何意义。 - Rabbid76
@M_Sea,目前看起来似乎不太可能轻松实现。我现在完全不知道怎么做。总之,这是你问题的一个扩展。 - Rabbid76
1
非常感谢,我发现如果将 .render(text,False,self.text_color 中的 False 设置为 True,那么就可以直接使用 self.text.set_alpha(200) 来设置透明度,唯一不好的是文本不够美观。 - M_Sea
我可以问另一个问题吗?为什么需要在最后加上self.rect.center = setting.screen_rect.center - M_Sea
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接