首页 > 解决方案 > 我如何在pygame中删除我的精灵表上的黑色背景

问题描述

我正在尝试学习如何在 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

任何数字的颜色键

标签: pythonpygamespritepygame-surfacealpha-transparency

解决方案


不要设置颜色键和删除线:

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 将包含与其来源文件相同的颜色格式、颜色键和 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

推荐阅读