Revista Eletrônica da Faculdade Metodista Granbery http://re
Transcrição
Revista Eletrônica da Faculdade Metodista Granbery http://re
1 Revista Eletrônica da Faculdade Metodista Granbery http://re.granbery.edu.br - ISSN 1981 0377 Curso de Sistemas de Informação – N.14, JAN/JUN2013 COMPONENTES DE GAME ENGINES Fillipe Martins Van Keulen1 Marcos Vinicius Grossi de Mattos2 Sérgio Muinhos Barroso Lima3 Vítor Daniel Rosa Cabral4 RESUMO O mercado de jogos eletrônicos vem apresentando um crescimento significativo nos últimos anos. O desenvolvimento da tecnologia e da própria engenharia de software tem permitido a criação de ferramentas que agilizam e aumentam a qualidade do processo de desenvolvimento de jogos, dentre elas, as game engines. Como resultado, surgem jogos com qualidade cada vez maior, oferecendo uma experiência cada vez mais realista, tornando-se mais atrativos para pessoas de diversas faixas etárias. Este artigo apresenta a estrutura básica das game engines. PALAVRAS-CHAVE: Componentes de Game Engines, Jogos Eletrônicos, Desenvolvimento de Jogos, Ferramentas para Jogos, Máquinas de Jogos. ABSTRACT The game market is showing a significative growing on the last years. The technology and engineering advances are supporting the development of tools that increase the speed and quality of game development, among them, starring, the game engines. As result, are appearing several games with high quality, offering stunning and realistic experiences, being 1 Bacharel em Sistemas de Informação, Faculdade Metodista Granbery, [email protected]. Bacharel em Sistemas de Informação, Faculdade Metodista Granbery, [email protected]. 3 Mestre em Ciência da Computação, UNICAMP, [email protected]. 4 Bacharel em Sistemas de Informação, Faculdade Metodista Granbery, [email protected]. 2 2 more attractive to the people of several ages. This work presents the main game engine components. KEY-WORDS: Game Engine Components, Eletronic Games, Game Development, Game Tools, Game Engines. 1 - INTRODUÇÃO Desde o início do processo de desenvolvimento de software, o avanço da tecnologia vem possibilitando, aos seres humanos, reproduzir nas máquinas situações do mundo real. Essa evolução contribuiu para a melhoria dos sistemas, que passaram a ser mais interativos e a simular, cada vez melhor, situações reais com as quais os usuários poderiam se deparar. Logo, as máquinas passaram a reproduzir fenômenos como força da gravidade, aceleração centrífuga, efeitos de iluminação (luz, sombras, etc.), sons e começaram a surgir softwares com grupos de funcionalidades específicas para domínios específicos, como, por exemplo, as bibliotecas de funções matemáticas, ou físicas. Surgiam assim as engines. A palavra engine significa motor, em português, e, de acordo com o dicionário Priberam da Língua Portuguesa (PRIBERAM, 2012), tem por definição “que dá movimento; aquilo que induz ou instiga”. Na área do desenvolvimento de sistemas, engines podem ser comparadas a grandes bibliotecas que agrupam funcionalidades de um mesmo contexto. À medida que o conhecimento envolvido neste contexto evolui, pode ser necessário alterar essas bibliotecas, para acrescentar funcionalidades, por exemplo, e, por isso, as engines também estão sujeitas a princípios de engenharia de software, como os padrões de projetos (EBERLY, 2005). A utilização de engines agiliza o processo desenvolvimento de aplicações para contextos específicos, pois concentra todas ou a maior parte das funcionalidades que são inerentes a esse contexto. Muitas aplicações (inclusive outras engines) são desenvolvidas através da combinação de funcionalidades de várias engines distintas. Esse trabalho aborda a estrutura básica de game engines, conceitos básicos relacionados ao desenvolvimento de jogos e exemplos de ferramentas que podem ser utilizadas no desenvolvimento de jogos utilizando um tipo especial de engine resultante da combinação de várias engines: as game engines. 3 2 - GAME ENGINES A cada dia que passa, o público gamer vem crescendo mais e mais. Segundo pesquisa realizada pela empresa de auditoria PriceWaterhouseCoopers, esse setor movimentou cerca de US$1,3 bilhões em 2011 somente na América Latina, e a previsão é de que, em 2016, esse valor aumente para aproximadamente US$1,8 bilhões. Diversas pessoas das mais variadas idades e gostos se tornam parte desse público em busca de jogos que se encaixem nos seus perfis (PÍCOLO, 2012). As produtoras de jogos, que não medem esforços para conquistar os clientes, tentam atrair e satisfazer essa exigente e diversificada clientela. Dentre os principais recursos dos quais elas dispõem para aprimorar e melhorar ao máximo seus jogos estão as game engines. Antes de analisar mais a fundo o que são e como funcionam as game engines, é interessante entender o processo de surgimento dessas “ferramentas milagrosas”. De acordo com Nilson e Söderberg (2007), antes do surgimento da programação orientada a objetos, o paradigma de desenvolvimento de software era a programação estruturada. Seguindo esse modelo de desenvolvimento, os jogos eram escritos em poucos arquivos, talvez um ou dois, compilados e rodados. Caso a empresa ou desenvolvedor quisesse escrever outro jogo dando sequência ao primeiro, eles teriam duas opções: criar todo o código a partir do zero ou copiar o código do primeiro jogo e editá-lo com as características do novo jogo (como é possível notar, nenhuma das duas opções é prática ou produtiva). Com a chegada do paradigma da orientação a objetos, a situação começou a melhorar: a possibilidade de reaproveitamento de código aumentou a manutenibilidade do código-fonte. Esse novo modelo, composto de objetos autônomos interagindo entre si em um sistema, estimulou o desenvolvimento de ferramentas que agilizaram o processo de desenvolvimento de jogos. Os códigos-fontes seriam mais limpos, organizados e, consequentemente, mais fáceis de dar manutenção. (NILSON, SÖDERBERG, 2007) Com o passar do tempo percebeu-se que várias funções se repetiam durante o desenvolvimento de jogos distintos. Assim, decidiu-se agrupá-las em grupos de funções que acabaram dando origem às engines específicas. A necessidade de funções de diferentes engines em um mesmo jogo condicionou o desenvolvimento de ferramentas, ambientes de desenvolvimento, que tivessem várias dessas funções ao mesmo tempo. A evolução dessas ferramentas deu origem às game engines. (EBERLY, 2005) 4 A primeira engine utilizada foi a Freescape, da Incentive Software, que ajudou nos processos de divulgação e popularização de dos jogos no estilo FPS5. Mais tarde, com o estouro de jogos como Doom, Wolfstein 3D e Quake, outras empresas começaram a lançar jogos inspirados nesses três primeiros. A partir de então, as engines foram se tornando cada vez mais populares e logo começaram a ser utilizadas em vários outros gêneros de jogos. A área mostrou-se tão propícia que outras empresas passaram a produzir e comercializar novas engines. (KLEINA, 2012) De acordo com Zerbst (2004), também conhecidas como 3D engines, as game engines são um tipo específico de engine utilizadas principalmente para o desenvolvimento de jogos. São compostas por várias sub-engines que possuem as funcionalidades necessárias para o desenvolvimento de jogos. Ao optar pelo desenvolvimento de jogos utilizando game engines, os desenvolvedores não precisam se importar sobre como a engine trata arquivos de áudio, ou ainda como se comunica com a placa de vídeo. Eles precisam apenas saber qual função da game engine realiza o processo desejado, como e onde utilizá-la. Game engines não estão fortemente ligadas a um jogo, plataforma ou projeto específico, ou seja, seu código é completamente separado do código dos projetos que serão desenvolvidos utilizando a game engine e deve ser reutilizável (ZERBST, 2004). Embora a utilização de game engines no desenvolvimento de jogos ajude a abstrair os conceitos de baixo nível relacionados a este processo, é importante ressaltar que, sem tal conhecimento, o desenvolvedor fica preso aos recursos disponibilizados pela game engine (EBERLY, 2005). Por isso, há no mercado grandes empresas que adotam game engines em seus projetos de desenvolvimento e, mesmo assim, possuem pessoas especializadas em programação de baixo nível em suas equipes. Segundo Jesse Schell (2011), ao jogar um jogo, o jogador passa por uma série de percepções, sentimentos e reações que juntos acarretam o fenômeno conceituado por Schell como experiência. Ele defende que a experiência provocada no jogador está entre os fatores que o fazem querer continuar em seu jogo ou abandoná-lo logo no começo. O papel das game engines nessa história é fornecer, à equipe de desenvolvimento, meios para estimular ou melhorar a experiência do usuário durante o jogo. Como mencionado anteriormente, as game engines devem fornecer uma estrutura completa (mesmo que com funcionalidades básicas) para que as equipes de desenvolvimento sejam capazes de desenvolver seus jogos. Assim, há algumas funcionalidades básicas 5 Sigla para First Person Shooter, em português Tiro em Primeira Pessoa. 5 esperadas de uma game engine como, por exemplo, funções que implementem inteligência artificial, simulem forças da gravidade ou ainda, como citado em exemplo acima, manipulem o áudio do jogo deixando para a equipe apenas a responsabilidade de saber como usá-las. A seguir será abordada a estrutura básica de uma game engine. 2 - COMPONENTES DE GAME ENGINES Game engines são compostas por engines, ou subsistemas, que interagem entre si e têm responsabilidades específicas e bem definidas. Pode-se dizer que as principais engines que compõem uma game engine são: graphics engine (engine gráfica), physics engine (engine de física), script engine (engine de programação ou desenvolvimento), audio engine (engine de áudio), AI engine (engine de inteligência artificial), network engine (engine de rede) e input engine (engine de entrada). A partir da ilustração 1 é possível ter noção de como esses componentes se relacionam. Ilustração 1 - Representação abstrata da arquitetura de uma game engine. Fonte: (NILSON, SÖDERBERG, 2007) A classe Renderer representa a engine gráfica, responsável por cuidar da parte visual do jogo. A Audio representa a engine de áudio, responsável por cuidar do tratamento e gerenciamento de áudio do jogo. A classe Physics representa a engine de física, responsável 6 por cuidar dos efeitos relacionados aos fenômenos físicos (deslocamento, rotação, gravidade, geração de partículas e etc.) aplicados aos objetos do jogo. A classe AI representa a engine de Inteligência Artificial, responsável por cuidar do comportamento das personagens e objetos do jogo não controlados pelo jogador. Na ilustração 1, essas classes foram agrupadas (acima da caixa core) porque são as classes que executam as operações mais complexas e custosas, ou seja, exigem maior poder de processamento (NILSON e SÖDERBERG, 2007). A classe Input representa a engine de entrada, responsável por implementar as formas de acesso (e gerenciá-las) que o jogador tem para utilizar o jogo (mouse, teclado, joystick, touchscreen e etc.). A classe Network representa a engine de rede, responsável pela comunicação de rede do jogo. A classe Scripting representa a script engine, responsável por fornecer aos desenvolvedores meios de acessar os recursos oferecidos pela engine. Na ilustração 1, essas classes foram agrupadas (abaixo da caixa core) porque elas representam a interface do usuário com a game engine (NILSON e SÖDERBERG, 2007). É importante notar que nenhuma das classes se comunica diretamente. Qualquer informação que trafegue de uma classe para a outra passa antes pela classe Core. Essa classe representa os recursos da máquina que gerenciam a troca de informações e chama diretamente os recursos solicitados pelas outras classes, como, por exemplo, o processador. É a classe central de processamento. (NILSON, SÖDERBERG, 2007) Nas próximas seções serão abordadas essas engines com um nível maior de detalhe. 3.1 - GRAPHICS ENGINE A engine gráfica, também conhecida por renderer engine, é responsável por cuidar da parte gráfica/visual do projeto e, talvez por esse motivo, é a parte mais conhecida, passando às vezes a ser confundida com a própria game engine (NILSON e SÖDERBERG, 2007). Geralmente construída com base em API’s gráficas como OpenGL ou Direct3D, esse tipo de engine é implementada para desenhar todos os objetos na tela. OpenGL é um software de interface para hardware gráfico que permite aos desenvolvedores utilizar os recursos necessários para produzir imagens de alta qualidade de objetos 2D ou 3D (KHRONOS, 2012). Largamente conhecida por sua versatilidade e por ser multiplataforma, a biblioteca do Khronos Group se encontra na versão 4.1 e disputa o mercado de gráficos tridimensionais com a Direct3D (GUGELMIN, 2010). 7 O Direct3D é uma parte específica para jogos da biblioteca gráfica DirectX, da Microsoft. Ficou famosa pela alta qualidade dos gráficos gerados, mas só roda em sistemas Microsoft. Está na versão 11.1 (somente para Windows 8) e é programada para utilizar os recursos de hardware gráfico de forma a minimizar o trabalho da CPU (TECHTERMS.COM, 2012). As API’s gráficas manipulam o hardware gráfico (responsável pela parte gráfica), reduzindo, no lado do programador, a necessidade de construir uma engine gráfica a partir do zero, pois os métodos contidos nessas API’s já implementam grande parte dos métodos necessários para o processo de renderização (principal função das engines gráficas). Há situações nas quais o hardware em que o sistema irá rodar não oferece suporte à API’s. Justamente por causa desse tipo de situação, não é sensato assumir que o uso de API’s elimina a necessidade de conhecimento gráfico em baixo nível. (ZERBST, 2004) Efeitos visuais de alta qualidade prendem muito a atenção do jogador, pois aumentam nele a sensação de realismo, o que maximiza sua experiência e o mantém imerso no contexto do jogo. Devido à alta qualidade dos recursos disponíveis, é possível simular diversos tipos de ambientes, desde paisagens até interiores de escritórios, com alto nível de detalhe. Porém, quanto maior o nível de detalhe exigido na cena (mundo ou ambiente onde se passa o jogo), maior a quantidade de objetos que a engine gráfica tem que renderizar. Isso pode resultar em pequenos delays (travamentos), que acabam prejudicando o aproveitamento da experiência por parte do jogador. É preciso então que a engine gráfica saiba definir “o que deve ser renderizado em qual hora” (ERBERL, 2005). De acordo com Eberly (2005), para lidar com esse tipo de problema as engines gráficas funcionam sob dois importantes conceitos: scene graph (grafo de cena) e scene graph management (gerenciamento do grafo de cena). O grafo de cena é composto por todos os componentes de uma cena e suas relações, conforme exemplo da ilustração: 8 Ilustração 2 - Exemplo de grafo de cena (adaptado pelos autores) FONTE: (NOKIA, 2005) O grafo da ilustração 2 retrata uma cena composta por alguns meshes6, um sprite3D7, uma câmera e uma luz. O nó Mundo representa a cena em si e contém todos os elementos nela contidos. Os nós Group representam, como o nome sugere, agrupamentos de objetos na cena e permitem à aplicação tratar mais de um nó com um único objetivo (um exemplo de aplicação é a replicação de uma alteração realizada em um objeto, em todos os outros objetos do grupo). O nó Sprite 3D representa imagens bidimensionais com uma posição tridimensional (é, basicamente, a conexão do objeto que o usuário vê na tela com o objeto 3D). Os nós Mesh, Morphing Mesh e Skinned Mesh representam as formas geométricas dos objetos visíveis, sendo que os dois últimos referem-se às formas de objetos animados. O nó Câmera representa câmeras na cena, ou seja, pontos de vista na cena. E o nó Luz representa pontos de luz na cena (NOKIA, 2005). Gerenciamento de grafo de cena é o processo em que, baseada no grafo de cena, a engine executa diversos procedimentos (entre eles a definição de visibilidade dos objetos) para selecionar os objetos da cena que serão enviados ao renderizador, a fim de diminuir a 6 Termo utilizado na área de desenvolvimento de jogos para se referir a objetos 3D. Termo utilizado para se referir à tradução de uma imagem 3D para 2D, de modo que esta possa ser exibida nas telas. 7 9 carga de trabalho do mesmo. Com base nesses conceitos, as engines gráficas conseguem equilibrar da melhor maneira possível a qualidade visual do jogo com a quantidade de trabalho exigida no renderizador (EBERLY, 2005). Segundo Zerbst et al (2004), uma renderer engine tem que ser fácil de usar e flexível, porém esses conceitos geralmente andam em sentidos opostos. Uma engine que realiza uma série de operações com apenas uma chamada de método é definitivamente fácil de usar, mas não é flexível, pois as operações de manipulação de vídeo são executadas dentro deste método, que por sua vez já está predefinido e não pode ser modificado (ou é difícil de ser modificado). À medida que a engine vai sofrendo customizações para se tornar mais flexível (vai sendo desmembrada para que seja possível adicionar eventos entre as operações que ela desempenhava inicialmente), mais funções são acrescentadas a ela e torna-se maior a quantidade de métodos que o usuário deve dominar para utilizá-la. Neste caso, a engine ganhou flexibilidade, mas perdeu facilidade de utilização, exige mais de seu usuário. 3.2 - PHYSICS ENGINE Outro fator que ajuda muito a estimular a sensação de realidade no usuário é a inserção, no jogo, de regras, fenômenos e até mesmo leis existentes no mundo real. Nas game engines, a engine que cuida especificamente de reproduzir os fenômenos físicos presentes no mundo real é a chamada physics engine. Assim como em qualquer outra área do desenvolvimento de software, para que o computador possa reproduzir um evento do mundo real, é necessário escrever tal evento de forma que o computador o entenda. Uma das maneiras de fazer isso é construir um algoritmo lógico aritmético para ser processado pelo computador de forma que, baseado nas instruções fornecidas pelo algoritmo, ele possa tomar decisões e executar ações (o que resulta na simulação do fenômeno descrito pelo algoritmo) (EBERLY, 2005). As physics engines geralmente exigem alto poder de processamento, pois executam cálculos muito complexos por unidade de tempo, ou seja, numa cena simples de um jogo de tiro, ao disparar de uma arma, as physics engines têm que calcular a propagação do som e o movimento do projétil (deslocamento espacial e variação de velocidade). Tudo isso em tempo hábil, sem delays. (LIMA, 2008) Dentre os fenômenos que as physics engines se encarregam de simular, estão a emissão e controle de partículas. Através desse sistema, é possível simular situações e efeitos especiais envolvendo fogo (incêndios, fogueiras, explosões), água (rios e mares, cachoeiras, 10 chuva), areia (praias, tempestade de areia, ampulhetas), fumaça, neblina, neve com ótima qualidade, como é possível observar nas ilustrações 3 e 4. Ilustração 3 - Exemplo de simulação de fogo na game engine Unity 3D FONTE: (MANUAL, 2012) Ilustração 4 - Exemplo de simulação de neblina na game engine Unity 3D FONTE: (HIGGINS, 2012) De acordo com Lima (2008), os sistemas de partículas recebem alguns parâmetros, como um emissor para as partículas (um objeto ou ponto na cena), uma quantidade máxima de partículas a ser gerada, tempo de vida, cor, tamanho, vetor de velocidade inicial das partículas para que possa realizar a simulação. Com base nesses parâmetros, o sistema de partículas inicia a simulação dos efeitos aplicando as leis de Newton sobre as partículas e fazendo-as entrar em loop até o fim de seu tempo de vida. 11 Implementado por várias game engines, o conceito de deformable bodies (corpos deformáveis) contribui muito com o realismo dos jogos. Deformable bodies são corpos cuja superfície é deformável (como sugere o nome), como, por exemplo, tecidos que se amassam, uma bola que se comprime ao colidir com uma parede, uma goma de mascar que se estica ao produzir uma bola, a contração de um músculo ou um simples passo do caminhar de uma personagem. Todos esses efeitos ajudam a despertar os sentidos do jogador, o tato, por exemplo, dando noção da textura, espessura dos objetos na cena. Eberly (2005) afirma que processar um modelo que implemente os princípios de deformação requer um alto poder de processamento para aplicações em tempo real. Para contornar tal requisito ele propõe alternativas menos dispendiosas para implementar as deformações. Uma delas é a implementação de uma classe que represente as superfícies e suporte as modificações dos vértices, auxiliada por um sistema de colisões, para evitar que haja vértices sobrepostos após a deformação (resultando em formas estranhas). Rigid bodies (corpos rígidos) são os objetos da cena que possuem tamanho, orientação, posição, velocidade e forças a ele aplicadas. As partículas citadas anteriormente são exemplos de rigid bodies sem tamanho e orientação. Geralmente representados por poliedros nas aplicações, os rigid bodies são posicionados e orientados no ambiente 3D por um sistema de coordenadas. As physics engines aplicam as Leis de Newton sobre esses corpos, produzindo seus movimentos, calculando suas velocidades e rotações. A classe que representa os rigid bodies nas game engines implementam métodos que permitem alterar e/ou recuperar a massa, estado de inércia, orientação, posição, velocidade angular e linear desses corpos (EBERLY, 2005). 3.3 - SCRIPT ENGINE Uma das funções de uma game engine é facilitar o desenvolvimento de jogos, cuidando para o desenvolvedor dos assuntos de baixo nível. Ainda assim, é necessário para o desenvolvedor se comunicar com a game engine de forma que ele consiga dizer a ela o que ele quer fazer e quando isso deve ser feito. Para que esta comunicação aconteça as game engines oferecem suporte a alguns linguagens de script. Através dessas linguagens, os desenvolvedores conseguem usufruir das funcionalidades oferecidas pela game engine (NILSON, SÖDERBERG, 2007). 12 Geralmente usadas para animação e lógica de jogo (game play logic), as linguagens de script são escolhidas pelos fabricantes de game engines, e desenvolvedores de jogos, devido à sua aparência mais amigável, que permite melhor leitura e organização do código (CODEPLEA, 2009). Neste trabalho os exemplos estão focados nas linguagens C#, JavaScript e Boo, que são as linguagens suportadas pela Unity 3D, game engine tema principal do trabalho. C# é uma linguagem orientada a objetos derivada do C, atualmente mantida pela Microsoft. Conhecida por ser fácil de entender, possui sintaxe parecida com as das linguagens C, C++ e Java. Suporta métodos, tipos genéricos e iteradores que permitem criação de comportamentos de iteração personalizados. Também suporta herança, polimorfismo e encapsulamento. Dentre as linguagens suportadas pela Unity 3D, é a mais usada com esta ferramenta no mercado (MICROSOFT, 2012). A partir da Unity, uma variável pode ser declarada em C# informando-se os pacotes que serão utilizados pelo script, declarando-se o método onde a variável se encontra, seguido da palavra Monobehaviour (esta palavra refere-se à classe base da qual derivam todas as classes na Unity 3D) e, por fim, declarando-se a variável memberVariable, pública e do tipo float (UNITY, 2012). Os comandos da para declaração são bem semelhantes aos comandos Java utilizados para declaração de variáveis. using UnityEngine; using System.Collections; public class example: MonoBeahvior{ public float memberVariable = 0.0F; } JavaScript é uma linguagem de script orientada a objetos, desenvolvida pela Netscape8, à parte da plataforma Java. É muito utilizada para desenvolvimento de WebPages, mas também pode aplicada em projetos “fora do browser” (por exemplo ApacheCouchDB9, desenvolvimento de jogos) (MOZZILA, 2012). 8 Empresa americana de serviços de informática fundada em 1994, que ficou famosa pelacriação do navegador Netscape Navigator. 9 Projeto de banco de dados para web com armazenamento de dados utilizando documentos JSON e acesso aos dados via HTTP, mantido pela Apache. 13 Programando em JavaScript na Unity 3D, a mesma declaração variável mostrada anteriormente fica da seguinte maneira: var mermerVariable = 0.0; Um ponto interessante a ser observado é que, ao desenvolver scripts em JavaScript com a Unity 3D, não é necessário informar quais os pacotes utilizados pelo script nem a criação de classes, como mostrado utilizando C#. Devido a essa simplicidade, o JavaScript é o mais utilizado em livros e outros materiais destinados àqueles que não têm experiência alguma com programação ou desenvolvimento de jogos (GOLDSTONE, 2009). Boo é uma linguagem orientada a objetos, estaticamente tipada, surgida por volta de 2003 com objetivo de utilizar, no Python, o suporte para Commom Language Infrastructure (CLI)10 para Unicode, internacionalização e aplicações Web (OLIVEIRA, 2004). Sua sintaxe é inspirada no Python. A declaração de variáveis utilizando Boo é similar ao C#. A diferença principal é a utilização da palavra as. Ela é utilizada porque em Boo não é necessário especificar o tipo de uma variável. Ao associar um valor de um determinado tipo a uma variável, o compilador associa o tipo desse valor à variável. Assim, quando se utiliza a sintaxe acima, o compilador apenas checa se o valor recebido corresponde ao tipo designado (OLIVEIRA, 2005). import UnityEngine; import SystemCollections; class example(MonioBehaviour) public memberVariable as single = 0.0F; 3.4 - AUDIO ENGINE Tão importantes quanto os gráficos e a simulação de fenômenos físicos são os sons utilizados em um jogo. Eles ajudam a aumentar a realidade dos jogos, prendendo a atenção do jogador e maximizando sua experiência, assim como na vida real o sentido da 10 Padrão internacional segundo o qual aplicações escritas em várias linguagens de alto nível possam ser executadas em diferente ambientes sema necessidade de reescrevê-las para cada ambiente específico. (ECMA, 2012) 14 audição é muito importante para os seres humanos, pois ajuda em sua orientação no espaço e na sua compreensão do ambiente em que se encontra. Nas game engines a parte responsável por cuidar do áudio do jogo é a audio engine. Em alguns casos, além de fornecer áudio de qualidade, elas oferecem aos jogadores a possibilidade de interagir com o jogo e com outros jogadores por meio de sons. O uso de microfones em jogos multiplayer é ótimo um exemplo dessa interação (NILSON e SÖDERBERG, 2007). Assim como nas engines citadas anteriormente, as audio engines fazem uso de API’s para interagir com o hardware de áudio. Zerbst (2004) sugere o uso do componente DirectSound da API DirectX, da Microsoft, para o desenvolvimento de uma audio engine. O DirectSound fornece suporte para captura de sons a partir de dispositivos de entrada, para execução de sons através de diversos dispositivos de saída, utilizando efeitos de posicionamento tridimensional avançados (MICROSOFT, 2012). As audio engines fornecem uma interface que permite aos desenvolvedores de jogos inicializar e desligar componentes de áudio, e a carregar, executar e parar de executar arquivos de áudio. As próprias API’s oferecem as estruturas (estruturas de dados) necessárias para armazenar e lidar com arquivos de áudio, inclusive áudio 3D11 (ZERBST, 2004). Durante a inicialização do componente de áudio, a string com o nome do arquivo de áudio é convertida para o formato que a API utilizada trabalha. Depois os arquivos de sons recém-carregados são comparados com os que já estavam carregados, para garantir que nenhum arquivo de som seja rodado mais de uma vez acidentalmente. Uma vez carregado um arquivo de áudio, a engine carrega todos os instrumentos e cria um canal para ele. Por fim ela cria um buffer de áudio utilizando a API para este canal recém-criado. O som está carregado e pronto para ser executado (ZERBST, 2004). Na interface, a função que executa um determinado arquivo de áudio, cujo identificador (geralmente um ponteiro) é recebido via parâmetro, verifica se este sofre alguma mudança. Em caso afirmativo, ela salva (recalcula alguns atributos desse arquivo de áudio) as mudanças nesse arquivo e seta o seu atributo indicador de mudança para falso. Então ela executa o áudio como buffer secundário (ZERBST, 2004). A função que interrompe (parar) a execução do arquivo de áudio faz exatamente o que seu nome sugere: para a execução do arquivo de áudio. Mesmo nas classes internas da audio engine que interagem diretamente com o hardware de áudio (lembrando que os desenvolvedores de jogos não têm acesso a estas classes, mas somente à interface) o método 11 Áudio no universo 3D, que contém posição, alcance e orientação. 15 para a interrupção do áudio é simples, pois apenas chama um ou dois comandos já prontos da API. (ZERBST, 2004) É interessante para uma audio engine oferecer métodos que permitam aos desenvolvedores manipular os atributos do áudio 3D (posição, orientação e alcance) a fim de melhor situá-lo no universo 3D (ZERBST, 2004). 3.5 - ARTIFICIAL INTELIGENCE ENGINE Por se tratar de uma atividade multimídia, os jogos exigem uma equipe com conhecimentos em diversas áreas, como artes gráficas, música, programação, inteligência artificial (IA). A evolução da inteligência artificial vem permitindo a criação de aplicações cada vez mais interativas e jogos que proporcionem maior nível de entretenimento, melhorando a qualidade da experiência do jogador (FARIA, 2011). A capacidade de interação que um jogo apresenta em diferentes situações é outro fator que, a cada dia, ganha mais importância no mundo dos jogos. As reações apresentadas pela máquina diante das decisões e atitudes do jogador aumentam a sensação de realismo, nos jogadores, (realismo esse já muito presente graças às engines físicas, gráficas), fazendo com que este pense melhor seus movimentos e aja como se estivesse enfrentando um ser humano. A sub engine que permite aos desenvolvedores implementar comportamentos mais realistas nos jogos é a artificial inteligence engine (AI engine) (NILSON e SÖDERBERG, 2007). De acordo com Nilson e Söderberg (2007), a maior dificuldade enfrentada pelos desenvolvedores de IA para game engines deve-se ao fato de que o conjunto de técnicas de IA aplicáveis varia para cada jogo. Diferente das engines gráficas e de física, em que se aproveita praticamente tudo para vários jogos, as AI engines não são tão reutilizáveis assim devido à especificidade de cada jogo, e fazer uma AI engine com todos os algoritmos passíveis de utilização em jogos resultaria em uma ferramenta muito lenta, pesada. Tendo esse problema em vista, constroem-se, então, AI engines menores, com funções para resolver alguns tipos de problemas, busca de caminhos, por exemplo, e cada desenvolvedor implementa os algoritmos de inteligência artificial que melhor se adaptar em seu jogo. 16 3.6 - NETWORK ENGINE A evolução dos meios de comunicação, principalmente a internet, permitiu a criação de um novo conceito no mundo dos jogos: as partidas multiplayer. A possibilidade de interagir com outros jogadores via jogo elevou a experiência dos jogadores a um novo patamar (NILSON e SÖDERBERG, 2007). “Hoje, não se pode levar um jogo para PC ao mercado se ele não oferece um modo network para permitir aos jogadores jogarem juntos no mesmo mundo virtual” (ZERBST e DÜVEL, 2005). Nas game engines o subsistema responsável por oferecer aos desenvolvedores condições para implementação do modo network em seus jogos é a network engine (NILSON, SÖDERBERG, 2007). Network engines devem fornecer suporte, basicamente, para dois tipos de arquitetura de comunicação em redes: peer-to-peer12 (ponto-a-ponto) e client/server13 (cliente/ servidor). Devem também seguir o padrão proposto pelo modelo OSI e permitir a utilização dos dois protocolos mais utilizados na área de jogos: UDP14 e TCP/IP15. Zerbst (2004) sugere a utilização de três API’s para utilização do hardware de comunicação em rede: Berkeley Sockets, Windows Sockets(WinSock) e DirectPlay. Desenvolvida pela Universidade da California, Berkeley, a Berkeley Sockets é indicada para utilização de protocolos de comunicação e é utilizada em sistemas Unix e Linux como API padrão para programação de aplicações de rede. A API Winsock é parte do sistema operacional Windows e além de implementar os mesmos padrões que a Berkeley Sockets, oferece algumas funcionalidades adicionais para facilitar a programação para redes no Windows. De acordo com Zerbst (2004), a Winsock foi construída com base na Berkeley Sockets. DirectPlay é um dos componentes do DirectX 9.0, da Microsoft. A DirectPlay foi 12 Arquitetura de sistemas distribuídos, em que as máquinas (nós) de uma rede estão ligadas diretamente umas às outras, todas exercendo função tanto de servidor quanto de cliente. 13 Arquitetura de rede em que os clientes estão ligados a um nó central que fornece serviços (comunicação com outros clientes, processamento) a esses clientes. 14 Sigla de User Datagram Protocol. Trata-se de um protocolo de comunicação não orientado à conexão, muito útil para envio rápido de requisições para espalhar mensagens pela rede. 15 Sigla de Transfer Control Protocol. Trata-se de um protocolo de comunicação orientado a conexão que lida com envio de pacotes entre os dois pontos da conexão. Muito útil em situações em que é necessário garantir que o receptor receba todos os pacotes enviados. 17 construída com foco no desenvolvimento de aplicações de redes utilizadas em jogos e, atualmente, já é considerada obsoleta. A interface de interação do desenvolvedor com o hardware de rede deve oferecer estrutura para que o desenvolvedor consiga armazenar as mensagens recebidas da rede (geralmente filas com algumas implementações adicionais, de acordo com as funcionalidades que a game engine pretende oferecer) e manipular sockets (criação de conexões, recebimentos de pacotes, aceitação de clientes, definição de servidor, entre outros). Essa interface deve também permitir que o desenvolvedor manipule tanto situações em que o servidor enviará informações para os clientes quanto situações em que os clientes enviarão informações, ou requisições, para o servidor (ZERBST, 2004). 3.7 - INPUT ENGINE A input engine é responsável por cuidar da interação do jogador com o jogo, oferecendo suporte à comunicação com dispositivos de entrada externa, como mouse, teclado, joystics, para tornar essa interação possível (NILSON e SÖDERBERG, 2007). Para os desenvolvedores, ela abstrai os comandos e operações de baixo nível e permite aos desenvolvedores identificar eventos como clique de um botão do mouse, o apertar de um botão do teclado ou joystick, entre outros, através de simples chamadas de métodos. Para tanto, as input engines fazem uso de API’s (a DirectInput, por exemplo) escolhidas de acordo com os dispositivos que a game engine oferecerá suporte e com as plataformas para as quais a game engine permitirá desenvolver jogos (vídeo games, tablets, celulares, desktops) (ZERBST, 2004). DirectInput é uma API componente do DirectX, da Microsoft (assim como o Direct3D, citado na seção das graphics engines). Ele permite que uma aplicação recupere dados de dispositivos de entrada dos mais variados tipos sem precisar saber quais são os dispositivos que estão sendo usados para gerar esses dados (MICROSOFT, 2012). Segundo Zerbst (2004), uma das formas de construir uma input engine é criar uma interface (contendo métodos como GetPosition, IsPressed e IsRelesead) para a classe Input de sua game engine, que abstraia tarefas como, por exemplo, consultar as entradas externas através da API utilizada. Os métodos dessa interface serão implementados pelas classes que representam os dispositivos suportados pela game engine. Essas classes estendem uma superclasse base, que estabelece a comunicação com o hardware através da API. 18 O método Init, serve para inicializar um dispositivo através da API utilizada (por exemplo, se ela está sendo implementada na classe de teclado, ela inicializa um teclado). O método Update consulta o estado atual do dispositivo e o compara com o último armazenado, para ver se alguma tecla foi pressionada ou liberada. Os métodos IsPressed e IsReleased verificam, respectivamente, se a tecla ou botão recebido como parâmetro estão pressionados ou se foram liberados. Eles verificam a situação das teclas (ou dos botões) no estado recuperado pelo método Update. O método HasJoystick permite aos desenvolvedores verificar se há um joystick conectado e disponível (vale lembrar que os desenvolvedores têm acesso às classes que implementam a interface). O método GetPosition verifica e retorna para o desenvolvedor a posição do cursor do mouse na tela (se estiver sendo implementada na subclasse mouse) ou as coordenadas x,y do botão de movimentação (se estiver sendo implementada na subclasse de joystick). O método Release é chamado pelo destructor da superclasse base que implementa a interface (citada anteriormente) e serve para limpar todos os atributos dessa classe. E o método IsRunning indica se a engine está rodando ou não (ZERBST, 2004). A partir de arquiteturas como essa, as input engines permitem aos desenvolvedores construir aplicações com as quais os usuários possam interagir. 4 - O MERCADO DE TRABALHO Conforme visto nas seções anteriores, produzir uma game engine não é uma tarefa fácil e nem barata. É necessário conhecimento em diversas áreas, e fazer com que essas áreas interajam harmoniosamente tem um grau de complexidade muito elevado. Diante deste cenário há muitas empresas que se arriscam a produzir suas próprias game engines, enquanto outras se conformam em adquirir licenças de uso das que estão disponíveis no mercado. Em 2009, a IGN Entertainment publicou uma lista com as 10 melhores game engines do mercado, que são: RAGE Engine, Cry Engine, Naughty Dog Game Engine, The Dead Engine, Unreal Engine, Avalanche Engine, IW Engine, Anvil Engine, EGO Engine e Geo-Mod Engine (STEAD, 2005). O preço para se adquirir uma licença de uso de uma dessas game engines varia de acordo com os pacotes de funcionalidades oferecidos pelas empresas. Além disso, existem também as licenças para estudantes, geralmente mais limitadas e destinadas ao público que está começando no ramo de desenvolvimento de jogos utilizando game engines. 19 O mercado de trabalho para o desenvolvimento de jogos com game engines ainda não é muito grande no Brasil, principalmente devido ao pequeno número de empresas desenvolvedoras de jogos, mas vem melhorando bastante depois da aprovação da Portaria nº 116, de 20 de novembro de 2011, que passou a reconhecer os jogos eletrônicos como segmento cultural para recebimento de doações e patrocínios conforme o estabelecido na Lei 8.313, de 23 de dezembro de 1991, a "Lei Rouanet" (EXAME, 2011). A Lei Rouanet institui o Programa Nacional de Apoio à Cultura (Pronac), com intuito de captar e canalizar recursos para o segmento cultural nacional (COLLOR, 1986). Essa lei permite que empresas, ou mesmo pessoas físicas que produzem jogos, possam captar recursos e deduzi-los totalmente do imposto de renda (EXAME, 2011). No exterior a situação já é um pouco diferente. Basta apenas pesquisar na web para ver um grande número de oportunidades para se trabalhar com jogos e especificamente com o desenvolvimento em game engines. Até mesmos nas redes sociais (LinkedIn, por exemplo), é possível encontrar páginas e perfis de grandes empresas de jogos (como Ubisoft, Activision, Konami, Rockstar) oferecendo oportunidades de trabalho nas mais diversas áreas de jogos. 5 - CONCLUSÃO A partir dos temas abordados ao longo deste artigo, é possível perceber que as game engines são ferramentas muito complexas, pois abrangem várias áreas de conhecimento que exigem um esforço muito grande para serem desenvolvidas. Além de profissionais especialistas nas linguagens e plataformas nas quais a game engine permitirá produzir jogos, são necessários, também, profissionais especialistas em cada um dos subsistemas (vistos anteriormente) que comporão a ferramenta. Devido ao alto custo gerado pela produção de uma ferramenta de tamanha complexidade, há empresas no mercado que preferem comprar licenças e utilizar as game engines já existentes no mercado, adaptando-as se necessário. Essas ferramentas são projetadas para facilitar o trabalho dos desenvolvedores de jogos, pois abstraem conhecimentos de baixo nível necessários para utilizar o hardware específico utilizado em cada área de um jogo. Assim, elas permitem que os desenvolvedores com conhecimentos básicos em cada uma dessas áreas possam desenvolver seus jogos sem precisar se preocupar muito em aprofundar seus conhecimentos em cada área. No entanto, é importante ressaltar que, embora sejam muito úteis, as game engines não substituem a 20 necessidade de possuir conhecimento específico nas áreas inerentes aos jogos. Quando esse conhecimento é ausente à equipe de desenvolvimento, esta fica limitada às funcionalidades oferecidas pela game engine utilizada. É possível perceber que as game engines são ferramentas muito úteis, pois agilizam e "simplificam" o processo de desenvolvimento de jogos. Devido à sua complexidade (abrange muitas áreas do conhecimento distintas), seu custo de produção é muito elevado, o que faz com que algumas empresas optem por adquirir uma dentre as licenças de utilização das game engines disponíveis no mercado. O uso de game engines, no entanto, não substitui o conhecimento específico nas áreas abordadas por essas ferramentas, pois a ausência deste conhecimento limita a equipe de desenvolvimento e a qualidade do produto final às funcionalidades disponíveis na ferramenta escolhida. Há no mercado diversos tipos de licenças e preços, que variam de acordo com as funcionalidades disponíveis em cada licença. Como extensões futuras, sugere-se a exploração mais detalhada de cada funcionalidade das game engine, os estudos de caso práticos, a implementação de jogos ilustrativos, bem como a exploração das ferramentas de modelagem gráfica. Enfim, o presente trabalho abre rico espaço para experimentação e estudos no excitante campo do desenvolvimento de jogos eletrônicos. REFERÊNCIAS BIBLIOGRÁFICAS COLLOR, Fernando. LEI Nº 8.313, DE 23 DE DEZEMBRO DE 1991. Presidência da República, 23 de dezembro de 1991. Disponível em: < http://www.planalto.gov.br/ccivil_03/leis/L8313cons.htm >. Acesso em: 25 de outubro de 2012. EBERLY, David H. 3D Game Engine Architecture: Engineering Real-Time Applications with Wild Magic. Elsevier, 2005. ECMA. Standard ECMA-335: Common Language Infrastructure (CLI). ECMA International, 2012. Disponível em: < http://www.ecmainternational.org/publications/standards/Ecma-335.htm >. Acesso em: 24 de novembro de 2012. EXAME. Jogos eletrônicos entram na Lei Rouanet. Exame, 12 de dezembro de 2011. Disponível em: < http://exame.abril.com.br/tecnologia/noticias/jogos-eletronicos-entram-nalei-rouanet >. Acesso em: 25 de outubro de 2012. 21 FARIA, Fernando Antônio Batista de. Inteligência Artificial Aplicada a Jogos Eletrônicos. Dissertação (artigo), Faculdade Metodista Granbery, Curso de Bacharelado em Sistemas de Informação, Juiz de Fora, Minas Gerais, 2011. GOLDSTONE, Will. Unity Game Development Essentials. Packt Publishin, 2009. GUGELMIN, Felipe. Confira as novidades da versão 4.1 do OpenGL. TecMundo, 28 de julho de 2010. Disponível em: < http://www.tecmundo.com.br/programacao/4689-confira-asnovidades-da-versao-4-1-do-opengl.htm >. Acesso em: 1º de novembro de 2012. HIGGINS, Mark. Fourth Year Honours Project: Unity 3D. Behance. Disponível em: < http://behance.vo.llnwd.net/profiles20/656461/projects/2195057/589e4f057d1785ea2fa7cc44 4c726cb2.jpg >. Acesso em: 22 de outubro de 2012. KHRONOS, Group. OpenGL - The Industry's Foundation for High Performance Graphics. Khronos Group, 2012. Disponível em: < http://www.khronos.org/opengl/ >. Acesso em: 18 de novembro de 2012. KLEINA, Nilton. O que é engine ou motor gráfico? TecMundo, 2011. Disponível em: < http://www.tecmundo.com.br/video-game/9263-o-que-e-engine-ou-motor-grafico-.htm >. Acesso em: 20 de novembro de 2012. LIMA, Edirlei Everson Soares de. 3D Game Builder: Uma Game Engine para a Criação de Jogos 3D. Dissertação (artigo), Universidade do Contestado, Curso de Ciência da Computação, Porto União, Santa Catarina, 2008. MANUAL, Unity. Particle Systems. Unity. Disponível em: < http://docs.unity3d.ru/Images/manual/comp-ParticlesGroup-0.jpg >. Acesso em: 22 de outubro de 2012. MICROSOFT. Introdução à linguagem C# e o .NET framework. MSDN Microsof, 2012. Disponível em: < http://msdn.microsoft.com/library/vstudio/z1zx9t92.aspx >. Acesso em: 23 de outubro de 2012. MOZZILA. JavaScript. Mozzila Developer Network. Disponível em: < https://developer.mozilla.org/en-US/docs/JavaScript >. Acesso em: 23 de outubro de 2012. NILSON, Björn; SÖDERBERG, Martin. Game Engine Architecture. Artigo, 2007. NOKIA. J2ME: Class World. Nokia Corporation, 2005. Disponível em: < http://www.j2megame.org/j2meapi/JSR_184_Mobile_3D_Graphics_API_1_1/javax/microedi tion/m3g/doc-files/World-scenegraph.png >. Acesso em: 15 de outubro de 2012. PÍCOLO, Guilherme Gouvêa. Mercado de games atinge crescimento recorde no Brasil, diz PWC. Superdownloads, 11 de julho de 2012. Disponível em: < http://www.superdownloads.com.br/materias/mercado-de-games-atinge-crescimento-recordeno-brasil-pwc.html >. Acesso em: 10 de outubro de 2012. 22 PRIBERAM. Dicionário Priberam da Língua Portuguesa. Disponível em: < http://www.priberam.pt/DLPO/default.aspx?pal=motor >. Acesso em: 24 de novembro de 2012. STEAD, Chris. The 10 Best Game Engines of This Generation. IGN, 15 de julho de 2005. Disponível em: < http://www.ign.com/articles/2009/07/15/the-10-best-game-engines-of-thisgeneration >. Acesso em: 25 de outubro de 2012. ZERBST, Stefan; Düvel, Oliver. 3D Game Engine Programming. Thomson Course Technology PTR, 2004.