如何在Pygame中移除精灵表中的黑色背景

3

我正在尝试学习如何在pygame上使用精灵图,但在第一次尝试时,我的精灵出现了黑色背景。我不知道如何解决这个问题,我已经将颜色键设置为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

颜色键可以设置为任何数值


1
@hc_dev 新用户不允许内联图片。 - Pranav Hosangadi
@PranavHosangadi 谢谢你的提醒,我还不知道呢。 - hc_dev
2个回答

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

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

而是使用convert_alpha()代替convert()

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

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

Pygame文档指出:

返回的Surface将包含与其来源文件相同的颜色格式、colorkey和alpha透明度。通常需要调用convert()方法(不带参数)创建一个副本,以在屏幕上更快地绘制。
对于alpha透明度,例如.png图像,加载后使用convert_alpha()方法使图像具有每个像素的透明度。

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


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

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

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

Spritesheet 类:

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

另请参见:


什么都没改,伙计 :/ - Juw
@Juw 我已经扩展了答案。我的错。我忽略了 sprite = pygame.Surface((w, h)) 这一行。 - Rabbid76
1
哦,现在可以工作了,伙计。谢谢你的帮助。 - Juw

0

发生了什么?

假设您的精灵(尽管您尚未发布原始文件sprite.png)使用Alpha-Channel进行透明度处理,就像Friday Night Funkin的男朋友的类似图像一样:

Boyfriend image transparent

你似乎将colorkey设置为了精灵中存在的颜色(黑色,RGB值为0,0,0)。

请参阅PyGame文档中的set_colorkey

设置Surface的当前颜色键。当将此Surface复制到目标上时,与colorkey相同颜色的任何像素都将是透明的。颜色可以是RGB颜色或映射颜色整数。如果传递None,则将取消设置colorkey。

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

您可以尝试使用精灵的任何其他主要颜色,例如红色或白色作为colorkey,并查看还有什么会消失。或者,您可以将colorkey设置为None以取消设置。

扩展Sprite类

或许你可以在Real Python的PyGame教程系列中获得有关扩展pygame.sprite.Sprite类以用于游戏对象的额外建议:

使用特殊颜色擦除背景

而对于背景橡皮擦,使不重要的部分透明,这个Python论坛的主题建议使用罕见的特殊颜色,如粉色加载图像、透明度、处理精灵表(第2部分)


嗯,我会尝试。 - Juw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接