Kiedy czytasz dokumentację set_alpha można przeczytać: Jeśli format Surface zawiera alfa per pixel, to wartość alfa będą ignorowane.
% W twoim przypadku, z obrazem png, jest to alfabet na piksel. Musisz więc zarządzać alfą "na piksel". Na przykład, można to zrobić (nie najlepsze kod, ale łatwe do zrozumienia Praca z png z nie/tak tylko przejrzystości.):
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))
należy zachować ostrożność, to „wolno”, bo uda Ci każdy piksel, który nie ma wartości 0 (przezroczysty z twojego png). Jeśli png ma wiele poziomu przejrzystości, należy zarządzać przejrzystość lepszej formuły, tak:
r,g,b,old_alpha=img.get_at((x,y))
img.set_at((x,y),(r,g,b,(alpha*old_alpha)/255))
I w tym przypadku, nie modyfikować oryginalnego obrazu, ale praca na kopii nie stracić oryginalna alfa.
Mam nadzieję, że to pomoże
===================== EDIT =============== ==== Dodać trochę optymalizacji ponieważ zmierza w komentarzu
z pewnym metodologii buforowania:
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]
i używać go tak: obraz obciążenie:
image=image_with_alpha("test.png")
Blit z 60 do alfa:
screen.blit(image.get_img(60),(0,0))
A teraz, to mam nadzieję, że szybko
Miałem czarną ramkę z pierwszą formułą, ale druga działa dobrze :), jednak jest bardzo powolna, moja gra spada do 25 fps ... – n0tis
każdy pomysł na zrobienie jest bardziej zoptymalizowany? – n0tis
Nie wiem, jak działa twoja gra, a optymalizacja takiego kodu zależy od sposobu jego użycia. Ile czasu zmieniła alfa? Jak duże są obrazy? Bez programowania niskopoziomowego możesz użyć "cache" dla danych: Użyjesz więcej pamięci, ale prekomputer alfa dla obrazu pokaże wielką poprawę bez wielu prac. –