Trocando a pele
Mudando a aparência do seu jogo ou programa

MP3 players têm, sistemas operacionais têm, até jogos podem ser encontrados com elas: as famosas skins. Não vamos ficar de fora dessa onda, vamos? Então, aqueça o Delphi e prepare-se para criar um sistema de troca de peles, de quebra aprendendo como utilizar arquivos zip em seus jogos.

As Skins

Skin (ou pele) é o nome dado ao conjunto de informações que compõem uma interface gráfica: imagens, textos informativos, controles. Um programa que suporte o uso de skins permite que seus usuários modifiquem a parte visual da maneira que melhor agradá-los, trocando, por exemplo, o tema do programa para ficção científica, fantasia ou a banda de música predileta.

O uso dessa técnica é muito comum em tocadores de MP3, que muitas vezes contam com milhares de skins disponíveis a seus usuários. E desenvolver algo assim, em Delphi, é muito mais simples do que possa parecer.

Começando

O objetivo imediato será criar um programa que comporte o uso de temas, portanto não iremos criar nada extremamente funcional: apenas uma pequena demonstração para testes. Portanto, a aplicação será apenas um formulário com três botões (que mostrarão mensagens configuráveis pelo skin) além de um botão para a troca de pele, um para sair do programa e uma imagem de fundo.

O primeiro passo é criar seis componentes TImage. A imagem de fundo têm as seguintes propriedades:

left = 0
top = 0
width = 640
height = 480
name = fundo

Os três botões de ação devem ser colocados lado a lado no centro do formulário, com os nomes bt0, bt1 e bt2 e as seguintes propriedades:

width = 80
height = 80
transparent = true

O botão de troca de skin deve ser colocado abaixo dos botões de ação, com as propriedades:

width = 200
height = 40
name = skin
transparent = false

O botão de saída deve ficar abaixo do botão anterior, com as propriedades:

width = 80
height = 25
name = sair
transparent = true

e finalmente, um TLabel deve ser colocado acima dos botões de comando (com o nome label1).

Lendo uma Skin

Os temas serão arquivos zip, onde as informações de cada item da interface gráfica serão gravadas. Dentro desse arquivo, existirá uma imagem para cada TImage criada anteriormente (com o mesmo tamanho e nome dados) e um arquivo chamado "texto.txt" que guardará informações de configuração.

Mas como ler os arquivos zipados? O Delphi não contém nenhuma forma nativa de ler esses arquivos, portanto será preciso alguma biblioteca externa. A TILT compilou uma DLL (zipDll) com funções básicas para leitura desses arquivos, além de algumas funções úteis como transformar um arquivo em uma imagem ou em uma lista de strings.

Para utilizar essa DLL, é preciso apenas importar a unit zipDllImport.pas na seção de uses do projeto ou formulário e chamar as suas funções. Lembre-se sempre de que, utilizando essa biblioteca, o arquivo zipDll.dll precisa sempre estar no mesmo diretório do executável do programa ou dentro da pasta "windows\system32" do sitema operacional.

Ler um arquivo zip consiste em uma sequência de passos bem definida: abrir o pacote de arquivos, ler quantos forem necessários e fechar o pacote. Portanto, todo o código de leitura de skin será executado dentro de um procedimento especial chamado lerSkin no formulário principal. Esse método receberá um parâmetro string (o nome do arquivo) e não retornará nenhum valor.

A implementação básica (para ler apenas o primeiro botão criado) é:

procedure TForm1.lerSkin(arq: string);
var
  i: integer;
  texto: TStrings;
begin
  zipCarregarArq(arq);
  //figuras de fundo/skin/sair
  zipLerParaTImage(fundo, 'fundo.bmp');
  zipFecharArquivo;
end;

Aumentá-lo para atualizar os outros botões é bem óbvio; basta colocar uma chamada ao método zipLerParaTImage, passando como parâmetros o destino da imagem e o nome do arquivo (que está guardado no pacote zip).

Mas fazer isso para cada componente é um grande exercício de digitação. Ao invés de criar uma linha de código para cada um dos botões, logotipos ou outras imagens do jogo, é possível utilizar um truque do sistema de interface gráfica do Delphi para, automaticamente, ler todas as imagens para todos os controles desejados (bastando que eles tenham um nome do tipo controleX, onde X é um número inteiro).

O truque consiste no uso da propriedade Controls que está presente nos componentes da VCL que lidam com painéis (ou seja, formulários, panels, notebooks, etc). Ela permite acessar os componentes que estão dentro desses controles, que no caso de serem uma TImage podem receber um gráfico qualquer do arquivo de skins.

Portanto, para colocar as imagens nos botões bt0, bt1 e bt2, ao invés de se utilizar diretamente o método zipLerParaTImage, antes chama-se o método zipAcharTImage que retorna o controle com o nome desejado e só então a imagem é colocada. A seção de código a seguir faz exatamente isso (ela deve ser colocada dentro do método lerSkin):

  //botões
  for i:= 0 to 2 do begin
    img:= zipAcharTImage('bt' + intToStr(i), form1);
    zipLerParaTImage(img, 'bt' + intToStr(i) + '.bmp');
  end;

Enquanto nesse pequeno programa demonstrativo esse código é maior do que o necessário para ler diretamente os três botões, para qualquer outra aplicação ele seria de grande ajuda. Na verdade, basta adicionar um botão para sentir a diferença: a única alteração necessária é aumentar o número de iterações do loop (de 2 para 3). O programa poderia ter cem botões e o código ainda seria esse.

E o melhor de tudo é que a função zipAcharTImage é recursiva, ou seja, ela não só procura pela imagem desejada dentro do controle, como também dentro dos filhos desse controle (ela pode encontrar uma TImage que esteja dentro de um painel que esteja dentro de um notebook que esteja no formulário principal, bastando para isso passar uma referência ao formulário). Incrível não é verdade?

Mais ZIPs

Construir o sistema de skins foi incrivelmente fácil: bastou criar uma pequena função que deve ser chamada sempre que se desejar carregar outro tema. O código desse artigo contém dois pacotes prontos para demonstração, além de algumas pequenas adições (como o código para formulário transparente) que são auto-explicativas.

O grande tesouro, porém, é a DLL para utilização dos arquivos zip. Isso porque ela não precisa ser usada necessariamente para o sistema de skins: é possível utilizá-la para programas comuns (que não precisarão inflar o executável gerado pelo Delphi com imagens, sons e outros recursos), sistemas de MODs (modificações em jogos), para ler arquivos de dados compactados, efim, para qualquer situação em que haja manipulação de arquivos.


Download...
Clique no link para fazer o download dos arquivos. Se sua assinatura do club TILT está para vencer, clique aqui e saiba como renová-la.

Fontes e DLLs
Imagens exemplo
Imagens exemplo
 
online