segunda-feira, 23 de novembro de 2020

Como comecei a programar 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 estava se preparando para fazer as provas para o IME e ITA no fim do ano.

Eu era o responsável pelo computador do escritório. As minhas tarefas consistiam em digitar os textos das petições, montar planilhas de cálculos para alguns processos e gerenciar a relação de processos do escritório. Às vezes fazia algum serviço externo, tipo 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. 

O jogo era colorido, mas como o meu monitor era monocromático então a versão do jogo executada era em preto e branco conforme imagem abaixo.

No computador também estava instalado o compilador Turbo C. Um compilador é um programa que cria outro programa a partir da conversão de um código-fonte escrito em uma linguagem de programação. Existem diversas linguagens de programação com propósitos diferentes. 

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 poder consultar. Foi necessário muita criatividade e 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.

A conclusão deste jogo foi muito importante para mim. Agora 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".

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. 

Estes e outros programas que eu implementei estão disponíveis com código-fonte no meu projeto Genesis:

http://romerogames.blogspot.com/p/sumario-genesis.html

Em 1995, o computador do escritório deu problema e foi substituído por um PC 486 com monitor colorido. Com isso, eu passei a programar em uma máquina com bem mais poder de processamento. A área que eu tinha mais interesse era 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.

  • Formato PLG: Um arquivo de polígonos (PLG) 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.
  • Formato FIG: Um arquivo de figura (FIG) é 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.
  • Formato WLD: Um arquivo de mundo (WLD) 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 programado com a REND386:


Em 1997, eu queria praticar a linguagem de programação Pascal. Devido a complexidade da linguagem C, a linguagem Pascal era a mais utilizada para ensinar conceitos de programação nas faculdades nesta época por ser mais fácil.

Resolvi programar a continuação do jogo Mina em Pascal. A tela de abertura do jogo ficou assim:


Adicionei vários recursos neste jogo. Nesta tela inicial os símbolos da borda se movimentam gerando um efeito visual similar ao de um painel eletrônico. O Mina 2 tem modo de jogo para 1 ou 2 jogadores, possui várias fases, tem tela de instruções e tela dos recordes que são registrados em um arquivo externo para serem recuperados na próxima execução do jogo.

Além das minas escondidas que mudam de posição periodicamente, existem várias bolas que ficam quicando no cenário e que fazem o jogador perder pontos se colidir com elas. A imagem abaixo é de uma das fase do jogo:


Tem um fato muito curioso sobre a programação do jogo Mina 2. Eu escrevi praticamente todo o código Pascal da programação do jogo no papel. Somente depois de concluí-lo foi que eu passei para o computador. O código ficou espalhado em 6 folhas. O link abaixo é de um PDF com as 6 folhas:


Esta é a imagem de uma das folhas:

Outro programa que eu fiz em linguagem Pascal foi uma RPG Engine para ensinar alguns amigos a programar jogos de RPG em modo texto. O jogo de exemplo apresenta 4 salas, sendo que em cada sala é demonstrado um recurso diferente.

A RPG Engine mostra o uso de inventários, itens, diálogos baseados em palavras-chave, combate em turno e interligação entre as salas onde se passa o jogo.

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. Eu nunca joguei no PlayStation 1 e a primeira vez que eu joguei em um Nintendo 64 foi em 2006 quando eu comprei um usado.

Eu estava bastante focado nas minhas pesquisas de programação de jogos. Com a experiência adquirida, eu já estava decidido a criar minha própria empresa de desenvolvimento de jogos.


Sumário Retrogaming 

Nenhum comentário:

Postar um comentário