Pygame 使用精灵表:alpha 问题

Posted

技术标签:

【中文标题】Pygame 使用精灵表:alpha 问题【英文标题】:Pygame using sprite sheet : alpha problems 【发布时间】:2018-01-04 11:57:57 【问题描述】:

我正在使用精灵表为我的播放器设置动画,动画效果很好,但是当我在屏幕上对动画的相应图像进行 blit 时没有 alpha。

Class Animation:
    def __init__(self, path, img_size):
        self.images = pyagme.image.load(path).convert_alpha()
        self.cur_img = 0
        ....

    def get_image(self):
        img=pygame.Surface((self.img_width,self.img_height)).convert_alpha()
        rect = pygame.Rect((self.cur_img * self.img_width, 0),(self.img_width, self.img_height))
        img.blit(self.images, (0, 0), rect)
        return img

我正在使用get_image 函数来绘制玩家: 每次更新:self.image = self.cur_anim.get_image()self 是 Player 类。

在我的函数drawself.screen.blit(self.player.image, self.player.rect)

【问题讨论】:

新 Surface 永远不会透明,您必须使用具有A=0 的 RGBA 颜色 fill() - 参见示例 transparency。但是您可以使用Surface.subsurface 创建img,并且不需要新的Surface。顺便说一句,您可以在__init__ 中创建所有子表面并保留在列表中,然后您可以获得img = self.all_images[self.cur_img] - 参见示例spritesheet 【参考方案1】:

新的Surface 永远不会透明,因此您必须使用具有A=0RGBA 颜色填充它以使其透明。

img = pygame.Surface((self.img_width,self.img_height)).convert_alpha()

img.fill( (0,0,0,0) )

但是有pygame.Surface.subsurface可以创建子图像(并且它不使用新内存)

def get_image(self):
    rect = pygame.Rect((self.cur_img * self.img_width, 0),(self.img_width, self.img_height))

    return self.images.subsurface(rect)

顺便说一句:您可以在 __init__ 中创建所有子表面,然后仅使用

def get_image(self):
    return self.all_subsurfaces[self.cur_img]

【讨论】:

您也可以通过pygame.SRCALPHA 来获得具有每像素alpha 的透明表面:img = pygame.Surface((self.img_width, self.img_height), pygame.SRCALPHA)

以上是关于Pygame 使用精灵表:alpha 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用搁置模块保存 pygame 精灵组

改变精灵动画速度(pygame)

pygame 的精灵使用

如何在 Pygame 中使用 Sprite Sheets 创建动画精灵?

如何在 Pygame 中使用 Sprite Sheets 创建动画精灵?

手势识别控制pygame精灵