quinta-feira, 16 de fevereiro de 2023

Memória 5 de 10: Programação de jogos

No início de 1993, eu estava com 14 anos quando comecei a trabalhar meio período no escritório de advocacia do meu pai. Assumi o lugar do meu irmão, pois ele se mudou para outra cidade para se preparar para as provas de admissão do ITA e do IME no fim do ano.

Eu era o responsável pelo computador do escritório. As minhas tarefas consistiam em digitar textos, montar planilhas de cálculos e gerenciar a relação de processos do escritório. Às vezes fazia algum serviço externo, como enviar cartas nos correios ou pagar contas no banco.

O computador do escritório era um PC AT 286 com monitor monocromático, sistema operacional DOS e HD de 20 MegaBytes. Ele era parecido ao computador desta foto:


No computador estava instalado o jogo SimCity que pertencia ao meu irmão. Esta é a caixa do jogo SimCity:

Depois que concluía todas as minhas tarefas do escritório, eu aproveitava o tempo livre para jogar SimCity. SimCity era um jogo bem interessante que prendia atenção devido as inúmeras possibilidades de ações existentes ao gerenciar uma cidade. De vez em quando eu imprimia o mapa da minha cidade para planejar a forma como eu iria expandi-la. 

SimCity possui versão colorida, mas como o meu monitor era monocromático então a versão do jogo executada era assim:


No computador também estava instalado o compilador Turbo C da Borland. A Linguagem de programação C é uma linguagem de propósito geral, mas que foi criada com o foco em desenvolvimento de programas de sistema, que são programas que interagem direto com o hardware. Ela fornece diversos recursos para manipulação direta da memória do computador, por isso ela se tornou muito popular na indústria de software, principalmente para a programação de jogos.

O meu irmão tinha um livro de Turbo C que apresentava os fundamentos da programação utilizando a linguagem C. Eu comecei a estudar este livro e a única coisa que pensava era em como transformar todos aqueles conceitos em um jogo.


Entretanto, o livro não continha nenhum material direcionado para a programação de jogos e nesta época não tinha internet para consultar. Foi necessário muita experimentação para conseguir chegar no meu objetivo. Mas eu consegui, e assim surgiu o meu primeiro jogo chamado Raven:

O jogador controla uma espaçonave chamada Raven e precisa destruir os blocos que caem na tela. A espaçonave é representada na tela pela letra "W". Eu escolhi esta letra porque ela me lembrava uma nave do Star Wars.

O jogo com código fonte está disponível neste arquivo: Raven.zip

A conclusão deste jogo foi muito importante para mim. Eu já possuía as estruturas essenciais para o código de um jogo que poderia expandir em outros projetos. Um admirável mundo novo surgiu diante de mim. Me empolguei e já estava com inúmeras ideias para outros jogos. Parei de jogar SimCity e qualquer tempo livre que eu tinha no escritório eu me dedicava aos meus projetos de jogos.

Um dos meus próximos projetos consistia em programar um jogo que pudesse ser jogado por duas pessoas simultaneamente. Este projeto se transformou no jogo "Mina". Cada jogador controla um personagem e deve pegar o item da sua cor que aparece em posições aleatórias na tela. Existem 5 minas que estão escondidas na área do jogo e que mudam de posição periodicamente. 

Ao pegar um item ganha 10 pontos e se colidir com uma mina explode e perde 5 pontos. Quem fizer 100 pontos primeiro ganha a partida. O jogador 1 usa as teclas WASD para se mover e o jogador 2 usa as setas do teclado. Neste jogo eu programei até o recurso de pause que é acionado pressionando a tecla "P".


O jogo Mina com código fonte está disponível neste arquivo: Mina.zip.

Vou comentar duas curiosidades sobre o jogo Mina. A primeira é que eu consegui programar uma música para ele. O computador PC possuía um alto-falante simples. Existia uma função no Turbo C chamada "sound" que ativa o alto-falante em uma determinada frequência. Eu encontrei uma tabela com as frequências correspondentes às notas musicais (DÓ, RÉ, MI…). Converti todas as notas musicais de uma música para as frequências equivalentes e fiz o controle do tempo usado por cada nota usando um contador interno do jogo que uso para sincronizar os eventos. 

A outra curiosidade é em relação às cores. No código em linguagem C do jogo eu defini as cores que os objetos do jogo iam usar. Cada jogador era representado por uma cor. Esta cor era usada para desenhar o personagem, o item, o nome e a pontuação de cada jogador. O jogador 1 era representado pela cor verde e o jogador 2 pela cor amarela. Os demais elementos do jogo usavam a cor vermelha. Só tinha um problema, o meu monitor era monocromático, ele exibia as cores como diferentes tonalidades da cor verde. Mesmo assim dava para distinguir os tons usados no jogo e eu sabia que um dia o jogo Mina seria executado em um monitor colorido.

Outro projeto que eu me dediquei foi a programação de um jogo de RPG. O meu jogo de RPG é baseado em uma história chamada "O Poço dos Desejos":  


Na tela do jogo é exibida uma descrição da sala atual onde o jogador se encontra e logo abaixo são exibidas as várias opções de ações disponíveis para aquela sala. O jogador pode escolher uma opção pressionando a tecla equivalente (1 a 5). Foi implementado também um sistema de combate por turno que é usado quando um inimigo é encontrado.

O RPG com código fonte está disponível neste arquivo: P_Desejo.zip.

Além desse jogos, eu programei diversos outros projetos menores experimentando com as ideias que surgiam na minha cabeça.

No início de 1995, o computador do escritório parou de funcionar e foi substituído por um PC 486 com monitor colorido. Com este PC mais potente, direcionei meus estudos para a programação de jogos em 3D.

Encontrei na livraria este livro sobre programação de realidade virtual:

O livro usava a REND386, que é uma biblioteca de funções em linguagem C para renderização 3D. A REND386 construía e manipulava um mundo virtual a partir de 3 tipos de arquivos: PLG, FIG e WLD.

  • PLG: É um arquivo de polígonos que contém as definições de um objeto 3D. Ele é composto por três partes: título do objeto, vértices e descritores de polígonos.
  • FIG: É um arquivo de figura que é usado para agrupar vários objetos PLG permitindo a representação de uma entidade 3D com hierarquia entre os objetos 3D, como uma pessoa por exemplo.
  • WLD: É um arquivo de mundo que permite a definição de um ambiente virtual 3D. Ele possui vários comandos para a definição de formas simples no mundo, especificação de cores dos planos e permite a inclusão de arquivos do tipo PLG e FIG dentro do ambiente virtual.

Este é um exemplo de ambiente 3D programado com a REND386:


Desde o fim de 1994 eu não estava jogando nenhum jogo. Eu fiquei totalmente por fora dos lançamentos do PlayStation 1 e do Nintendo 64. 

No início de 1995 eu comecei a praticar artes marciais nos fins de semana com alguns amigos: