Posted 7 hours ago
Posted 2 months ago
[Flash 9 is required to listen to audio.]

 Final Fantasy 7 - Fight On (Boss Theme) by CarboHydroM

Posted 7 months ago

Paleta de cores no Pygame

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…

Blanka vs Blanka

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

Street of Rage

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.

Photoshop Palette

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.

Paleta de Cores