试图让部分精灵改变颜色,但整个精灵都改变了
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
蒙版颜色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()
我的游戏中有一些精灵需要特定的部分才能改变颜色。
我的过程我试图拥有一个纯白色的精灵图像,它在不需要颜色的任何地方都是透明的。我在其上绘制了一个彩色方块,然后在主要精灵的顶部绘制了一个彩色方块,但是主要精灵随后在各处都改变了颜色,但同时尊重主要精灵的透明度。最让我困惑的部分是,当我将蒙版彩色图像放在主屏幕上时,它看起来确实正确。
# 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
蒙版颜色Masked Colour
最终失败的精灵Failed Sprite
不能post图片,信誉度不够
我没有收到任何错误,但只有盾牌的白色部分应该是绿色的
self.image
是加载的图像,您希望通过某种颜色更改特定区域,self.mask
是定义区域的遮罩。
然后您创建一个图像 masked
,其中包含在 mask
中指定的区域,并以特定颜色着色。
所以你所要做的就是 .blit
image
上的有色面具 (masked
) 没有任何 special_flags
设置:
self.image.blit(self.masked, (0, 0))
查看示例,其中红色矩形更改为蓝色矩形:
最小示例:
精灵:
掩码:
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()