如何解决我如何在 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 的类似图像:
您显然将 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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。