Quem não se lembra de jogar Street Fighter com um amigo, e acontecer dos dois escolherem o mesmo personagem? Sempre se corria o risco de ficar com um Blanka azul…

Ou jogar Street of Rage e descobrir que só existem meia dúzia de inimigos, só que com muitas cores diferentes.

Eu sempre me decepcionava…
Bem, a idéia desse post e mostrar como usar o recurso de paleta de cores no Pygame. Esse é um recurso muito utilizado para se economizar sprites.
O conceito é bem simples e vou exemplificar aplicando uma paleta de cores gerada pelo Photoshop.

Uma paleta de cores gerada pelo Photoshop (.act), pode ter no máximo 256 cores e possui a seguinte estrutura:
[R, G, B, R, G, B, R, G, B, R, G, B, R, G, B, ...]
Uma sêquencia de bytes com os valores de R, G e B.
Já uma paleta de cores do Pygame, possui a seguinte estrutura:
[(R, G, B), (R, G, B), (R, G, B), (R, G, B), ...]
Uma sêquencia, onde cada posição é composta por uma tupla (ou sêquencia) dos valores de R, G, e B.
Então, o trabalho é ler o arquivo .act e agrupar os valores de R, G e B em tuplas.
from struct import unpack
def load_palette(filename):
act = open(filename)
palette = []
# lê o máximo de cores de uma paleta
for i in range(256):
# lê 3 bytes (RGB)
color = act.read(3)
# se não leu nada, termina
if not color:
break
# se leu menos de 3 bytes, tem coisa errada
if len(color) != 3:
raise SyntaxError, "Bad Photoshop palette file!"
# monta um "triplet" convertendo cada byte em inteiro
palette.append([ord(c) for c in unpack("ccc", color)])
act.close()
return palette
Agora, é só criar uma imagem e setar a paleta de cores.
image = pygame.image.load("leona.png")
palette = load_palette("blonde.act")
image.set_palette(palette)
Esse é um exemplo bem simples e não era minha intenção me aprofundar nos fundamentos do Pygame, por isso, só coloquei os trechos de código relativos ao post.
Um exemplo completo, utilizando o mesmo conceito, pode ser obtido aqui.
