python pygame设置颜色透明度

我想在屏幕上创建一个透明的按钮和文本,我正在寻找实现的方法,第四个RGB参数和set_alpha可以使颜色透明

所以我用self.button_color=(0,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,128)

        self.text_color=(255,0)
        self.text = pygame.font.Font(None,100).render(text,True,self.text_color)
        self.text.set_alpha(128)
        self.rect = pygame.Rect(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))
        button.draw_button(setting)
        pygame.display.flip()
game()
onlyyou123 回答:python pygame设置颜色透明度

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

[...]根据使用的背景和抗锯齿类型,这将返回不同类型的Surface。出于性能原因,最好知道将使用哪种类型的图像。 [...] 如果背景是透明的,则会设置一个色键。抗锯齿图像被渲染为24位RGB图像。如果背景是透明的,则将包含像素Alpha

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

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

阅读pygame.Surface.fill的文档:

[...] color参数可以是RGB序列,RGBA序列或映射的颜色索引。如果使用RGBA,则除非表面使用每个像素的alpha(表面具有SRCALPHA标志),否则将忽略 Alpha(RGBA的一部分)

您必须创建一个属性为SCRALPHA的pygame.Surface对象以绘制透明矩形:

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

要实现所需的功能,必须使用特殊标志blit BLEND_MAX矩形上的文本。 draw_button仅需blit,即屏幕上包含文本的按钮矩形。例如:

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

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

        self.rect = pygame.Rect(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)
本文链接:https://www.f2er.com/2813515.html

大家都在问