PyGame transparent Surface [GB]
If you use
surface.set_colorkey([0,0,0])
then later blit()
will skip pixels which have color [0,0,0]
This way you can remove background from surface or loaded image.
In this example I remove black color [0, 0, 0]
so it blits only rectangles on

With this method you can use
surface.set_alpha(128)
to create semi transparent object

import pygame
# --- constants --- (UPPER_CASE_NAMES)
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 25
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
YELLOW = (255,255,0)
GRAY_1 = (128,128,128)
GRAY_2 = (192,192,192)
# --- main ---
pygame.init()
screen = pygame.display.set_mode( (SCREEN_WIDTH, SCREEN_HEIGHT) )
# ---
background = pygame.surface.Surface(screen.get_size())
color = GRAY_1
for x in range(0, SCREEN_WIDTH, 40):
for y in range(0, SCREEN_HEIGHT, 40):
pygame.draw.rect(background, color, [x, y, 40, 40])
if color == GRAY_1:
color = GRAY_2
else:
color = GRAY_1
# ---
surface = pygame.surface.Surface(screen.get_size())
surface.set_colorkey([0,0,0])
pygame.draw.polygon(surface, RED, [(200,100), (400,300), (600,100)])
pygame.draw.polygon(surface, RED, [(200,100), (400,300), (600,100)])
pygame.draw.polygon(surface, GREEN, [(200,500), (400,300), (600,500)])
pygame.draw.polygon(surface, BLUE, [(200,100), (400,300), (200,500)])
pygame.draw.polygon(surface, YELLOW, [(600,100), (400,300), (600,500)])
surface.set_alpha(128)
# --- mainloop ---
clock = pygame.time.Clock()
running = True
while running:
# --- events ---
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYUP:
if event.key == pygame.K_ESCAPE:
running = False
# --- draws ---
screen.blit(background, (0,0))
screen.blit(surface, (0,0))
pygame.display.flip()
# --- FPS ---
ms = clock.tick(FPS)
# --- end ---
pygame.quit()
Changing set_alpha()
you can create this

import pygame
# --- constants --- (UPPER_CASE_NAMES)
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 25
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
YELLOW = (255,255,0)
GRAY_1 = (128,128,128)
GRAY_2 = (192,192,192)
# --- main ---
pygame.init()
screen = pygame.display.set_mode( (SCREEN_WIDTH, SCREEN_HEIGHT) )
# ---
background = pygame.surface.Surface(screen.get_size())
color = GRAY_1
for x in range(0, SCREEN_WIDTH, 40):
for y in range(0, SCREEN_HEIGHT, 40):
pygame.draw.rect(background, color, [x, y, 40, 40])
if color == GRAY_1:
color = GRAY_2
else:
color = GRAY_1
# ---
surface = pygame.surface.Surface(screen.get_size())
surface.set_colorkey([0,0,0])
pygame.draw.polygon(surface, RED, [(200,100), (400,300), (600,100)])
pygame.draw.polygon(surface, RED, [(200,100), (400,300), (600,100)])
pygame.draw.polygon(surface, GREEN, [(200,500), (400,300), (600,500)])
pygame.draw.polygon(surface, BLUE, [(200,100), (400,300), (200,500)])
pygame.draw.polygon(surface, YELLOW, [(600,100), (400,300), (600,500)])
surface.set_alpha(128) # semi transparent all pixels
lower = True
alpha = 255
# --- mainloop ---
clock = pygame.time.Clock()
running = True
while running:
# --- events ---
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYUP:
if event.key == pygame.K_ESCAPE:
running = False
# --- changes ---
if lower:
alpha -= 10
if alpha <= 10:
lower = False
else:
alpha += 10
if alpha >= 250:
lower = True
surface.set_alpha(alpha)
# --- draws ---
screen.blit(background, (0,0))
screen.blit(surface, (0,0))
pygame.display.flip()
# --- FPS ---
ms = clock.tick(FPS)
# --- end ---
pygame.quit()
But using set_alpha()
(and set_colorkey()
) all pixels have the same transparency.
They can have differen transparency like with .convert_aplha()
You can use it also with images. In old games it was popular to use pink color for background.
If you don't know what color was used then you can get first pix in image
If you like it
Buy a Coffee
