gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:15:02 31 4
gpt4 key购买 nike

我有一个简单的程序,可以将背景图像传输到显示区域,然后在左上角放置一个 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com