Dans mon jeu pygame, pour importer une image JPEG, j'utilise Ensuite, pour jouer avec la transparence de l'image (combien nous pouvons voir auge l'image), j'utilise Cependant, pour importer mon image PNG, qui ont un arrière-plan transparent, j'utilise Mais avec cette façon d'importer, je ne peux pas jouer avec la transparence générale à l'aide de convert () code>
http://www.pygame.org/docs/ref/surface .html # pygame.surface.convert p>
set_alpha () code>
http://www.pygame.org/docs/ref/surface .html # pygame.surface.set_alpha P>
convert_alpha () code>
http://www.pygame.org/docs/ref/surface .html # pygame.surface.convert_alpha p>
set_alpha () code>. Toute autre idée pour ajuster la transparence (combien nous voyons l'image)? P>
4 Réponses :
Utilisez set_colorkey (couleur) pour définir une couleur transparente. Par exemple, si vous avez une image d'une pomme, et tout sauf la pomme est la couleur noire, vous utiliseriez Apple.set_Colorkey (noir) et tout sauf la pomme serait transparente. De plus, si vous avez des difficultés à utiliser une image JPG, je vous suggère de le changer à un PNG, puis de faire .converver (). P>
Vous n'avez pas compris ma question. J'utilise déjà le fichier PNG. convert () code> fait un cadre noir sur mon png, donc j'utilise
convert_alpha code> à la place. Le problème clé est que je souhaite également configurer la transparence générale également (combien nous voyons toute l'image). Normalement, j'utilise
set_alpha () code> pour cet objectif. Toutefois, lorsque vous importez une image à l'aide de
convert_alpha () code> comme je le fais,
set_alpha () code> ne fonctionne pas. Je cherche un
set_alpha () code> alternative
Lorsque vous lisez la documentation pour % dans votre cas, avec une image PNG, c'est un alphas pixels. Donc, vous devez gérer Alpha "par pixel". Par exemple, vous pouvez le faire (pas le meilleur code, mais facile à comprendre. Travailler avec PNG sans transparence non / Oui): P> screen.blit(image.get_img(60),(0,0))
J'ai eu un cadre noir avec la première formule, mais le second fonctionne bien :), mais c'est très lent, mon jeu tombe à 25 fps ...
une idée de la rendre plus optimisée?
Je ne sais pas comment votre jeu fonctionne et l'optimisation d'un tel code dépend de la manière dont elle est utilisée. Combien de temps le changement alpha? Quelle est la taille des images? Sans programmation de niveau bas, vous pouvez utiliser "cache" pour les données: vous utiliserez plus de mémoire, mais précompute alpha for image montrera une grande amélioration sans beaucoup d'œuvres.
En fait, je l'utilise pour faire une apparition en douceur de l'objet dans mon jeu (l'objet apparaît progressivement), donc, lorsqu'un objet apparaît actuellement, la fonction est appelée sur chaque image.
Donc, vous pouvez faire défendre Self.Pre_Compute_alpha (). Il n'y a pas de solution facile car vous utilisez Python et Pygame et multiples alpha. Je vois deux autres variantes: utilisez le masque pour Blit, ou utilisez NUMPY pour fonctionner avec vos données. Peut-être, utilisez une alternative pygame également qui supporte le niveau de transparence. Allez de la chance avec ça;).
OK, j'ai la réponse pour vous. La fonction "Convert_alpha ()" de Pygame ne prend pas en charge par pixel alpha. Basé sur le paramètre Docs Alpha n'aura aucun effet. Cependant, vous pouvez contourner cette limitation en procédant comme suit. Si vous chargez votre image à l'aide de "Convertir ()", puis définissez Alpha, vous pouvez obtenir votre image de devenir transparente. Ensuite, tout ce que vous avez à faire est d'utiliser "Set_Colorkey (couleur de fond)" pour éliminer l'image d'arrière-plan. Soyez attentionné avec Colorkey, car toute couleur de l'image qui est définie comme la couleur colorée deviendra transparente. La Colorkey ne se soucie pas du pixel alpha afin que vous puissiez modifier l'alpha d'une image et utiliser colorkey en même temps.
Voici le code ... P>
#Loading Image image = pygame.image.load("test.png").convert() #Setting Alpha image.set_alpha(some desired alpha) #Set colorkey To Eliminate Background Color image.set_colorkey(some background color)
La solution la plus rapide est probablement d'utiliser la manipulation de tableau code> NUMPY code>, il devrait être suffisamment rapide pour éviter la mise en cache. Ce qui est vraiment lent sur le calcul de la valeur alpha pixel-wise est itération en python, tandis que Commencez par référencer le canal alpha de l'image dans un numpy code> est tout dans C.
numpy Code> Array. Cela créera un verrou sur la surface de l'image; Rappelons-nous que pour plus tard. Ensuite, prenez le minimum (pixel-wise) de votre alpha d'origine et une matrice pleine de celles (qui vous laisseront avec un tableau de seuls et des zéros), multipliez cela (pixel-wise) par votre alpha souhaité et copiez le résultat en arrière au canal alpha de l'image (toujours représenté par cette référence de tableau). Avant de pouvoir bliter l'image à l'écran, la référence de la matrice au tableau alpha doit être effacée, libérant le verrou sur la surface de l'image. P>
def change_alpha(img, alpha=255):
chan = pygame.surfarray.pixels_alpha(img)
chan2 = numpy.minimum(chan, numpy.ones(chan.shape, dtype=chan.dtype)) * alpha
numpy.copyto(chan, chan2)
del chan