Is it possible to change sprite colours in Pygame?

后端 未结 1 2013
刺人心
刺人心 2020-12-11 23:39

I\'m making a game in Python using Pygame that includes a small avatar maker before the game starts, but instead of creating a big sprite sheet with 88 different combination

相关标签:
1条回答
  • If the image is a "mask" image, with a transparent background and a white (255, 255, 255) mask, then you can "tint" the image with ease.

    Load the image:

    image = pygame.image.load(imageName)
    

    Generate a uniform colored image with an alpha channel and the same size:

    colorImage = pygame.Surface(image.get_size()).convert_alpha()
    colorImage.fill(color)
    

    Blend the image with maskImage, by using the filter BLEND_RGBA_MULT:

    image.blit(colorImage, (0,0), special_flags = pygame.BLEND_RGBA_MULT)
    

    A sprite class may look like this:

    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)
    

    Minimal example: 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()
    

    Sprite:

    0 讨论(0)
提交回复
热议问题