使用图像透明度使显示为黑色 "things"

Using image transaprency make appear black "things"

我在使用 Pygame 正确加载和 blit PNG 图像时遇到问题。 代码确实有效,但它在我的精灵周围显示了一些奇怪的黑色“东西”:

black things around my sprite

要加载 tileset,我这样做:

    def TilesRessourceFile(self, filename=None, tileSize=None, tiles=None):
        logging.info("Loading ressources from %s", filename)
        self._tileSize = tileSize

        res = pygame.image.load(filename)
        res.convert_alpha()

        for tile in tiles:
            name, (x, y), alpha = tile.values()
            surface = pygame.Surface((tileSize, tileSize))
            surface.blit(res, (0, 0), area=(x * tileSize, y * tileSize, (x + 1) * tileSize, (y + 1) * tileSize))
            surface.convert_alpha() # set_colorkey(alpha)
            self._tiles.update({name: surface})

然后我像这样blit精灵

    def _implGameObjectRender(self, screen):
    # logging.info("Render map %s", self._mapping)
    for i in range(len(self._mapping)):
        for j in range(len(self._mapping[i])):
            screen.blit(self._mapping[i][j], (j * 128, i * 128))

可能不多,但我自己没有找到解决方案。 我已经尝试检查 :

我正在使用这个图块集:https://www.gamedevmarket.net/asset/2d-hand-painted-town-tileset-6626/

tileset 提供了一个 json 文件来加载 Tiled。也试过了,效果很好所以我想问题出在我这边

谢谢你帮助我!

Python 3.9.1 Pygame 2.0.1 (SDL 2.0.14)

convert_alpha() 不转换表面本身的格式,而是创建一个新表面,其格式提供每像素 alpha 格式。

任一

surface = pygame.Surface((tileSize, tileSize))
surface = surface.convert_alpha() 

surface = pygame.Surface((tileSize, tileSize)).convert_alpha() 

创建透明表面有3种方法:

  • 设置透明色键set_colorkey()

    颜色键指定被视为透明的颜色。例如,如果您有一个应该透明的黑色背景图像,请设置黑色键:

    surface.set_colorkey((0, 0, 0))
    
  • 您可以在创建新表面时启用附加功能。设置 SRCALPHA 标志以创建具有包含每像素 alpha 的图像格式的表面。像素的初始值为(0, 0, 0, 0):

    surface = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA)
    
  • 使用 convert_alpha() 创建 Surface 的副本,图像格式提供每个像素的 alpha。

    但是,如果您创建一个新表面并使用 convert_alpha(),Alpha 通道最初设置为最大。像素的初始值为 (0, 0, 0, 255)。您需要先用透明颜色填充整个表面,然后才能在其上绘制任何东西:

    surface = pygame.Surface((tileSize, tileSize))
    surface = surface.convert_alpha()
    surface.fill((0, 0, 0, 0))