Python 如何在pygame中删除精灵表上的黑色背景

Python 如何在pygame中删除精灵表上的黑色背景,python,pygame,sprite,pygame-surface,alpha-transparency,Python,Pygame,Sprite,Pygame Surface,Alpha Transparency,我正在尝试学习如何在pygame上使用精灵表,在我第一次尝试时,由于某种原因,我的精灵有一个黑色背景,我不知道如何解决这个问题,我已经在颜色键上加了000,但当我这样做时,精灵会全是bug import pygame class Spritesheet(pygame.sprite.Sprite): def __init__(self, filename, *groups): super().__init__(*groups) self.filename = filename

我正在尝试学习如何在pygame上使用精灵表,在我第一次尝试时,由于某种原因,我的精灵有一个黑色背景,我不知道如何解决这个问题,我已经在颜色键上加了000,但当我这样做时,精灵会全是bug

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

任意数字的彩色键


不要设置颜色键并删除该行:

sprite.set\u颜色键((0,0,0))

但使用而不是

self.spritesheet=pygame.image.load(文件名).convert()

self.spritesheet=pygame.image.load(文件名).convert_alpha()
pygame文档指出:

返回的曲面将包含与其来源的文件相同的颜色格式、颜色键和alpha透明度。您通常希望在没有参数的情况下调用,以创建一个可以更快地在屏幕上绘制的副本。
对于alpha透明度,如.png图像,请在加载后使用该方法,以便图像具有每像素透明度

因此,如果调用
convert()
,每像素的alpha信息将丢失,图像将呈现不透明背景


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

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

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

Spritesheet
class:

类精灵表(pygame.sprite.sprite):
定义初始化(self、文件名、*组):
超级()
self.filename=文件名
self.spritesheet=pygame.image.load(文件名).convert_alpha()
def get_精灵(自身、x、y、w、h):
sprite=pygame.Surface((w,h),pygame.SRCALPHA)
sprite.blit(自精灵表,(0,0),(x,y,w,h))
返回精灵
发生了什么事? 假设您的精灵(尽管您尚未发布原始文件
sprite.png
)使用了一个用于透明度的图像,类似于:

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

请参阅以下页面上的PyGame文档:

设置曲面的当前颜色关键点。当将此曲面分屏到目标上时,与colorkey颜色相同的任何像素都将是透明的。颜色可以是RGB颜色或映射的颜色整数。如果没有传递,则colorkey将被取消设置

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

你可以尝试你的精灵的任何其他主色调,比如红色或白色作为颜色键,看看还有什么消失了。或者您可以将colorkey设置为
None
以取消设置

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

用特殊颜色擦除背景 为了让背景橡皮擦使不重要的部分透明,Python论坛中的这个帖子推荐了一种罕见的特殊颜色,如
粉色

@hc\u dev不允许新用户在线images@PranavHosangadi谢谢你的通知,我还不知道,没什么变化,老兄:/@Juw我已经扩展了答案。我的错。我忽略了
sprite=pygame.Surface((w,h))
行。哦,现在开始工作吧,伙计,谢谢你的帮助。嗯,我会试试的