VGA – Tutorial 17 – Denthor

--==[ PARTE 17 ]==--

Autor: DENTHOR do ASPHYXIA
Atualizado por Snowman
Traduzido por Krull >>> tradução revisada e atualizada em 2020

Para obter os programas mencionados neste tutorial, por favor baixe o zip com a versão antiga do tutorial, neste link.

Introdução

Olá, todo mundo. É ano novo, mas as festas já terminaram e é hora de programar de novo!

Meu servidor de email morreu. Vários sysadmins decidiram que era hora de fazer um upgrade no SO, e acabaram detonando o HD :-(… Isso significa que requisições de listas não estão funcionando nesse momento, e provavelmente perdi muitos emails.

O endereço denthor@beastie.cs.und.ac.za ainda é a conta para se escrever, e, assim espero, o servidor de email voltará ao ar num futuro próximo.

Há várias conversões de C/C++ do meu tutorial, as melhores delas parecem ser do Snowman… ele percorre os arquivos texto atualizando para C++ (e parece apontar alguns erros também ;-), e também faz um código documentado em C++… muito bom.

Também, meus tutorias estão sendo colocados num site na web… ele ainda está em construção, mas vá em http://www.cit.gu.edu.au/~rwong meu site fica em http://goth.vironix.co.za/~denthor … está muito ruim atualmente, alguém quer escrever um legal para mim? 😉

Estou quase acabando de fazer o novo jogo da Asphyxia – vou deixar vocês saberem quando estiver completo.

O Tutorial 16 trava com bitmaps grandes… o jeito de resolver isso é diminuir a precisão do ponto fixo de 256 para 128… então você pode ter bitmaps de até 512 pixels de largura. Vou colocar uma rotina de escala atualizada na unit gfx4.pas.

Este tutorial é sobre uns poucos efeitos de demos (morphs de pixel e estática)… depois desse, vou falar mais sobre teoria… talvez algo mais sobre 3D, tal como “gourad shading”, etc… Comentários?

Se você gostaria de me contactar, ou ao time, há muitos modos que você pode fazê-lo:
1) Escrever uma mensagem para Grant Smith/Denthor/Asphyxia em email privado na ASPHYXIA BBS.
2) Escrever para:
Grant Smith
P.O.Box 270 Kloof
3640
Natal
África do Sul
3) Ligar para mim (Grant Smith) no número (031) 73 2129
(deixe uma mensagem se você ligar quando eu estiver na faculdade)
Ligue para +27-31-73-2129 se você está ligando de fora da África do Sul (a conta é sua ;-))
4) Escrever para denthor@beastie.cs.und.ac.za
5) Escrever para asphyxia@beastie.cs.und.ac.za para falar com todos nós de uma vez.

OBS1 : Se você é um representante de uma companhia ou BBS e quer que a ASPHYXIA faça um demo para você, mande um email pra mim; podemos discutir.
OBS2 : Se você fez/tentou fazer um demo, MANDE PARA MIM! Estamos nos sentindo muito solitários e queremos encontrar/ajudar/trocar código com outros grupos de demos. O que você tem a perder? Mande uma mensagem aqui e podemos ver como transferir. Nós realmente queremos ouvir de você.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Morph de Pixels

Você, alguma vez, já deitou suas costas na grama e olhou para o céu com nuvens lá em cima? Se já, você provavelmente já viu as nuvens se mexendo juntas e criando formas incríveis… aquela nuvem mais aquela outra juntas fazem uma baleia… um navio… um rosto.. etc.

Não podemos fazer melhor que a mãe natureza, mas com certeza podemos imitar. O efeito que vou mostrar a você é quando vários pixels de diferentes pontos se movem juntos e criam uma figura.

A teoria por trás é simples: Cada pixel tem bits de dados associados com ele, os mais importantes sendo:

Essa é minha cor
Esse é onde eu estou
Isso é onde eu quero estar.

O pixel, mantendo sua cor, vai de onde ele está para onde ele quer estar. Nosso problema principal é como ele se move de onde ele está para onde ele quer estar. Uma aproximação seria dizer “se seu destino está acima, decremente seu valor de y, se está à esquerda, decremente o valor de x, e assim por diante.”

Isso seria mal. O pixel iria se mover somente em ângulos fixos, como pode ser visto abaixo:

            Dest   O-----------------\
                                      \  <--- Caminho
                                       \
                                        \
                                         O Source

Não parece muito legal, né? Os pixels levariam tempos diferentes para chegar ao destino, considerando que queremos mesmo é que eles cheguem ao mesmo tempo, ou seja:

 Dest 1   O-------------------------------O Source 1
 Dest 2   O-----------------O Source 2

Os Pixels 1 e 2 devem chegar a seus destinos ao mesmo tempo para que o efeito fique melhor. O modo que se faz isso é definindo o número de “pulos” necessários para se chegar da origem até o destino. Por exemplo, digamos que o pixel 1 precise de 64 hops para chegar ao seu destino, e o mesmo para o ponto 2, e os dois chegariam ao mesmo tempo, mesmo que o pixel 2 esteja mais perto.

A próxima pergunta é, como movemos os pixels numa linha reta? É mais fácil do que você acha…

Digamos que para cada pixel, x1,y1 é onde ele está, e x2,y2 é onde ele quer estar.

(x2-x1) = A distância no eixo X entre os dois pontos
(y2-y1) = A distância no eixo Y entre os dois pontos

Se fizermos o seguinte:

dx := (x2-x1)/64;

Conseguimos um valor em dx que é muito útil. Se adicionarmos dx a x1, 64 vezes, o resultado seria x2! Vamos checar…

dx = (x2-x1)/64
dx * 64 = x2-x1 { Multiplicar os dois lados por 64 } 
dx * 64+x1 = x2 { Adicionar x1 aos dois lados }

Isso é coisa de matemática de segundo grau, e é bem auto-explicativo. Então o que temos é o movimento em X para cada frame que o pixel tem que passar. Encontramos o movimento em Y da mesma maneira.

dy := (y2-y1)/64;

Então nosso programa é como segue:

Seta os valores de x1,y1 e x2,y2
dx:= (x2-x1)/64;
dy:= (y2-y1)/64;

for loop1:=1 to 64 do BEGIN
  putpixel (x1,y1)
  wait;
  clear pixel (x1,y1);
  x1:=x1+dx;
  y1:=y1+dy;
END;

Se houvesse um compilador que pudesse utilizar o pseudo-código acima, moveríamos o pixel de x1,y1 para x2,y2 em 64 passos.

Então, o que temos que fazer é setar um array de muitos pixels com essa informação, e mover todos de uma vez… voila, temos um morph de pixels! Geralmente é melhor usar um bitmap que define a cor e os destinos dos pixels, e depois espalhá-los aleatoriamente pela tela.

Por que não usar morph de pixels num objeto-base em 3D? Seria o trabalho de um momentinho adicionar um eixo Z ao programa acima

O programa de amostra usa matemática de ponto fixo para conseguir
altas velocidades, mas é basicamente o algoritmo acima.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Estática

Uma tela de estática foi um dos primeiros efeitos que a Asphyxia fez. Nós nunca o lançamos na verdade, porque não conseguíamos achar onde encaixá-la. Talvez você possa.

O modo mais fácil de se conseguir uma tela de estática é sintonizar sua TV num canal que não pega nada… você tem até um efeito sonoro legal também. Aquelas pessoas que construíram as TV’s sabiam mesmo como programar 😉

Para nós num PC, porém, não é tão fácil gerar uma tela cheia de estática (a menos que você precise desesperadamente de um monitor novo)

O que fazemos é isso:

Setar as cores 1-16 com vários tons de cinza.
Preencher a tela com pixels aleatórios entre as cores 1 e 16
Rotacionar a paleta de cores de 1 a 16.

É só isso! Você tem uma tela de estática! Para se conseguir duas imagens numa tela de estática, tudo o que você precisa fazer é um fade up/down nas cores específicas que você vai usar para a estática em uma de suas imagens.

Uma coisa legal da tela de estática é que ela é apenas rotações na paleta de cores… você pode fazer um monte de coisas em primeiro plano ao mesmo tempo (como um scroller).

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Fechando

Bem, é isso aí… como eu digo, vou fazer mais coisa teórica no futuro, já que efeitos individuais de demos podem ser inventados, se você souber o básico.

Note a putpixel nessa unit GFX3.PAS… ela é muito rápida… mas lembre-se: só de chamar uma rotina já se perde alguns tempos de clock… então encaixe os putpixels dentro do seu programa se precisar. A maior parte do tempo não se precisa de putpixel, no entanto.

A PCGPE ][ vai sair em 10 de Fevereiro. Todos os tutoriais novos estarão nela (se você já não estiver lendo dela agora! 😉 )… pegue uma cópia, é muito útil de se ter à mão.

Descobri que esses tutoriais estão sendo distribuídos em revistas… por favor lembre-se de que Denthor e Asphyxia têm direitos autorais completos da série (como mencionado anteriormente na série), e se você quiser usar uma versão numa revista, CONTACTE-ME PRIMEIRO… eu provavelmente vou também modificar/cortar as coisas desnecessárias… além disso, você não deve alterar os arquivos sem minha permissão (by Krull: eu pedi antes de traduzir. Para ser mais exato, consegui a permissão no dia 14 de fevereiro de 2001. Nossa, quase dois anos e ainda não terminei de traduzir a série toda…), ou pelo menos deixe uma cópia do original junto com a atualização. Talvez eu até pudesse começar uma coluna numa revista ou outra coisa do gênero 🙂

Sinto por isso, mas é duro de dizer…

Estou escrevendo uma coluna para a lista Demuan, uma revista eletrônica da Florida… pegue-a em ftp.eng.ufl.edu… eu escrevi vários artigos, todos em design estilo quote.

Tchauuuuuu….

  • Denthor
  • Krull

A Nova Krull's HomePage