【问题标题】:Trying to make sections of sprite change colour, but whole sprite changes instead试图让精灵的某些部分改变颜色,但整个精灵会改变
【发布时间】:2019-10-15 00:18:49
【问题描述】:

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

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

# 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

最终失败的 Sprite Failed Sprite

无法发布图片,没有足够的声誉

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

【问题讨论】:

  • 我看不到您的图片,它们需要 Google 帐户。 (除了第一张图片。)
  • 我刚刚更改了一些内容,想看看第二张图片现在是否适合您。 self.colour 没有 alpha,但也只有纯色

标签: python pygame sprite pygame-surface


【解决方案1】:

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

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

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

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()

【讨论】:

  • 谢谢!我不完全清楚为什么这是问题,但它确实有效。鉴于此解决方案,我需要使蒙版具有完整精灵的灰度细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多