Os
ambientes operacionais gráficos foram "pensados",
desde o projeto pioneiro da Xerox e
passando pelo estrondoso fracasso da Apple,
chamado Lisa, para aliar o poder de
processamento dos computadores à linguagem visual,
que o ser humano compreende com muito mais facilidade
do que a linguagem escrita. O propósito era sair
daqueles ambientes estéreis, onde predominava
a palavra, para algo (imagem) que traduzisse visualmente
idéias e conceitos. De preferência, reproduzindo
visualmente o mundo real, no que se convencionou chamar
metáforas visuais.
Da idéia
à prática decorreram anos e anos de experimentos,
sistemas alternativos e muita discussão, até
que fossem aceitos tais conceitos pela comunidade técnica,
que é geralmente impermeável a estes aspectos.
Isto não é nenhuma novidade, pois lidar
com comunicação visual demanda, em primeiro
lugar, uma boa dose de sociologia e observação
comportamental, coisa que nenhum programador ou analista
de sistema está apto a empreender sem uma prévia
preparação. Daí ter demorado tanto
a popularização de sistemas como o Windows
e seus primos mais destacados. E, mesmo nos dias atuais,
podemos considerar que os aspectos mais importantes
da comunicação, nesses sistemas, ainda
é sub-utilizada.
Quando
usamos um ambiente gráfico, como é o caso
do Windows, nada nos impede de extrapolar o visual dos
nossos programas. Na verdade, o único empecilho
aos devaneios dos autores é mesmo a falta de
criatividade e o preconceito com as formas que fogem
um pouco do padrão convencional.
Neste ponto
o Windows abriu uma "janela" de possibilidades incríveis,
mas que não vem sendo explorada de uma forma
mais intensa. Na verdade, é possível dizer
até que os programas gráficos, feitos
sob o DOS, são muito mais avançados estética
e funcionalmente falando do que os programas feitos
sob o próprio Windows. Aliás, não
existe nada mais "quadrado" do que um programa for
win.
Claro,
existem exceções e, neste caso específico,
elas podem ser encontradas exatamente onde seria de
se esperar: naqueles segmentos mais ligados à
produções de cunho cultural (notadamente
a música). Curioso como os programas gráficos
e de desktop publishing, que deveriam valer-se desses
recursos com muito mais propriedade, são os mais
"caretas" do mercado.
Lembro-me que ainda no tempo do Windows 3.1 (há
um século atrás, em termos de informática)
deparei com um dos primeiros programas que fugia do
esquemão "janelas": os players que acompanhavam
as recém lançadas placas de som Sound
Blaster de 16 bits. Fiquei maravilhado, pois alí
estava a prova de que era possível quebrar
certos tabus.
Apesar
destes primeiros exemplos de rebeldia visual ainda se
manterem dentro da estrutura retangular, mostrou-se
alí que poderíamos ter botões,
displays, controles deslizantes, etc, etc, etc, e que
esses controles não perdiam em eficiência
para os componentes normais do Windows. Ao contrário,
tornavam os programas mais bonitos, mais funcionais
e com um estilo gráfico marcante.
Um dos
destaques dessa fase inicial e que pode ser encontrado
até hoje, é o Kay Krause,
que produziu o primeiro software de uso gráfico
que literalmente mudou o conceito de "janela quadrada"
do Windows. Foi, é claro, considerado louco,
esquisito e um monte de outras coisas e seus programas,
da série KPT (Kay's Power Tools),
passaram a sofrer de uma relação amor/ódio
por parte dos usuários.
Mas o tempo
passou, novas experiências foram surgindo e hoje
já podemos encontrar aqui e alí, programas
que "escapam" da camisa de forma que o padrão
visual do Windows tenta impor. O próprio Key
Krause, vez por outra, ensaia vôos mais arriscados.
Podemos
então dividir em dois tipos, esses programas:
aqueles que, apesar de se mostrarem diferentes ainda
se mantém dentro da estrutura retangular das
janelas e aqueles de extrapolam até mesmo esses
limites. Dos primeiros apresento imagens de players,
um de música e outro de vídeo mpeg.
Do segundo
tipo tenho dois exemplos fantásticos: um do Key:7
uma ferramenta de aplicação de efeitos
sob imagens, que extrapola tudo o que é mais
sagrado, na programação Windows e um incrível
player de arquivos VQF, que por sí só
já constitui uma nova tendência em termos
de arquivo de sons (músicas digitalizadas). Só
esses poucos exemplos já dariam, cada um, uma
matéria extensa, mas por hora ficaremos apenas
nas imagens, pois o propósito aqui é outro.
Na verdade, esta matéria nasceu de uma questão
levantada na lista de discussão da TILT,
onde um leitor perguntou exatamente da possibilidade
de "sair" das janelas, na confecção de
um jogo.
Aqui no
club TILT foi apresentado, há algum tempo,
uma matéria onde se mostrava como, no projeto
editorial da TILT disquete, tínhamos
feito uma figura de abertura muito especial. Tratava-se
de uma mão segurando um disquete e, ao clicar
sobre o mesmo, o programa principal era acionado. Antes
porém o disquete abria a sua capa protetora,
numa animação feita com duas imagens.
O mais interessante é que a cada nova edição,
uma mão diferente era usada para segurar o disquete.
Embora
a solução que criamos para o caso dos
disquetes envolva apenas BitBlt e máscaras, não
é uma solução perfeita. Tivemos
que pesquisar um pouco, até encontrar uma resposta
mais adequada.
E ela surgiu
de um recurso especial do Windows (e por tabela do ambiente
gráfico) chamado de região. Uma região
nada mais é do que uma ára onde o sistema
operacional permite que os aplicativos (e ele mesmo)
escrevam (plotem gráficos/pixels). É em
essência o retângulo característico
das janelas, porém não precisa se necessariamente...
Exprimente,
num form novo, criar um botão e nele escrever
o seguinte processamento:
var
hR: THandle;
begin {cria uma Reigião elíptica}
hR:= CreateEllipticRgn(0,0,400,200);
SetWindowRgn(Handle,hR,True);
end; |
Bacaninha,
não é? Ora, mas um retângulo nada
mais é do que um polígono...
var
hR: THandle;
pontos: array[0..5] of TPoint;
begin
pontos[0].x:= 0; pontos[0].y:= 0; pontos[1].x:= 100; pontos[1].y:= 100; pontos[2].x:= 150; pontos[2].y:= 500; pontos[3].x:= 500; pontos[3].y:= 300; pontos[4].x:= 300; pontos[4].y:= 20; pontos[5].x:= 0; pontos[5].y:= 0; hr:= CreatePolygonRgn(Pontos,6,winding); SetWindowRgn(Handle,hR,True);
end; |
Pronto,
a imaginação é o limite...
Mas ainda
tem um porém: para imagens mais complexas fica
complicado calcular ou mesmo desenhar o polígono
à mão (além de que qualquer alteração
nos forçará a fazer todo o trabalho novamente.
Para esses casos, bolamos uma procedure que "varre"
uma image base (TImage), chamada Img
e cria uma máscara de região. Coloque-a
em qualquer lugar do seu programa e faça uma
chamada a ela no OnCreate.
Todos os elementos e componentes do jogo devem estão
estar dentro da área útil da imagem. Usamos
a cor fuchsia
para determinar a área transparente.
procedure TForm1.TransCriar; var MaskMap: TBitmap; LinRgn,SpRgn,WinRgn: HRGN; Lin,Col,Cor: integer; Sl: PByteArray; SpEsq,SpDir: integer; begin BorderStyle:= bsNone; BorderIcons:= []; MaskMap:= TBitmap.Create; MaskMap.Width:= Imp.Width; MaskMap.Height:= Imp.Height; MaskMap.Assign(Imp.Picture.Bitmap); MaskMap.Mask(clFuchsia); MaskMap.Canvas.CopyMode:= cmDSTINVERT; MaskMap.Canvas.Draw(0,0,MaskMap); MaskMap.PixelFormat:= pf8Bit; MaskMap.Canvas.CopyMode:= cmSRCCOPY; Height:= Imp.Height; Width:= Imp.width; WinRgn:= CreateRectRgn(0,0,0,0); for Lin:= 0 to Height-1 do begin LinRgn:= CreateRectRgn(0,Lin,0,Lin); Sl:= MaskMap.scanline[Lin]; SpEsq:= 0; SpDir:= 0; repeat Col:= SpEsq; Cor:= Sl[Col]; repeat Col:= Col + 1; until (Cor <> Sl[Col]) or (Col >= Width); SpDir:= Col - 1; if Cor <> 0 then begin SpRgn:= CreateRectRgn(SpEsq,Lin,SpDir+1,Lin+1); CombineRgn(LinRgn, LinRgn, SpRgn, RGN_OR); DeleteObject(SpRgn); end; SpEsq:= SpDir+1; until (SpDir >= Width); CombineRgn(WinRgn, WinRgn, LinRgn, RGN_OR); DeleteObject(LinRgn); end; SetWindowRgn(Handle,WinRgn,True); MaskMap.Free; end;
|
No pacote
zipado, no final desta página, tem a imagem do
computador abaixo e um txt com a procedure, para você
testar e brincar à vontade. De agora em diante,
seus jogos em Delphi terão aquele "ar"
profissional que só os grandes desenvolvedores
conseguem dar.