重叠部分透明的形状

时间:2009-12-12 20:15:01

标签: python pygame alpha

如果我在部分透明的颜色上绘制任何形状(使用SRCALPHA标记),它将完全替换它下面的内容,而不是像图像编辑器中那样重叠。

如何使形状正确重叠?

3 个答案:

答案 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问题提供了更多信息。

相关问题