# Programação de jogos eletrônicos

A programação de jogos eletrônicos é uma sub-área do desenvolvimento de jogos eletrônicos. É efetuada por programadores de jogos profissionais, por hobbystas ou por estudantes de programação.

## Processo

O processo de programação de um jogo começa com uma série de experimentos e desenvolvimento de protótipos coordenados pelo game designer que é responsável por criar as ideias.

### Protótipo

Escrever protótipos de características as ideias da programação não tem nada a ver com o quê esta escrito, as ideias de um jogo são as etapas​ iniciais do processo, nessa fase são testados a eficiência dos algoritmos. A fase de criação de protótipos também se estende ao longo de toda a programação do jogo.
Os protótipos não precisam ser necessariamente escritos na linguagem de programação usada no jogo, eles são apenas conceitos e testes de ideias que podem ser usados no produto final.
Eles podem utilizar uma ferramenta de RAD (rapid application development) para agilizar o desenvolvimento e focalizar-se apenas nos conceitos do programa e não em paradigmas de linguagem de programação. Ao final esse protótipo tem que ser portados para a ferramenta final usada no jogo.

### Game design

Apesar do papel principal do programador não ser o game design, eles podem contribuir para o mesmo, com troca de informações entre outras áreas do desenvolvimento.

### Linguagem de programação

A partir do momento em que se decide o conceito do jogo, também é decidido a linguagem de programação que será usada. A escolha depende de vários fatores como a familiaridade dos programadores com a linguagem, a portabilidade, etc.
Atualmente a linguagem de programação mais usada para desenvolvimento de jogos é C++, principalmente em grandes jogos de videogames, no geral são usados as linguagens orientada a objetos. Alguns jogos podem também usar linguagem Assembly para priorizar principalmente a performance, com uma comunicação direta com o hardware.
No caso mobile, os jogos nativos para o sistema iOS são em Objective-C e para Android são em Java. As engines facilitam muito, permitindo o jogo ser desevolvido para ambos os sistemas.
No caso web, os jogos cada vez mais são desenvolvidos em linguagens de script como HTML5 e/ou JavaScript. Quando se trabalha com engine também é comum criar algumas versões reduzidas da linguagem C, ou usar existentes como Lua e Python.

### Ferramentas de programação

Um dos pontos importantes da programação de jogos é qual ferramenta usar para o desenvolvimento. Existem inúmeras ferramentas grátis ou pagas que realizam inúmeros tipos de desejos para a programação de jogos. Essas ferramentas podem ser simples bibliotecas, grandes APIs, ou game engines.
Existem ferramentas específicas para gráficos, sons, input, AI, física, etc. Existem também ferramentas que englobam todos esses casos. Também existem ferramentas que são multiplataformas, que com o mesmo código podem criar jogos para diferentes sistemas operacionais e consoles.

### APIs

Existem várias APIs usadas para a programação de jogos, as mais populares para computadores são o DirectX e o OpenGL, a maioria das engines e jogos são criadas em cima dessas APIs. Consoles possuem APIs próprias, mas sua programação é semelhante para facilitar a portabilidade.

## Estrutura do código

Jogos são softwares, que realizam ações através de comandos fornecidos pelos usuários, que podem ser em formato de texto ou conter interfaces gráficas. Contendo partes do código que podem ser acessadas pelos comandos dos usuários e partes que são acessíveis apenas pelo código interno do jogo.

### Performance e uso de memória

Quando se programa um jogo deve-se fazer uma projeção da performance e do uso de memória que a aplicação irá fazer. Não se pode fazer códigos que sobrecarreguem o processador ou a GPU, também não se pode sobrecarregar a memória RAM carregando todos os bytes com o jogo de uma só vez.

### Loop principal

Todos os jogos em geral contém um loop principal, esse loop é o que dá vida ao jogo, quando este loop chega ao fim o jogo também chega ao fim. O que este loop faz é periodicamente verificar os comandos do usuários e realizar ações, ele tem o seguinte formato:

### Classes e objetos

A programação orientada a objetos facilita o desenvolvimento do jogo por permitir ao programador a abstração de classes e subclasses (polimorfismo) e a criação de objetos. Algumas classes já podem vir embutidas dentro da própria API, principalmente as que tratam imagens, sons, modelos 3D, etc. já as classes que fazem parte do jogo em si são criadas pelo programador.

#### Tempo

Na parte de tempo temos 3 tipos de classes, as tarefas (tasks), os eventos, e os intervalos. As tarefas são ações que são executadas infinitamente no loop, os eventos são ações que são executadas apenas quando acontece algum pedido de comando, e os intervalos são pequenas porções de tarefas que são executadas apenas durante um determinado período de tempo.

#### Input

São responsáveis pela checagem da entrada de algum comando feito pelo usuário, como apertar uma tecla do teclado, mover o mouse, direcionar um joystick, etc. São os comandos de input que iniciam a execução de eventos.

#### Gráficos

Na parte gráfica geralmente se criam classes para os cenários (que são objetos estáticos imóveis), e para os atores (que são objetos dinâmicos que podem ou não se mover), o programador cria o código para fazer a interação do ator com outros atores e com o cenário.
Em gráficos 3D, os objetos são colocados em uma lista ou árvore para a uma renderização final que cria uma foto da cena 3D.
Em gráficos 2D se trabalha com camadas (layers) que são pintadas umas em cima das outras, um jogo pode ter várias camadas (uma camada para o céu, outra para o terreno, outra para os personagens, etc) o programador deve ditar a ordem a qual essas camadas são pitadas, já que uma camada nova sobrepõe a outra anterior, por isso os cenários são pintados antes dos personagens, se acontecesse o contrário os personagens não poderiam ser vistos.

#### Física

Responsável pela reação causada pela ação de algum objeto 2D ou 3D, é responsável pelo cálculo e resposta de colisão, também coordena constantes como gravidade, dinâmica de fluido, fricção, inércia, etc.
Trabalha com animated body (corpos que não são afetados fisicamente), como os cenários, rigid body (corpos que se relacionam fisicamente com outros corpos) como uma roda, e soft body (corpos que se relacionam fisicamente com outros corpos e com si mesmo) como uma ragdoll.

#### Áudio

Na parte de áudio temos 2 tipos de sons, as músicas e os efeitos sonoros. As músicas são colocadas em background e ficam em execução constante e os efeitos sonoros são executados apenas quando acontece algum evento, como uma colisão.

#### Inteligência artificial

Na parte de inteligência artificial temos os nódulos de caminho (node paths) que são pontos invisíveis no cenário por onde os objetos se deslocam, esses pontos podem estar interligados através de listas, árvores, matrizes, circuitos, ou algum outro tipo de grafo. O comportamento do objeto vai depender do algoritmo utilizado para tratar a AI.

#### Redes

Na parte de comunicação via LAN ou Internet temos classes que tratam das entradas de dados e classes que tratam da saida de dados. Sempre deve-se pensar no gasto mínimo da banda para diminuir a ocorrência de lags, por isso as sempre que possível as comunicações são feitas através de chamadas, que são instruções passadas de um computador para o outro.

### Classes auxiliares

Na estrutura do código do jogo também podem ser criadas classes auxiliares que servem principalmente para um melhor estruturamento e entendimento do código, apesar de não serem obrigatórias em seu uso, acabam se tornando necessárias a medida que o código do jogo vai crescendo.