Python 如何在pygame中删除精灵表上的黑色背景
我正在尝试学习如何在pygame上使用精灵表,在我第一次尝试时,由于某种原因,我的精灵有一个黑色背景,我不知道如何解决这个问题,我已经在颜色键上加了000,但当我这样做时,精灵会全是bugPython 如何在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
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设置为精灵中存在的颜色(带有RGB0,0,0
的黑色)
请参阅以下页面上的PyGame文档:
设置曲面的当前颜色关键点。当将此曲面分屏到目标上时,与colorkey颜色相同的任何像素都将是透明的。颜色可以是RGB颜色或映射的颜色整数。如果没有传递,则colorkey将被取消设置
因此,所有的轮廓(眼睛、嘴唇、耳朵、麦克风上的网格、钥匙鞋带)在精灵中以黑色绘制,在新的alpha混合透明度中消失
你可以尝试你的精灵的任何其他主色调,比如红色或白色作为颜色键,看看还有什么消失了。或者您可以将colorkey设置为None
以取消设置
扩展Sprite类
也许您可以获得更多关于为游戏对象扩展pygame.sprite.sprite
类的建议,如Real Python的pygame教程系列中所述:
粉色
:
@hc\u dev不允许新用户在线images@PranavHosangadi谢谢你的通知,我还不知道,没什么变化,老兄:/@Juw我已经扩展了答案。我的错。我忽略了
sprite=pygame.Surface((w,h))
行。哦,现在开始工作吧,伙计,谢谢你的帮助。嗯,我会试试的