python Pygame установить прозрачность цвета - PullRequest
2 голосов
/ 06 января 2020

Я хочу создать прозрачную кнопку и текст на экране, я ищу способ сделать это, четвертый параметр 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 Ответ

2 голосов
/ 06 января 2020

Прочитайте документацию pygame.font.Font.render:

[...] В зависимости от типа используемого фона и сглаживания, это возвращает различные типы поверхностей. Из соображений производительности полезно знать, какой тип изображения будет использоваться. [...] Если фон прозрачный, будет установлена ​​цветовая клавиша. Сглаженные изображения отображаются в 24-битных RGB-изображениях. Если фон прозрачен, будет добавлена ​​альфа-пиксель .

Это означает, что если аргумент 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 альфа (часть RGBA) игнорируется, если только поверхность не использует пиксель альфа (у поверхности есть флаг SRCALPHA) .

Вы должны создать пигмею .Поверхность объекта с атрибутом SCRALPHA для рисования прозрачного прямоугольника:

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,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)
...