python - 当在 Pygame 中使用 colorkey 透明度位 block 分割 Sprite 时,应该透明的区域是黑色的

标签 python transparency pygame

我有一个简单的程序,可以将背景图像传输到显示区域,然后在左上角放置一个 Sprite 。 Sprite 使用 colorkey 透明度,但是当我位图 Sprite 时,应该透明的区域变成了黑色。用于 colorkey 的颜色是绿色,因此 colorkey 至少正在做一些事情。

这是我的主模块,其中包含大部分显示代码:

import pygame
from pygame.locals import *

import sprites

try: 
    import psyco
    psyco.full()
except:
    print "psyco failed to import"

class PatchCon(object): # main game class
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode((832, 768))
        pygame.display.set_caption('PatchCon')
        self.setBackground()
        self.sprites = pygame.sprite.RenderPlain((sprites.Actor("Reimu")))

    def refresh(self):
        self.sprites.update()
        self.screen.blit(self.background, (0,0))
        self.sprites.draw(self.screen)
        pygame.display.update()

    def setBackground(self):
        self.background = pygame.Surface(self.screen.get_size())
        backgrounds = sprites.loadImage('patchconbackgrounds.png')
        self.background.blit(backgrounds[0], (0,0), sprites.bgcoords[3])
        self.background = self.background.convert()

    def mainLoop(self):
        while True:
            for event in pygame.event.get():
                if event.type == QUIT: return
            self.refresh()



if __name__ == '__main__':
    game = PatchCon()
    game.mainLoop()

我的另一个模块“sprites.py”处理加载图像和构造 sprite 对象:

import os
import pygame
from pygame.locals import *


# there are four different backgrounds compiled into one big image.
bgcoords = ((0,0,832,768),
            (0,769,832,1537),
            (833,0,1664,768),
            (833,769,1664,1537))

# the top left pixels of characters' sprites in the sprite sheet
charCoords = { "Reimu" : (1, 10), 
               "Marisa" : (334, 10)} 


def loadImage(name, colorkey=None):
    fullname = os.path.join('images', name)
    try:
        image = pygame.image.load(fullname)
    except pygame.error, message:
        print 'Cannot load image:', fullname
        raise SystemExit, message
    image = image.convert_alpha()
    if colorkey is not None:
        if colorkey is -1:
            colorkey = image.get_at((0,0))
        image.set_colorkey(colorkey, RLEACCEL)
    return image, image.get_rect()



class SpriteDict(object):
    """SpriteDict has a list that holds all of the different images
    the sprites have.  It's in charge of finding character's sprites on a big
    sprite sheet and loading them into that list."""
    def __init__(self):
        self.spritesheet = loadImage("patchconsprites.png", pygame.Color('#007888'))[0]
        # more code here

    def choose(self, dir, step, color):
        """This function returns an image from the sprite list."""



class Actor(pygame.sprite.Sprite):
    def __init__(self, name):
        pygame.sprite.Sprite.__init__(self)
        self.sprites = SpriteDict(name)
        self.image = self.sprites.choose('N', 0, 1)
        self.rect = self.image.get_rect()

我发现的所有教程都让我相信这段代码是正确的。有人看到我做错了什么吗?

<小时/>

编辑:搜索相关问题,我发现 image.convert() 不保留 alpha 像素,因此按照另一个问题中的建议,我将其更改为 image.convert_alpha()。然而现在,我只得到了色键的颜色,而不是黑色区域。我已经三次检查了颜色值,并且确信它是正确的。还有什么我可能会错过的吗?

最佳答案

好吧,我解决了我的问题。它涉及更改 SpriteDict 的内部结构,以便它不会调用 loadImage(),而是处理加载图像并在构造函数本身中应用透明度,如下所示:

class SpriteDict(object):
    def __init__(self, name):
        self.spriteSize = (35, 35)
        # change this old line:
        #self.spritesheet = loadImage("patchconsprites.png", (0,120,136,0))[0]
        # to this:
        self.spritesheet = pygame.image.load("./images/patchconsprites.png")
        self.sprites = []
        start = charCoords[name]
        char = list(start)
        image = pygame.Surface((35,35))
        for y in range(5):
            char[0] = start[0]
            for x in range(9):
                rect = (char[0], char[1], char[0]+self.spriteSize[0], char[1]+self.spriteSize[1])
                image.blit(self.spritesheet, (0,0), rect)
                # and put the transparency code here:
                image = image.convert()
                colorkey = image.get_at((0,0))
                image.set_colorkey(colorkey, RLEACCEL)
                # end new code
                self.sprites.append(image)
                char[0] += self.spriteSize[0]+2
            char[1] += self.spriteSize[1]+2

它使我的代码变得更加困惑,并且可能会慢一些,但它确实有效。如果有人能告诉我为什么它必须以这种方式工作,以及如何让它不那么难看,那就太好了。

关于python - 当在 Pygame 中使用 colorkey 透明度位 block 分割 Sprite 时,应该透明的区域是黑色的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3696114/

相关文章:

python - Pygame 迷宫一直卡住

python - 在pygame Windows中播放声音时出现问题

Python:解码问题(ascii)

python - 从 matplotlib pcolor 中删除边框

python - 使用 Python 读取 HTTP 服务器推送流

python - 宽东亚字符与格式功能的对齐

css - 单击图像的透明区域

python - 如何在Python中同时启动线程

3d - JavaFX 3D 透明度

html - 使它下面的一切和它本身透明的形状