【问题标题】:Stacking different types of transparency in pygame在pygame中堆叠不同类型的透明度
【发布时间】:2012-07-25 20:04:23
【问题描述】:

我有一个自定义 GUI 模块,它使用树中的对象来管理界面,并以正确的顺序将它们相互叠加。

现在在我的对象中,我有一些只是具有每像素透明度的表面,而其他的则使用颜色键。

我的问题是,当在另一个填充有颜色键的表面上对具有每像素透明度的表面进行 blitting 时,第一个表面会改变第二个表面中某些像素的颜色,这意味着它们不再透明。我怎样才能混合这些而不必摆脱每个像素的透明度?

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    您可以将使用颜色键的Surfaces 转换为使用每像素透明度,然后再使用convert_alpha 在其上设置另一个每像素透明度Surface


    示例:

    COLORKEY=(127, 127, 0)
    TRANSPARENCY=(0, 0, 0, 0)
    import pygame
    pygame.init()
    screen = pygame.display.set_mode((200, 200))
    for x in xrange(0, 200, 20):
      pygame.draw.line(screen, (255, 255, 255), (x, 0),(x, 480))
    
    # create red circle using a colorkey
    red_circle = pygame.Surface((200, 200))
    red_circle.fill(COLORKEY)
    red_circle.set_colorkey(COLORKEY)
    pygame.draw.circle(red_circle, (255, 0, 0), (100, 100), 25)
    
    #create a green circle using alpha channel (per-pixel transparency)
    green_circle = pygame.Surface((100, 100)).convert_alpha()
    green_circle.fill(TRANSPARENCY)
    pygame.draw.circle(green_circle, (0, 255, 0, 127), (50, 50), 25)
    
    # convert colorkey surface to alpha channel surface before blitting
    red_circle = red_circle.convert_alpha()
    red_circle.blit(green_circle, (75, 75))
    
    screen.blit(red_circle, (0, 0))
    
    pygame.display.flip()
    

    结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-28
      • 2016-10-12
      • 1970-01-01
      • 2014-12-25
      • 2011-12-29
      • 1970-01-01
      • 2022-10-04
      • 2013-11-11
      相关资源
      最近更新 更多