我如何在 pygame 中删除我的精灵表上的黑色背景 发生了什么?扩展 Sprite 类用特殊颜色擦除背景

问题描述

我正在尝试学习如何在 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))
    sprite.blit(self.spritesheet,(0,0),(x,h))
    return sprite

    pass

颜色键 0 0 0

任意数字的颜色键

解决方法

不要设置颜色键,去掉线:

sprite.set_colorkey(( 0,0))

但使用 convert_alpha() 而不是 convert()

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

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

pygame 文档指出:

返回的 Surface 将包含与它来自的文件相同的颜色格式、颜色键和 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,pygame.SRCALPHA)
        sprite.blit(self.spritesheet,(0,0),(x,h))
        return sprite
,

发生了什么?

假设您的精灵(尽管您尚未发布原始文件 sprite.png)使用 Alpha-Channel 来表示透明度,就像 Boyfriend of Friday Night Funkin 的类似图像:

Boyfriend image transparent

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

请参阅 set_colorkey 上的 PyGame 文档:

设置 Surface 的当前颜色键。将此 Surface 块传输到目的地时,与颜色键具有相同颜色的任何像素都将是透明的。颜色可以是 RGB 颜色或映射的颜色整数。如果没有传递,颜色键将被取消。

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

您可以尝试精灵的任何其他主色,例如作为 colorkey 的红色或白色,然后看看其他颜色会消失。或者您可以将 colorkey 设置为 None 以取消设置。

扩展 Sprite 类

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

用特殊颜色擦除背景

为了让背景橡皮擦使不重要的部分变得透明,Python 论坛中的这个主题推荐了一种罕见的特殊颜色,例如 {{1 }}: Loading images,transparency,handling spritesheets (part 2)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...