tutorial - python pygame documentation
Pygame: desvanecimiento/desvanecimiento de la superficie (1)
Como esto podría servir como referencia futura para alguien, hice lo sugerido por @Xymostech: crear otra superficie con el mismo tamaño del texto renderizado y aplicar el alfa en esa superficie, usando .set_alpha()
.
Versión actualizada aquí: https://gist.github.com/rshk/5072375
Estoy escribiendo una aplicación que muestra una lista de mensajes que aparecen en una ventana de PyGame; para hacer las cosas más bonitas, decidí agregar un bonito efecto de entrada / salida de desvanecimiento al texto.
El problema es que: SDL solo permite alfa por píxel o por superficie, no ambos. Así que escribí una función que recalcula los pixel alphas en función de la opacidad de "capa" deseada, pero por supuesto es muy, muy, muy lenta (incluso en un núcleo i7 @ 2.7GHz, está cayendo a ~ 10FPS):
def apply_alpha(surface, alpha):
for x in xrange(surface.get_width()):
for y in xrange(surface.get_height()):
color = surface.get_at((x, y))
color.a = int(color.a * alpha)
surface.set_at((x, y), color)
return surface
Ejemplo completo aquí: https://gist.github.com/rshk/5072173 (no es la aplicación real, solo un ejemplo relevante)
¿Hay alguna forma de acelerar las cosas? Veo que es posible acceder directamente al búfer subyacente, que evita la creación de instancias de los objetos Color
, pero parece ser aún más lento actualizar los alfas de esa manera, llamando al método BufferProxy.write()
.
Tal vez algo con la aceleración de hardware ayudaría? Creo que el ideal aquí sería aplicar el alfa mientras se pasa la superficie al fondo, pero no soy muy experto en este tipo de cosas.
Nota: cambiar el color del texto no es una posibilidad, ya que el fondo puede no ser siempre negro.