是否可以在 Pygame 中更改精灵颜色?
Is it possible to change sprite colours in Pygame?
我正在 Python 中使用 Pygame 制作游戏,其中包括游戏开始前的小型头像制作器,而不是创建具有 88 种不同组合的大型精灵 sheet发型和颜色,有没有办法让我可以只使用每种发型的通用 .png 图像并在游戏中为其应用颜色?
发型保存为具有 alpha 和抗锯齿功能的 .png 图像,因此它们不仅仅是一种颜色。我有 8 种不同的发型和 11 种不同的颜色。将它们作为精灵 sheet 加载并在游戏中剪辑它们不会有问题,但如果有一种方法可以在游戏中应用颜色(或色调),那么不仅会更容易记忆,但会打开它更多的可能性。
如果图像是“遮罩”图像,具有透明背景和白色(255、255、255)遮罩,那么您可以轻松“着色”图像。
加载图像:
image = pygame.image.load(imageName)
生成具有 alpha 通道且大小相同的均匀彩色图像:
colorImage = pygame.Surface(image.get_size()).convert_alpha()
colorImage.fill(color)
使用过滤器 BLEND_RGBA_MULT
:
将 image
与 maskImage
混合
image.blit(colorImage, (0,0), special_flags = pygame.BLEND_RGBA_MULT)
精灵 class 可能看起来像这样:
class MySprite(pygame.sprite.Sprite):
def __init__(self, imageName, color):
super().__init__()
self.image = pygame.image.load(imageName)
self.rect = self.image.get_rect()
colorImage = pygame.Surface(self.image.get_size()).convert_alpha()
colorImage.fill(color)
self.image.blit(colorImage, (0,0), special_flags = pygame.BLEND_RGBA_MULT)
最小示例: repl.it/@Rabbid76/PyGame-ChangeColorOfSurfaceArea-4
import pygame
def changColor(image, color):
colouredImage = pygame.Surface(image.get_size())
colouredImage.fill(color)
finalImage = image.copy()
finalImage.blit(colouredImage, (0, 0), special_flags = pygame.BLEND_MULT)
return finalImage
pygame.init()
window = pygame.display.set_mode((300, 160))
image = pygame.image.load('CarWhiteDragon256.png').convert_alpha()
hue = 0
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
color = pygame.Color(0)
color.hsla = (hue, 100, 50, 100)
hue = hue + 1 if hue < 360 else 0
color_image = changColor(image, color)
window.fill((96, 96, 64))
window.blit(color_image, color_image.get_rect(center = window.get_rect().center))
pygame.display.flip()
pygame.quit()
exit()
精灵:
我正在 Python 中使用 Pygame 制作游戏,其中包括游戏开始前的小型头像制作器,而不是创建具有 88 种不同组合的大型精灵 sheet发型和颜色,有没有办法让我可以只使用每种发型的通用 .png 图像并在游戏中为其应用颜色?
发型保存为具有 alpha 和抗锯齿功能的 .png 图像,因此它们不仅仅是一种颜色。我有 8 种不同的发型和 11 种不同的颜色。将它们作为精灵 sheet 加载并在游戏中剪辑它们不会有问题,但如果有一种方法可以在游戏中应用颜色(或色调),那么不仅会更容易记忆,但会打开它更多的可能性。
如果图像是“遮罩”图像,具有透明背景和白色(255、255、255)遮罩,那么您可以轻松“着色”图像。
加载图像:
image = pygame.image.load(imageName)
生成具有 alpha 通道且大小相同的均匀彩色图像:
colorImage = pygame.Surface(image.get_size()).convert_alpha()
colorImage.fill(color)
使用过滤器 BLEND_RGBA_MULT
:
image
与 maskImage
混合
image.blit(colorImage, (0,0), special_flags = pygame.BLEND_RGBA_MULT)
精灵 class 可能看起来像这样:
class MySprite(pygame.sprite.Sprite):
def __init__(self, imageName, color):
super().__init__()
self.image = pygame.image.load(imageName)
self.rect = self.image.get_rect()
colorImage = pygame.Surface(self.image.get_size()).convert_alpha()
colorImage.fill(color)
self.image.blit(colorImage, (0,0), special_flags = pygame.BLEND_RGBA_MULT)
最小示例:
import pygame
def changColor(image, color):
colouredImage = pygame.Surface(image.get_size())
colouredImage.fill(color)
finalImage = image.copy()
finalImage.blit(colouredImage, (0, 0), special_flags = pygame.BLEND_MULT)
return finalImage
pygame.init()
window = pygame.display.set_mode((300, 160))
image = pygame.image.load('CarWhiteDragon256.png').convert_alpha()
hue = 0
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
color = pygame.Color(0)
color.hsla = (hue, 100, 50, 100)
hue = hue + 1 if hue < 360 else 0
color_image = changColor(image, color)
window.fill((96, 96, 64))
window.blit(color_image, color_image.get_rect(center = window.get_rect().center))
pygame.display.flip()
pygame.quit()
exit()
精灵: