为了账号安全,请及时绑定邮箱和手机立即绑定

更改表面的颜色而不覆盖透明度

更改表面的颜色而不覆盖透明度

芜湖不芜 2023-10-06 18:42:28
我想在运行时动态更改矩形的颜色。当前set_colour正在用单一颜色值填充表面的所有像素。这是可行的,但是当调用类似的方法时会出现问题set_outline,该方法会修改表面的透明度。class Rectangle(pg.sprite.Sprite):    def __init__(self):        pg.sprite.Sprite.__init__(self)        self.original_image = pg.Surface((10, 10))        self.image = self.original_image        self.rect = self.image.get_rect()    def set_colour(self, colour_value):        self.colour = colour_value        self.image.fill(self.colour)        self.original_image.fill(self.colour)    def set_outline(self, thickness):        self.thickness = thickness        size = self.image.get_size()        calc = thickness/100        p_width, p_height = size[0], size[1]        width, height = size[0]*calc, size[1]*calc        self.image = self.image.convert_alpha()        center_x, center_y = (p_width//2)-(width//2), (p_height//2)-(height//2)        pg.draw.rect(self.image, (0, 0, 0, 0), (center_x, center_y, width, height))现在,如果我尝试在运行时更改该矩形的颜色,它将覆盖在set_outline.有没有办法将颜色遮罩或混合到矩形上,这样它就不会替换任何透明度?
查看完整描述

1 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

您可以通过 2 个步骤来实现这一目标。self.original_image包含具有所需颜色的填充矩形:

self.original_image.fill(self.colour)

生成一个全白色的矩形和透明区域。使用 ( self.image) 和混合模式混合矩形BLEND_MAX(参见 pygame.Surface.blit):

whiteTransparent = pg.Surface(self.image.get_size(), pg.SRCALPHA)
whiteTransparent.fill((255, 255, 255, 0))
self.image.blit(whiteTransparent, (0, 0), special_flags=pg.BLEND_MAX)

现在矩形是完全白色的,但透明区域被保留。使用混合模式BLEND_MULT并混合self.original_imageself.image获得所需的结果:

self.image.blit(self.original_image, (0, 0), special_flags=pg.BLEND_MULT)

最小的例子:https://img1.sycdn.imooc.com//651fe4e600019c7900400033.jpg repl.it/@Rabbid76/PyGame-ChangeColorOfSpriteArea

https://i.stack.imgur.com/oldLt.gif

import pygame as pg


class Rectangle(pg.sprite.Sprite):

    def __init__(self):

        pg.sprite.Sprite.__init__(self)

        self.original_image = pg.Surface((150, 150))

        self.image = self.original_image

        self.rect = self.image.get_rect(center = (150, 150))


    def set_colour(self, colour_value):

        self.colour = colour_value

        self.original_image.fill(self.colour)


        whiteTransparent = pg.Surface(self.image.get_size(), pg.SRCALPHA)

        whiteTransparent.fill((255, 255, 255, 0))

        self.image.blit(whiteTransparent, (0, 0), special_flags=pg.BLEND_MAX)


        self.image.blit(self.original_image, (0, 0), special_flags=pg.BLEND_MULT)


    def set_outline(self, thickness):

        self.thickness = thickness

        size = self.image.get_size()


        calc = thickness/100

        p_width, p_height = size[0], size[1]

        width, height = size[0]*calc, size[1]*calc


        self.image = self.image.convert_alpha()


        center_x, center_y = (p_width//2)-(width//2), (p_height//2)-(height//2)

        pg.draw.rect(self.image, (0, 0, 0, 0), (center_x, center_y, width, height))


pg.init()

window = pg.display.set_mode((300, 300))

clock = pg.time.Clock()


sprite = Rectangle()

sprite.set_colour((255, 0, 0, 255))

sprite.set_outline(50)


group = pg.sprite.Group(sprite)


colorVal = 0

colorAdd = 5

run = True

while run:

    clock.tick(60)

    for event in pg.event.get():

        if event.type == pg.QUIT:

            run = False


    sprite.set_colour((min(colorVal, 255), max(0, min(511-colorVal, 255)), 0, 255))

    colorVal += colorAdd

    if colorVal <= 0 or colorVal >= 511:

        colorAdd *= -1


    window.fill(0)

    group.draw(window)

    pg.display.flip()


查看完整回答
反对 回复 2023-10-06
  • 1 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信