您正在将两种不需要(也不能混合)的东西混合在一起。但是您不需要使用set_alpha()
实现你想要的。
SRCALPHA
告诉它您将在该表面上使用每个像素 alpha。如果您阅读了文档here https://www.pygame.org/docs/ref/surface.html你会发现它说“SRCALPHA 像素格式将包含每像素 alpha”。Here https://www.pygame.org/docs/ref/surface.html#pygame.Surface.set_alpha你会看到文档set_alpha()
表明它与每像素 alpha 不兼容“对于具有每像素 alpha 的表面,毯子 alpha 被忽略”(除非您使用的是我怀疑的 pygame 2)。
根据您对问题的描述,我怀疑您是否需要 set_alpha 。如果您已创建上表面以使用“SRCALPHA”的每像素 alpha,那么您未绘制的像素将已经是透明的。当您将其位块传输到另一个表面上时,仅应传输您绘制的多边形。
这是一个例子:
GREEN = pygame.Color('green')
RED = pygame.Color('red')
size = (800, 400)
pygame.init()
screen = pygame.display.set_mode(size)
lowersurf = pygame.Surface(size)
lowersurf.fill(GREEN)
polysurf = pygame.Surface(size, flags=pygame.SRCALPHA)
pygame.draw.polygon(polysurf, RED, ((100, 100), (600, 100), (600, 200), (350, 300), (100, 200)), 4)
lowersurf.blit(polysurf, (0, 0))
screen.blit(lowersurf, (0, 0))
pygame.display.flip()
它在透明上绘制多边形轮廓polysurf
然后将其传输到正常的lowersurf
.
然后它会传输结果lowersurf
到屏幕上。
Edit:
在评论中,OP询问如何将多边形绘制到lowersurf
透明度,使其具有 50% 的透明度。一种方法是将图像绘制到polysurf
与部分透明。像这样:
GREEN = pygame.Color('green')
RED = pygame.Color('red')
transparent_red = RED
transparent_red[3] = 125
size = (800, 400)
pygame.init()
screen = pygame.display.set_mode(size)
lowersurf = pygame.Surface(size)
lowersurf.fill(GREEN)
polysurf = pygame.Surface(size, flags=pygame.SRCALPHA)
pygame.draw.polygon(polysurf, transparent_red, ((100, 100), (600, 100), (600, 200), (350, 300), (100, 200)), 4)
lowersurf.blit(polysurf, (0, 0))
screen.blit(lowersurf, (0, 0))
pygame.display.flip()
这会创建一种颜色transparent_red
即 50% 透明。颜色中的第四个参数是 alpha 值,其范围从 0(完全透明)到 255(完全不透明),因此 125 是一半。
另一种方法(可能是您真正想要的)是对整个polysurf
而不仅仅是绘制在其上的特定事物。按照最初的方式绘制整个 Polysurf,然后在绘制之前调整整个表面的 Alpha。像这样:
GREEN = pygame.Color('green')
RED = pygame.Color('red')
size = (800, 400)
blend_alpha = 125
pygame.init()
screen = pygame.display.set_mode(size)
lowersurf = pygame.Surface(size)
lowersurf.fill(GREEN)
polysurf = pygame.Surface(size, flags=pygame.SRCALPHA)
pygame.draw.polygon(polysurf, RED, ((100, 100), (600, 100), (600, 200), (350, 300), (100, 200)), 4)
transparent_polysurf = polysurf.copy()
transparent_polysurf.fill((255, 255, 255, blend_alpha), special_flags=pygame.BLEND_RGBA_MULT)
lowersurf.blit(transparent_polysurf, (0, 0))
screen.blit(lowersurf, (0, 0))
pygame.display.flip()
在这个例子中我复制了polysurf
然后使用fill()
使用special_flags=pygame.BLEND_RGBA_MULT(参见文档here https://www.pygame.org/docs/ref/surface.html#pygame.Surface.fill)在副本上使其在位图复制之前部分透明。我这样做了,所以原来的不受影响,但如果你不在乎,那么你可以进行混合fill()
直接在polysurf
无需复印。
正如我所说,您可能想采用最后一种方法,因为它融合了来自polysurf
具有相同的透明度。如果您想混合不同的事物,另一种方法很有用polysurf
具有不同的透明度级别。