试图让部分精灵改变颜色,但整个精灵都改变了

Trying to make sections of sprite change colour, but whole sprite changes instead

我的游戏中有一些精灵需要特定的部分才能改变颜色。

我的过程我试图拥有一个纯白色的精灵图像,它在不需要颜色的任何地方都是透明的。我在其上绘制了一个彩色方块,然后在主要精灵的顶部绘制了一个彩色方块,但是主要精灵随后在各处都改变了颜色,但同时尊重主要精灵的透明度。最让我困惑的部分是,当我将蒙版彩色图像放在主屏幕上时,它看起来确实正确。

# Load main sprite and mask sprite
        self.image = pygame.image.load("Enemy.png").convert_alpha()
        self.mask = pygame.image.load("EnemyMask.png").convert_alpha()

# Create coloured image the size of the entire sprite
        self.coloured_image = pygame.Surface([self.width, self.height])
        self.coloured_image.fill(self.colour)

# Mask off the coloured image with the transparency of the masked image, this part works
        self.masked = self.mask.copy()
        self.masked.blit(self.coloured_image, (0, 0), None, pygame.BLEND_RGBA_MULT)

# Put the masked image on top of the main sprite
        self.image.blit(self.masked, (0, 0), None, pygame.BLEND_MULT)

Enemy.png

EnemyMask.png(白的看不出来)

蒙版颜色Masked Colour

最终失败的精灵Failed Sprite

不能post图片,信誉度不够

我没有收到任何错误,但只有盾牌的白色部分应该是绿色的

self.image 是加载的图像,您希望通过某种颜色更改特定区域,self.mask 是定义区域的遮罩。

然后您创建一个图像 masked,其中包含在 mask 中指定的区域,并以特定颜色着色。

所以你所要做的就是 .blit image 上的有色面具 (masked) 没有任何 special_flags 设置:

self.image.blit(self.masked, (0, 0))

查看示例,其中红色矩形更改为蓝色矩形:

repl.it/@Rabbid76/PyGame-ChangeColorOfSurfaceArea


最小示例: repl.it/@Rabbid76/PyGame-ChangeColorOfSurfaceArea-3

精灵:

掩码:

import pygame

def changColor(image, maskImage, newColor):
    colouredImage = pygame.Surface(image.get_size())
    colouredImage.fill(newColor)
    
    masked = maskImage.copy()
    masked.set_colorkey((0, 0, 0))
    masked.blit(colouredImage, (0, 0), None, pygame.BLEND_RGBA_MULT)

    finalImage = image.copy()
    finalImage.blit(masked, (0, 0), None)

    return finalImage

pygame.init()
window = pygame.display.set_mode((404, 84))

image = pygame.image.load('avatar64.png').convert_alpha()
maskImage = pygame.image.load('avatar64mask.png').convert_alpha()

colors = []
for hue in range (0, 360, 60):
    colors.append(pygame.Color(0))
    colors[-1].hsla = (hue, 100, 50, 100)

images = [changColor(image, maskImage, c) for c in colors]

clock = pygame.time.Clock()
nextColorTime = 0
run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.fill((255, 255, 255))
    for i, image in enumerate(images):
        window.blit(image, (10 + i * 64, 10))
    pygame.display.flip()

pygame.quit()
exit()