J'ai un programme simple qui bloque une image d'arrière-plan dans la zone d'affichage, puis place une image-objet dans le coin supérieur gauche. Le sprite utilise la transparence des touches de couleur, mais lorsque je blitte l'image-objet, les zones qui doivent être transparentes sont noires. La couleur utilisée pour la clé de couleur est une couleur verdâtre, donc la touche de couleur fait au moins quelque chose.Lors de la fusion d'une image-objet avec transparence de couleur dans Pygame, les zones qui doivent être transparentes sont noires.
Voici mon module principal, qui a la plupart du code d'affichage:
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()
Mon autre module, 'sprites.py', traite des images de chargement et la construction d'objets d'images-objets:
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()
Tous les tutoriels que j'ai trouvés m'amènent à croire que ce code est correct. Quelqu'un voit ce que je fais mal?
EDIT: la recherche, je trouve autour des questions connexes qui image.convert() ne conserve pas pixels alpha, donc comme l'a suggéré dans une autre question, je l'ai changé image.convert_alpha(). Maintenant, cependant, au lieu de zones noires, je viens d'obtenir la couleur de la clé de couleur. J'ai triplé la valeur de la couleur, et je suis certain que c'est correct. Y at-il autre chose que je pourrais manquer?
Dans le constructeur de 'SpriteDict', j'ai appelé loadImage que j'ai oublié d'afficher. Il spécifie la clé de couleur comme '# 007888'. Désolé pour ça. – Max