Origem: Wikipédia, a enciclopédia livre.
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.
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 é reponsável por criar as idéias.
Escrever protótipos de características e idéias de um jogo é a etapa inicial do processo, nessa fase são testados a eficiência dos algoritmos. A fase de criação de protótipos também se extende 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 idéias 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.
[editar] 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.
[editar] 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++, mas em geral são muito usados qualquer tipo de linguagem orientada a objetos. Alguns jogos podem também usar linguagem assembly para priorizar principalmente a performance e uma comunicação mais direta com o hardware.
Linguagens de script também são usadas, principalmente quando se trabalha com engines, é comum criar algumas versões reduzidas da linguagem C, ou linguagens já existentes como Lua e Python.
[editar] 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.
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.
[editar] Estrutura do código
Jogos são softwares que realizam ações através de comandos fornecidos pelos usuários. Podem ser em formato de texto ou conter interfaces gráficas.
Existem 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.
[editar] 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 do jogo de uma só vez.
[editar] 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:
- while(usuário não pede para sair)
- verificar entrada do usuário (através de teclado, mouse, controller, etc...)
- realizar AI
- verificar colisões
- renderizar gráficos 3D (caso seja um jogo 3D)
- pintar o gráfico na tela (junta a imagem em 3D renderizada junto com a 2D em um único buffer)
- tocar som
- end while
[editar] 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.
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.
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.
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 dinmicos 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.
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, dinmica 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.
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, os efeitos sonoros são executados apenas quando acontece algum evento.
[editar] 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 atráves de listas, árvores, matrizes, circuitos, ou algum outro tipo de grafo. O comportamento do objeto vai depender do algoritmo utilizado para tratar a AI.
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.
[editar] 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.
Os objetos Managers agrupam várias classes semelhantes em si como de objetos 3D, de música, de tasks, etc. A forma como esses objetos ficam embutidos no Manager depende do programador ou da engine usada, geralmente podem estar organizados em listas, árvores ou outros tipos de grafos, essa organização pode influir também no desempenho da aplicação, os métodos podem ser invocados através do uso de reflexão.
Os objetos Behaviors contém comportamentos a qual outros objetos em comum podem invocar, como por exemplo a ação "andar" onde várias entidades em um jogo executam essa ação. Sem o uso dos Behaviors se faz necessário implementar os métodos que fazem a entidade andar em todas as classes, se existirem milhares de entidades, precisa-se copiar o código milhares de vezes, e ainda se precisar modificar algo também precisará modificar milhares de vezes em toda classe. Os Behaviors facilitam este caso, pois são implementados apenas uma vez, e caso seja necessário alguma modificação, essa se implicará em todos os objetos que usam este Behavior.