我如何在 pygame 中删除精灵 sheet 上的黑色背景

How i can remove the black background on my sprite sheet in pygame

我正在尝试学习如何在 pygame 上使用 sprite 表,在我第一次尝试我的 sprite 时出于某种原因有黑色背景,我不知道如何解决这个问题,我Alredy 把 000 放在颜色键上,但是当我这样做时,精灵全是马车

import pygame


class Spritesheet(pygame.sprite.Sprite):
def __init__(self, filename, *groups):
    super().__init__(*groups)
    self.filename = filename
    self.spritesheet = pygame.image.load(filename).convert()

def get_sprite(self, x, y, w, h):
    sprite = pygame.Surface((w, h))
    sprite.set_colorkey(( 0 , 0 , 0))
    sprite.blit(self.spritesheet, (0, 0), (x, y, w, h))
    return sprite

    pass

颜色键 0 0 0

任意数字的颜色键

不设置色键,删除线:

sprite.set_colorkey(( 0 , 0 , 0))

但使用convert_alpha() instead of convert()

self.spritesheet = pygame.image.load(filename).convert()

self.spritesheet = pygame.image.load(filename).convert_alpha()

pygame 文档指出:

The returned Surface will contain the same color format, colorkey and alpha transparency as the file it came from. You will often want to call convert() with no arguments, to create a copy that will draw more quickly on the screen.
For alpha transparency, like in .png images, use the convert_alpha() method after loading so that the image has per pixel transparency.

因此,如果您调用 convert(),每个像素的 alpha 信息将丢失,图像将被赋予不透明的背景。


当您 blit 图像在新表面上时,目标表面必须提供每像素 alpha 格式。使用 SRCALPHA 标志创建一个每个像素都有一个 alpha 通道的表面:

sprite = pygame.Surface((w, h))

sprite = pygame.Surface((w, h), pygame.SRCALPHA)

Spritesheet class:

class Spritesheet(pygame.sprite.Sprite):
    def __init__(self, filename, *groups):
        super().__init__(*groups)
        self.filename = filename
        self.spritesheet = pygame.image.load(filename).convert_alpha()

    def get_sprite(self, x, y, w, h):
        sprite = pygame.Surface((w, h), pygame.SRCALPHA)
        sprite.blit(self.spritesheet, (0, 0), (x, y, w, h))
        return sprite

发生了什么事?

假设您的精灵(尽管您尚未发布原始文件 sprite.png)使用 Alpha-Channel for transparency, like similar image of Boyfriend of Friday Night Funkin:

您显然将 colorkey 设置为精灵中存在的颜色(黑色和 RGB 0,0,0)。

请参阅 set_colorkey 上的 PyGame 文档:

Set the current color key for the Surface. When blitting this Surface onto a destination, any pixels that have the same color as the colorkey will be transparent. The color can be an RGB color or a mapped color integer. If None is passed, the colorkey will be unset.

因此,在精灵中以黑色绘制的所有轮廓(眼睛、嘴唇、耳朵、麦克风上的网格、钥匙扣)在新的 alpha 混合透明度中消失了。

您可以尝试您的 sprite 的任何其他主色,例如红色或白色作为 colorkey,看看还有什么消失了。或者您可以将 colorkey 设置为 None 以取消设置。

扩展 Sprite class

也许您可以获得关于为您的游戏对象扩展 pygame.sprite.Sprite class 的额外建议,如 Real Python 的 PyGame 教程系列中所述:

用特殊颜色擦除背景

为了让 背景橡皮擦 使不重要的部分透明,Python 论坛 中的这个主题推荐了一种罕见的 特殊颜色喜欢pinkLoading images, transparency, handling spritesheets (part 2)