Quando si legge la documentazione per set_alpha si può leggere questo: Se il formato di superficie contiene per alfa dei pixel, allora questo valore alfa viene ignorato.
% Nel tuo caso, con un'immagine png, è un alfa per pixel. Quindi, devi gestire alpha "per pixel". Ad esempio, si può fare (non il codice migliore, ma facile da capire lavoro con png con no si solo trasparenza /.):
def change_alpha(img,alpha=255):
width,height=img.get_size()
for x in range(0,width):
for y in range(0,height):
r,g,b,old_alpha=img.get_at((x,y))
if old_alpha>0:
img.set_at((x,y),(r,g,b,alpha))
Attenzione, è "lento", a causa di gestire ogni pixel che non è a 0 (trasparente dal tuo png). Se il png ha più livelli di trasparenza, è necessario gestire la trasparenza con una formula migliore, in questo modo:
r,g,b,old_alpha=img.get_at((x,y))
img.set_at((x,y),(r,g,b,(alpha*old_alpha)/255))
E in questo caso, non modificare l'immagine originale, ma il lavoro su una copia per non perdere mai il vostro alfa originale.
spero che vi aiuterà
===================== EDIT =============== ==== Aggiungete un po 'di ottimizzazione, perché chiedere a commento
Con una certa metodologia di caching:
class image_with_alpha(object):
def __init__(self,name=None):
self.img=None
self.alpha={}
if name:
self.load_image(name)
def load_image(self,name):
self.img=pygame.image.load(name)
self.alpha[255]=self.img
#self.pre_compute_alpha()
def pre_compute_alpha(self):
for alpha in range(0,10):
self.alpha[alpha]=change_alpha(self.img,alpha)
def get_img(self,a=255):
try:
return self.alpha[a]
except:
self.alpha[a]=change_alpha(self.img,a)
return self.alpha[a]
e usarlo in questo modo: immagine carico:
image=image_with_alpha("test.png")
Blit con 60 per alpha:
screen.blit(image.get_img(60),(0,0))
E ora, è veloce spero
Ho una cornice nera con la prima formula, ma la seconda funziona bene :), tuttavia è molto lenta, il mio gioco scende a 25 fps ... – n0tis
qualsiasi idea di fare è più ottimizzato? – n0tis
Non so come funzioni il tuo gioco, e l'ottimizzazione di un tale codice dipende da come viene utilizzata. quanto tempo cambia l'alfa? Quanto sono grandi le immagini? Senza la programmazione di basso livello, puoi usare "cache" per i dati: userai più memoria, ma precalcerai alpha per l'immagine mostrerà grandi miglioramenti senza molti lavori. –