|
|||||||
Resolução
gráfica |
|||||||
A questão gráfica, numa conversão de um jogo asm/DOS para Delphi/Windows é bem mais complicada do que parece e exige decisões drásticas. Por exemplo: você vai rodar o jogo em modo janela ou fullscreen? Se optar pelo modo janela, poderá manter as mesmas dimensões do original mas se optar pelo modo fullscreen vai ter um problemão. A maioria dos jogos VGA foi projetada para rodar em XTs ou ATs com monitores VGA de 14 polegadas. Esses monitores eram pouco melhores que uma boa televisão e portanto as imagens se mostram razoáveis. Rodar um jogo com essas resoluções em monitores modernos de 17/19 polegadas, tela plana e alta definição é um desastre na certa. As imagens ficam grotescas e o jogador percebe as menores falhas. A opção mais acertada é usar o modo janela, porém o modo janela não permite emulação de determinadas resoluções (principalmente a que estamos usando) e portanto teremos que criar um sistema que simule os mesmos resultados. Vamos entender primeiro como funciona o modo 640 x 350 x 16 cores. Cada pixel é representado por um valor entre 0 e 15 e que define um índice numa matriz de cores (palete). Veja na listagem abaixo, que cada índice contém a definição RGB da cor.
Para manter a compatibilidade e ao mesmo tempo migrar para um sistema gráfico mais sofisticado, vamos adotar a estrutura de buffer, apresentada na seção sobre Delphi e assembler do club TILT. O link para ela é: Asm 4 Dlp. Neste esquema um buffer TBitmap funciona como se fosse a região de memória da tela, no segmento A000h.
Temos portanto o início da área de imagem e nele "pokearemos" os pixels exatamente como faríamos na programação asm, no entanto sem ter que se sujeitar ao modelo de plano de cor, das resoluções VGA. Faremos a conversão direta, na hora de setar o pixel, já que o buffer foi configurado para 32bits de profundidade de cor. Se você deseja entender um pouco mais como é formada uma imagem em modo VGA e como acessar diretamente os planos de cor, recomendo a leitura da seguinte página: Programando em modo VGA.. Agora só falta adaptar os caracteres do alfabeto e para isso usaremos mais uma matriz de bytes, onde cada letra é definida por 8 bytes e portanto cada caracter ocupará 8 x 8 pixels.
Ainda na inicialização do programa precisamos apontar para o endereço físico da matriz de letras e criar uma variável para conter o código do caracter a sem impresso no buffer de vídeo. Aproveitamos e criamos também uma variável para conter a cor default de escrita e a cor default de fundo:
Agora só falta criar a procedure que irá "imprimir" uma letra no buffer e faremos ela em assembly:
Ao mandar imprimir um caracter, a variável EndVid deve conter o endereça base, no buffer, onde o caracter será montado. Como cada caracter tem 8 x 8 picels e a tela 640 x 350 pixels podemos ter 80 colunas por 43 linhas de texto como padrão de impressão. Uma impressão de string, em Delphi, poderia ser feita assim:
Já a mesma impressão, escrita em assembly ficaria assim:
Divertido, não é mesmo? Se está com preguiça de digitar ou fazer um copy paste, clique aqui e baixe um zip com o fonte destas rotinas. |
|||||||