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.