Viviana, parte de nuestro equipo, nos ha hecho el favor de escribir esta sección ya que controla muy bien este tema.
Solución:
pygame.draw
las funciones no dibujarán con alfa. La documentación dice:
La mayoría de los argumentos aceptan un argumento de color que es un triplete RGB. Estos también pueden aceptar un cuádruple RGBA. El valor alfa se escribirá directamente en la superficie si contiene píxeles alfa, pero la función de dibujo no dibujará de forma transparente.
Lo que puede hacer es crear una segunda superficie y luego mostrarla en la pantalla. Blitting hará la mezcla alfa y el color. keys. Además, puede especificar alfa a nivel de superficie (más rápido y con menos memoria) o a nivel de píxel (más lento pero más preciso). Puedes hacer lo siguiente:
s = pygame.Surface((1000,750)) # the size of your rect
s.set_alpha(128) # alpha level
s.fill((255,255,255)) # this fills the entire surface
windowSurface.blit(s, (0,0)) # (0,0) are the top-left coordinates
o,
s = pygame.Surface((1000,750), pygame.SRCALPHA) # per-pixel alpha
s.fill((255,255,255,128)) # notice the alpha value in the color
windowSurface.blit(s, (0,0))
Tenga en cuenta en el primer caso, que cualquier otra cosa que dibuje s
se eliminará con el valor alfa que especifique. Entonces, si está usando esto para dibujar controles de superposición, por ejemplo, es mejor que use la segunda alternativa.
Además, considere usar pygame.HWSURFACE para crear la superficie acelerada por hardware.
Consulte los documentos de Surface en el sitio de pygame, especialmente la introducción.
Desafortunadamente, no hay una buena manera de dibujar una forma transparente. Ver módulo pygame.draw:
El valor alfa de un color se escribirá directamente en la superficie […]pero la función de dibujo no dibujará de forma transparente.
Por lo tanto, debe hacer una solución alternativa:
- Crear un
pygame.Surface
objeto con un formato alfa por píxel lo suficientemente grande como para cubrir la forma. - Dibuja la forma en la _Superficie.
- Mezcle el Superficie con el objetivo Superficie.
blit()
por defecto mezclas 2 Superficies
Por ejemplo, 3 funciones, que pueden dibujar rectángulos, círculos y polígonos transparentes:
def draw_rect_alpha(surface, color, rect):
shape_surf = pygame.Surface(pygame.Rect(rect).size, pygame.SRCALPHA)
pygame.draw.rect(shape_surf, color, shape_surf.get_rect())
surface.blit(shape_surf, rect)
def draw_circle_alpha(surface, color, center, radius):
target_rect = pygame.Rect(center, (0, 0)).inflate((radius * 2, radius * 2))
shape_surf = pygame.Surface(target_rect.size, pygame.SRCALPHA)
pygame.draw.circle(shape_surf, color, (radius, radius), radius)
surface.blit(shape_surf, target_rect)
def draw_polygon_alpha(surface, color, points):
lx, ly = zip(*points)
min_x, min_y, max_x, max_y = min(lx), min(ly), max(lx), max(ly)
target_rect = pygame.Rect(min_x, min_y, max_x - min_x, max_y - min_y)
shape_surf = pygame.Surface(target_rect.size, pygame.SRCALPHA)
pygame.draw.polygon(shape_surf, color, [(x - min_x, y - min_y) for x, y in points])
surface.blit(shape_surf, target_rect)
Ejemplo mínimo:
import pygame
def draw_rect_alpha(surface, color, rect):
shape_surf = pygame.Surface(pygame.Rect(rect).size, pygame.SRCALPHA)
pygame.draw.rect(shape_surf, color, shape_surf.get_rect())
surface.blit(shape_surf, rect)
def draw_circle_alpha(surface, color, center, radius):
target_rect = pygame.Rect(center, (0, 0)).inflate((radius * 2, radius * 2))
shape_surf = pygame.Surface(target_rect.size, pygame.SRCALPHA)
pygame.draw.circle(shape_surf, color, (radius, radius), radius)
surface.blit(shape_surf, target_rect)
def draw_polygon_alpha(surface, color, points):
lx, ly = zip(*points)
min_x, min_y, max_x, max_y = min(lx), min(ly), max(lx), max(ly)
target_rect = pygame.Rect(min_x, min_y, max_x - min_x, max_y - min_y)
shape_surf = pygame.Surface(target_rect.size, pygame.SRCALPHA)
pygame.draw.polygon(shape_surf, color, [(x - min_x, y - min_y) for x, y in points])
surface.blit(shape_surf, target_rect)
pygame.init()
window = pygame.display.set_mode((250, 250))
clock = pygame.time.Clock()
background = pygame.Surface(window.get_size())
ts, w, h, c1, c2 = 50, *window.get_size(), (160, 160, 160), (192, 192, 192)
tiles = [((x*ts, y*ts, ts, ts), c1 if (x+y) % 2 == 0 else c2) for x in range((w+ts-1)//ts) for y in range((h+ts-1)//ts)]
for rect, color in tiles:
pygame.draw.rect(background, color, rect)
run = True
while run:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
window.blit(background, (0, 0))
draw_rect_alpha(window, (0, 0, 255, 127), (55, 90, 140, 140))
draw_circle_alpha(window, (255, 0, 0, 127), (150, 100), 80)
draw_polygon_alpha(window, (255, 255, 0, 127),
[(100, 10), (100 + 0.8660 * 90, 145), (100 - 0.8660 * 90, 145)])
pygame.display.flip()
pygame.quit()
exit()
Si sostienes algún recelo y capacidad de prosperar nuestro post eres capaz de añadir una crónica y con deseo lo observaremos.