PyGame: durchscheinend sprites mit per-pixel alpha
Ist es möglich, zur Anzeige von PyGame Oberflächen mit steuerbaren alpha? Ich möchte eine Oberfläche mit seinen eigenen pro pixel alpha und anzeigen mit variablem Niveau von Transluzenz, ohne die Oberfläche Daten und halten Sie die Transparenz intakt, d.h. die Objekte auf der Oberfläche halten würde, Ihre Formen, sondern Ihre "Inhalte" immer mehr oder weniger durchscheinend.
In anderen Worten: ich will verbinden, per-pixel alpha aus dem Quell-Bild mit pro-Oberfläche alpha-berechnet auf die Laufzeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Pygame-Dokumentation sagt, dass man nicht kombinieren Oberfläche alpha mit per-pixel alpha, aber wenn man mit Pygame 1.8.1 oder neuer können Sie umgehen dies, indem Sie die
special_flags
parameter.blit()
.Hier ist, wie ich es gemacht habe:
Der Weg ist das erstellen einer zweiten Fläche der gleichen Größe wie die erste, und blit es auf der ersten mit RGBA-Multiplikation. Durch die R -, G-und B-Komponenten des zweiten Bildes gleich 255, die Multiplikation nicht auf die Farbe des Bildes, aber es wird so skaliert, dass der alpha-Kanal, der durch den angegebenen alpha-Faktor.
Beachten Sie, dass die obige Methode unterscheidet sich von der Berufung
set_alpha()
in diesemset_alpha()
rückgängig gemacht werden können durch aufrufen vonset_alpha(255)
. Wenn Sie mit der oben genannten Methode wird das Resultat der pixel alphas jedes pixel geändert wird, so dass der Prozess nicht einfach rückgängig gemacht.self
solltes
?Ja, Sie können. Die Dokumentation der Oberfläche Klasse erklärt, wie es zu tun. Es läuft darauf hinaus, in zwei Fällen nur:
Entweder Sie setzen einen flag, der während der Erstellung der Oberfläche, Objekt:
Oder geben Sie einen alpha-Kanal, um eine Oberfläche, die nicht eins noch:
In der Dokumentation von pygame.Bild-Modul sagt, dass die Anwendung convert_alpha ist notwendig für PNGs mit Transparenz.
Wenn Sie möchten, können Sie ändern Sie den alpha-Wert für jedes pixel mit den Modulen zeichnen und surfarray. Bei der Angabe einer Farbe, verwenden Sie dann ein Tupel von vier ganzen zahlen: (rot, grün, blau, alpha). Der alpha-parameter reicht von 0 (völlig transparent) bis 255 (völlig undurchsichtig).
Nachdem Sie beide PyGame und SDL-Dokumentationen kam ich zu dem Schluss, dass das, was ich fragte, war nicht machbar in PyGame mit standard-Funktionen.
SDL docs Zustand, per-pixel alpha-und pro-Oberfläche alpha nicht zusammen mit der ehemaligen die immer den Vorrang. Der einzige Weg, um die Wirkung zu erreichen ich möchte durch das schreiben, die einen code-updates per-pixel alpha-Werte der Quelle, der Oberfläche vor dem blit -.
Wenn Ihr Eingang Bild hat pro pixel alpha aktiviert, aber nur mit einem einzigen bit für die Transparenz (zB, .png-sprites mit transparentem hintergrund oder text), können Sie konvertieren die durchsichtigen hintergrund, um ein colorkey-alpha-hintergrund ziemlich gut, und verwenden Sie dann set_alpha (), um mischen Sie die gesamte textur auf was auch immer.
Dies ist ein quick-and-dirty helper-Funktion, die ich für das verblassen von text-Effekte und andere Dinge:
Ein paar andere tricks, die möglicherweise dieses problem lösen könnte: