如果我在部分透明的颜色上绘制任何形状(使用SRCALPHA标记),它将完全替换它下面的内容,而不是像图像编辑器中那样重叠。
如何使形状正确重叠?
答案 0 :(得分:1)
您可以将blit与适当的BLEND_*
值一起使用(将形状保持为单独的曲面,以保持完整性和编辑,并且仅为显示目的进行blitting)。
答案 1 :(得分:1)
如上所述,PyGame中的绘图函数实际上并没有按照您期望的方式进行混合。从PyGame文档:
大多数参数都接受一个RGB三元组的颜色参数。这些也可以接受RGBA四联体。如果alpha值包含像素alpha,则alpha值将直接写入Surface,但绘制函数不会透明绘制。
你可能想要做的事情基本上就是Alex Martelli所说的 - 创建一个带有alpha通道的中间软件表面,将你的形状画在那个表面上,然后将blit混合到最终表面上。如果您已经使用过PyGame的字体渲染,请注意它的工作方式大致相同,只是Font.render会为您创建临时表面。
这些天我对Python和PyGame有点生疏,但这里有一个简单的例子,希望没有太多的错误:
# returns a surface with the circle drawn onto it
def render_transparent_circle(color, radius, width=0):
size = radius * 2
temp_surf = pygame.Surface((size, size), SRCALPHA)
temp_surf.fill(Color(0, 0, 0, 0))
pygame.draw.circle(temp_surf, color, (radius, radius), radius, width)
return temp_surf
# draw a half-opaque blue circle of radius 30 to the display at point (50, 100)
def test():
transp_blue = Color(0, 0, 255, 128)
screen = pygame.display.get_surface()
circle = render_transparent_circle(transp_blue, 30)
screen.blit(circle, (50, 100))
P.S。 - 如果您要多次显示相同的形状,您可能需要考虑缓存中间曲面(但不要忘记分析以确定它是否有帮助。)
答案 2 :(得分:0)
Alpha本身只是一个可以达到目的的额外“价值”。碰巧的是,目的通常是(但不总是)透明度(其他用途包括反射率,镜面高亮,甚至伪造HDR的方法)。
您需要指定您希望它混合(以及它应该使用的等式)。对"pygame blend mode"的简单Google搜索显示了一些不错的资源。
正如Alex指出的那样,blit采用混合模式作为参数。此StackOverflow问题提供了更多信息。