透明度

pygame 支援 3 種透明度:colorkeys,Surface alphas 和 per-pixel alphas。

Colorkeys

使顏色完全透明,或更準確,使顏色不是 blit。如果你的影象裡面有黑色矩形,你可以設定一個顏色鍵,以防止黑色的顏色。

BLACK = (0, 0, 0)
my_image.set_colorkey(BLACK)  # Black colors will not be blit.

Surface 只能有一個 colorkey。設定另一個顏色鍵將覆蓋前一個顏色鍵。Colorkeys 不能具有不同的 alpha 值,它只能使顏色不可見。

StackOverflow 文件

表面 alphas

使整個 Surface 透明化為 alpha 值。使用此方法,你可以使用不同的 Alpha 值,但它會影響整個 Surface。

my_image.set_alpha(100)  # 0 is fully transparent and 255 fully opaque.

StackOverflow 文件

每畫素 alpha

使 Surface 中的每個畫素都透明化為單獨的 alpha 值。這為你提供了最大的自由度和靈活性,但也是最慢的方法。此方法還要求將 Surface 建立為每畫素 alpha 表面,並且顏色引數需要包含第四個 alpha 整數。

size = width, height = (32, 32)
my_image = pygame.Surface(size, pygame.SRCALPHA)  # Creates an empty per-pixel alpha Surface.

如果顏色包含第四個 alpha 值,Surface 現在將繪製透明度。

BLUE = (0, 0, 255, 255)
pygame.draw.rect(my_image, BLUE, my_image.get_rect(), 10)

與其他曲面不同,此曲面預設顏色不是黑色而是透明。這就是為什麼中間的黑色矩形消失了。

StackOverflow 文件

結合 colorkey 和 Surface alpha

可以組合 Colorkeys 和 Surface alphas,但是每畫素 alpha 不能。如果你不希望每畫素 Surface 的效能降低,這可能很有用。

purple_image.set_colorkey(BLACK)
purple_image.set_alpha(50)

StackOverflow 文件

完整程式碼

將其複製到一個空檔案中並執行它。按鍵 1,2,3 或 4 可顯示影象。多次按 2,3 或 4 可使它們更不透明。

import pygame
pygame.init()

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255, 50)  # This color contains an extra integer. It's the alpha value.
PURPLE = (255, 0, 255)

screen = pygame.display.set_mode((200, 325))
screen.fill(WHITE)  # Make the background white. Remember that the screen is a Surface!
clock = pygame.time.Clock()

size = (50, 50)
red_image = pygame.Surface(size)
green_image = pygame.Surface(size)
blue_image = pygame.Surface(size, pygame.SRCALPHA)  # Contains a flag telling pygame that the Surface is per-pixel alpha
purple_image = pygame.Surface(size)

red_image.set_colorkey(BLACK)
green_image.set_alpha(50)
# For the 'blue_image' it's the alpha value of the color that's been drawn to each pixel that determines transparency.
purple_image.set_colorkey(BLACK)
purple_image.set_alpha(50)

pygame.draw.rect(red_image, RED, red_image.get_rect(), 10)
pygame.draw.rect(green_image, GREEN, green_image.get_rect(), 10)
pygame.draw.rect(blue_image, BLUE, blue_image.get_rect(), 10)
pygame.draw.rect(purple_image, PURPLE, purple_image.get_rect(), 10)

while True:
    clock.tick(60)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_1:
                screen.blit(red_image, (75, 25))
            elif event.key == pygame.K_2:
                screen.blit(green_image, (75, 100))
            elif event.key == pygame.K_3:
                screen.blit(blue_image, (75, 175))
            elif event.key == pygame.K_4:
                screen.blit(purple_image, (75, 250))

    pygame.display.update()