Cursos / Jogos Digitais / Introdução a Jogos Digitais / Aula

arrow_back Aula 09 - Motores de Jogos I

2 - Motores de Jogos

E então, já captaram o que é um motor de jogo?

Não se aperreiem! O final da última seção já nos deixou algumas pistas:

  • Motor de jogo é um tipo de programa;
  • Foi criado para facilitar a vida de quem faz jogo.

Bom, dizer que o motor de um jogo é um simples programa seria simplificar demais. Na verdade, podemos dizer que o motor representa um framework de desenvolvimento de jogos, já que ele possui várias funcionalidades previamente implementadas em sua estrutura e, assim, o desenvolvedor precisa apenas “completar” e alterar o código para criar o seu jogo dentro da estrutura apresentada. Os motores costumam apresentar várias funcionalidades mais gerais, como:

  • Motor gráfico, o qual diz como desenhar as coisas na tela (2D e/ou 3D);
  • Motor de física, que calcula e determina como os objetos se movem/comportam dentro do jogo;
  • Sistemas de suporte a áudio e animações;
  • Comunicação de dados via rede;
  • Gerência de memória;
  • Gerência de componentes do jogo e fluxo de execução;
  • Ferramentas de scripting para permitir customização de alguns componentes do motor;
  • Inteligência Artificial.
Um motor como o Unreal 4 tem várias ferramentas, desde edições simples de modelos 3D, até criação de animações e programação de eventos. Isso permite o trabalho de pessoas com diferentes níveis de conhecimento técnico!

Não se preocupem, falaremos um pouquinho mais sobre essas funcionalidades na próxima aula. O importante para absorverem agora é que o motor já possui uma base de implementação pronta para você usar e estender com código próprio. Dependendo do motor, isso pode ser feito de forma mais rudimentar, através do uso de bibliotecas de código ou, de forma mais elaborada, com uma interface contendo programas para edição do código, edição de modelos 2D/3D, gerenciamento de recursos, edição de animação, etc.

Um detalhe importante é que o motor não substitui todas as ferramentas necessárias na produção de um jogo. Embora alguns até possuam uma capacidade de criar modelos 3D básicos e animá-los, dificilmente conseguirão substituir uma ferramenta específica para esse fim, como o Blender ou Maya (ferramentas de modelagem 3D). Algo que eles fazem é permitir que o desenvolvedor carregue recursos produzidos nessas ferramentas de forma intuitiva e com um bom suporte para diferentes formatos. Daí entramos no segundo tópico: facilitar o desenvolvimento.

O motor de jogos pode ser visto como uma camada intermediária, ou middleware, entre a codificação do jogo e o hardware no qual ele é desenvolvido ou executado. Fazendo uma analogia com a programação: o seu computador só entende 0 e 1, a famosa linguagem binária de máquina, correto? Agora imagine o trabalho se você tivesse que programar dessa forma! Faça um programa que leia dois números e apresente a soma:

Impossível, não é? Embora seja essa a maneira como o computador entende o código, é muito difícil para nós decorarmos como escrever cada instrução e função de 0 e 1. Imagina ler esses números e achar os erros depois! Com certeza, não existiria a programação de computadores como temos hoje. Por isso, foram criadas as linguagens de programação, elas são uma forma em alto nível para que possamos descrever programas em um formato mais próximo da nossa linguagem natural (no caso, inglês), e deixamos a cargo do compilador/interpretador da nossa máquina a árdua tarefa de transformar o nosso programa em código binário para a máquina executar.

Em binário, até os filmes de James Bond seriam mais difíceis de entender!

Analisando o motor de jogo por essa ótica, o que temos é algo similar, como implementar todo o controle de processos, leitura de arquivos, gerência de memória, controle de entrada e saída, dentre outros aspectos da máquina. Isso seria uma grande dificuldade para nós, o que tornaria a tarefa de se criar um jogo uma tarefa digna dos desafios de Hércules! Então o motor dá uma de compilador: ele deixa a nosso cargo a implementação da lógica do jogo, e a maior parte do “trabalho pesado” de interação com o sistema ele faz de modo transparente para o usuário (ou seja, nem vemos!). E como são tarefas que existem em basicamente todo jogo, o motor permite que reutilizemos essas funcionalidades prontas, e isso nos traz duas grandes vantagens:

  • Não precisamos fazer novamente;
  • Essas funcionalidades já foram testadas e validadas por várias outras pessoas.

Esse reuso permite não apenas a aceleração do projeto atual, como também a execução de vários projetos utilizando o mesmo motor (claro, se a empresa tiver gente suficiente para isso). Por ter componentes próprios para tratar das questões gráficas, de som e de animação, os motores de jogos costumam ser usados também para outras aplicações, como a produção de animações. Inclusive, os motores tentam prover uma interface em que se consegue editar e construir boa parte do jogo sem necessariamente programar, com ferramentas visuais e intuitivas que permitem aos profissionais de outras áreas, como artes e design, interagirem mais facilmente com o motor.

Muitos motores, como o Unreal, possuem uma linguagem gráfica que facilita a implementação da lógica do jogo, sem precisar digitar uma linha de código!

O motor fica responsável por vários aspectos básicos de um jogo. Por exemplo, a inicialização/finalização do jogo ocorre por meio de procedimentos já implementados no motor. Isso é importante porque, ao iniciar o jogo, um conjunto de informações deve ser alocado e estruturado na memória, e quando a aplicação terminar, é necessário “limpar” essa informação para não deixar “lixo” na memória e prejudicar a performance da máquina. Essa gestão também é importante durante a execução do jogo: imagine que seu jogo ocupe toda a memória do seu computador, devido a uma má gestão feita pelo programador. Para compensar essa falta de memória, o sistema operacional começará a trabalhar com memória virtual, usando parte da memória do disco para armazenar dados dos programas em execução, como um novo nível de hierarquia de memória. O problema é que o acesso ao disco é muito mais lento do que o acesso a RAM, causando uma queda significativa na performance do jogo. Para evitar que isso aconteça, é essencial manter a memória da maneira mais eficiente possível, removendo elementos que não estão sendo mais usados e minimizando o desperdício ao executar a aplicação. Essa gerência manual é muito trabalhosa, e o motor cuida de boa parte dela!

O motor também é responsável pela execução ordenada do jogo. Normalmente, os jogos possuem várias fases ou partes, que são interligadas em um mapa, e o jogador pode navegar livremente por elas (ou não!). Ao construir o jogo, o desenvolvedor indica no motor a sequência ou ligações entre os espaços do jogo e, a partir dessa sequência determinada, o motor irá encadear a carga desses espaços do mundo do jogo na ordem correta. Além disso, o motor implementa o ciclo do jogo de modo que o desenvolvedor precisa apenas especificar os eventos que ocorrerão a cada iteração do ciclo.

Empresas maiores costumam desenvolver motores próprios ou customizar um motor existente com a adição de novas funcionalidades, através de plugins. O plugin é um programa que é adicionado ao motor para que a nova funcionalidade seja acessível dentro da estrutura utilizada no desenvolvimento do jogo. Dentre os principais motores disponíveis no mercado, temos:

  • Construct 2
  • Unity
  • Unreal 4
  • Cry Engine
  • GameMaker Studio
  • OGRE 3D
  • Torque
Alguns dos principais motores do mercado.

Durante o curso, usaremos engines com o propósito geral. Esses motores possibilitam a criação de jogos tanto 2D como 3D, e possuem muitos recursos prontos, normalmente disponibilizados através de uma loja ou asset store. Dentre as opções existentes, o Unity e o Unreal 4 se destacam por disponibilizarem versões gratuitas para desenvolvimento.

Curioso para conhecer os componentes do motor em maiores detalhes? Então vamos correndo para a próxima aula! Até lá!

Versão 5.3 - Todos os Direitos reservados