Mostrando postagens com marcador TurboC. Mostrar todas as postagens
Mostrando postagens com marcador TurboC. Mostrar todas as postagens

quinta-feira, 16 de fevereiro de 2023

Memory 5 of 10: Game programming

In early 1993, I was 14 when I started working part-time at my father's law office. I took my brother's place, as he moved to another city to prepare for the ITA and IME admission exams at the end of the year.

I was in charge of the office computer. My tasks consisted of typing texts, creating spreadsheets and managing the list of lawsuits. Sometimes I did some tasks outside the office, like sending letters at the post office or paying bills at the bank.

The office computer was a PC AT 286 with a monochrome monitor, DOS operating system and a 20 Megabytes HDD. It looked like the computer in this photo:


The SimCity game that belonged to my brother was installed on the computer. This is the SimCity game box:

After I completed all my office tasks, I used my free time to play SimCity. SimCity was a very interesting game due to the many actions available when managing a city. Sometimes I would print my city map to plan how I would expand it.

SimCity has a color version, but since my monitor was monochrome, my game version was like this:


Borland's Turbo C compiler was also installed on the computer. The C programming language is a general purpose language, but it was created with a focus on developing system programs, which are programs that interact with hardware. It provides several features for direct manipulation of computer memory, which is why it has become very popular in the software industry, mainly for game programming.

My brother had a Turbo C book that showed the fundamentals of programming using the C language. I started studying this book and the only thing I could think of was how to turn all those concepts into a game.


However, the book did not contain any material aimed at game programming and at this time there was no internet to search. It took a lot of experimentation to get to my goal. But I did, and so my first game called Raven was born:

The player controls a spaceship called Raven and needs to destroy the blocks that fall on the screen. The spaceship is represented on the screen by the letter "W". I chose this letter because it reminded me of a Star Wars ship.

The game with source code is available in this fileRaven.zip

Completing this game was very important to me. I already had the essential elements of code for a game that I could expand into other projects. A brave new world opened before me. I got excited and already had countless ideas for other games. I stopped playing SimCity and any spare time I had at the office I devoted to my game projects.

One of my next projects was to program a game that could be played by two people simultaneously. This project turned into the game "Mina". Each player controls a character and must pick up the item of their color that appears in random positions on the screen. There are 5 mines that are hidden in the game area and that change position periodically. 

Picking up an item earns 10 points and colliding with a mine explodes and loses 5 points. Whoever scores 100 points first wins the game. Player 1 uses the WASD keys to move and player 2 uses the arrow keys. In this game I even programmed the pause feature that is triggered by pressing the "P" key.


Mina game with source code is available in this archive: Mina.zip.

I'm going to comment on two curiosities about the Mina game. The first is that I managed to program a song for it. The PC had a simple speaker. There was a function on the Turbo C called "sound" which turns the speaker on at a certain frequency. I found a table with the frequencies corresponding to the musical notes. I converted all the musical notes of a song to the equivalent frequencies and controlled the time used by each note using an internal game counter that I created to synchronize events.

The other curiosity is in relation to the colors. In the game's C language code I defined the colors that the game objects would use. Each player was represented by a color. This color was used to draw each player's character, item, name and score. Player 1 was represented by the color green and player 2 by the color yellow. The rest of the game's elements used the color red. There was only one problem, my monitor was monochrome, it displayed colors as different shades of green. But I knew that one day the Mina game would run on a color monitor.

Another project I dedicated myself to was programming a RPG game. My RPG game is based on a story called "The Wishing Well":  


A description of the current room is displayed on the game screen and below it are displayed the various options for actions available for that room. The player can choose an option by pressing the equivalent key (1 to 5). A turn-based combat system has also been implemented that is used when an enemy is encountered.

The RPG with source code is available in this file: P_Desejo.zip.

In addition to these games, I programmed several other smaller projects, experimenting with ideas that popped into my head.

In early 1995, the office computer stopped working and was replaced by a PC 486 with a color monitor. With this more powerful PC, I directed my studies towards 3D game programming.

I found this book on virtual reality programming in the bookstore:

The book used REND386, which is a library of C language functions for 3D rendering. REND386 generated and manipulated a virtual world using three types of files: PLG, FIG and WLD.

  • PLG: It is a polygon file that contains the definitions of a 3D object. It is composed of three parts: object title, vertices and polygon descriptors.
  • FIG: It is a figure file that is used to group several PLG objects allowing the representation of a 3D entity with hierarchy among 3D objects, such as a person for example.
  • WLD: It is a world file that allows the definition of a 3D virtual environment. It has several commands for defining simple shapes in the world, specifying plane colors and allowing the inclusion of PLG and FIG files within the virtual environment.

This is an example of a 3D environment programmed with REND386:


Since the end of 1994 I wasn't playing any games. I missed out on PlayStation 1 and Nintendo 64 releases.

In early 1995 I started practicing martial arts on weekends with some friends:

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: