Click here to load reader
Upload
fabio-fonseca
View
242
Download
10
Embed Size (px)
Programação de Jogos: visãogeral para iniciantes
da cobrinha ao Bioshock em 50 min…
Fabio “Draco”Fonseca
http://catavento.art.br
Disclaimer
• Esta apresentação é baseada nos meusestudos sobre programação de jogos. Qualquer disparidade com autor X ou Y oudesign Z ou W ou engine A ou B é por suaconta e risco. Mas eles vão te dizer que o game loop é o mesmo (bem, eu mudei a ordem do game loop padrão...).
Meta
• Entender o Game Loop
• Entender o que é e quais são os componentesde uma game engine
Antes de começar, o que você precisasaber?
• Programar
– Pode ser POO ou estruturada
• Física e Matemática
– Saber aquela do cursinho ajuda horrores…
• Google e Fóruns
– pontov.com.br, gamedev.net, box2d.net
Let’s begin the operation!
2D ou 3D, escolhendo o número de dimensões
• Qual o problema a ser resolvido e para qualplataforma?
• Simples e original vs. complexo e padrão– Tive uma idéia! Vou fazer o Resident Evil 7!– O número de dimensões não importa dependendo da tua
escolha.
• Complexo e original– Se Δt -> ∞ ...
Gentleman, start your engines
Surge com Doom em meados dos anos 90. Programado com relativa separação entre sistemas de renderização, colisão, audio, arte, mapas e regras de jogo.
Mods: a separação criada pela ID permitiu que gamers individuais e pequenos gruposcriassem jogos baseados na estrutura de Doom.
Upgrade: Unreal, Quake III com linguagens próprias de script.
“Data-driven architecture”: Teoricamente a regra de jogo e a parte lógica ficariamseparadas dos outros elementos, permitindo que vários jogos do mesmo estilo fossemfeitos a partir da mesma plataforma.
Mas não há separação clara nem entre elementos nem entre o que é um jogo e o queé a engine.
“Tudo acontece na periferia. Brigas, mortes na periferia” – Ratos de porão
Gentleman, start your engines
“We should reserve the term “game engine” for software that is extensible and canbe used as the foundation for many differente games without major modification” –Jason Gregory, Game Engine Design Architecture
What’s inside?
Hardware e SO.
Abstração do SO e SDKsespecíficas para cada sistema
Inicialização e configuração
Gerenciador de física eanimação de corpos
Áudio e rede
Específico do jogo
Renderização egerenciador de cenas
HUD, efeitos visuais
Depois, as ferramentas
O eterno debate sobre linguagem de programação e sobre qual engine utilizar
• A melhor e mais eficiente linguagem de programação– É aquela que você mais sabe– É aquela que responde o problema “plataforma alvo + eficiência
computacional”
• Engine– É aquela que você mais sabe– É aquela que vai te oferecer maior suporte e menor tempo de
aprendizado – e está mais próxima do game que você tem em mente– É aquela que utiliza a linguagem que você mais sabe
20 infinite loop
• Game loop ou jogos são ilusões
– É o laço onde todas as alterações do sistema que compõem um game, áudio, gráficos, física, etc., são atualizadas
– Como o cinema, os jogos também precisam de, pelo menos, 24 quadros por segundo para dar a ilusão de interatividade.
21 infinite loop
• Exemplo:
while (g_renderManager->update()){
g_sceneManager->update();
entityManager->update();
psx->update();
inputManager->update();}
Pinta na tela o resultado final do frame atual
Verifica se há eventos de cena: telas de game over, HUD, outros
Faz update da animação e posição das entidades com os resultados do frame anterior.
Resolve a física dos objetos, detecta colisão e atualiza valores das posições.
Verifica input feito pelo jogador e deixa de prontidão outros blocos para o próximo frame.
22 infinite loop
• Não reinvente a roda*
– Padrões de código
– Design Patterns
– Bibliotecas e suas APIs
– Game engines
*Do menos abrangente para o mais abrangente
• Por que utilizar
– Precisar não precisa, mas ajuda bastante
• Dividir e conquistar
– Cada gerente no seu quadrado
– Estrutura geral
Visão geral
Game engine simples e seuscomponentes1
• Custos: Time is money. Inclusive o seu tempo livre.
• Divisão de trabalho: componentesindependentes sendo produzidos emseparado; boas práticas.
• Sucesso: Você tem uma equipe, e agora!?
• Foco no negócio.
Por que utilizar
Precisar não precisa… ou um breveconto de Engenharia de software
Dividir e conquistar
Dividir e conquistar
Entidades Física
RenderizaçãoCena
Recursos
Input
Áudio
Uma game engine mínima
• Precisar não precisa…
• Mesmo se for um sistema simples com assert e printf já vale.
• Sofrimento pessoal: saída de std::cout no console deixava o sistema inativo. Melhor cuspir para um arquivo texto.
• Bibliotecas profissionais: Log4j, glog
• Cláusulas de throw / catch
Desmembrando
Por que um componente de log salvará tua vida2
• Arquivos de configuração
– Áudio, imagens, grafos de cenas, modelos 3D, etc
• Tipos de arquivos
– XML, Binários, DX Studio
Desmembrando
Recursos, uma colheita feliz3
• Responsável pelo consumo otimizado de todos osarquivos que a game engine utilizará.
• Alimentação dos outros componentes. Emespecífico:– Preenche gerenciador de cenas com seus grafos
(“desenho” das cenas).– Conecta as entidades do game
(personagens, cenário, etc) com suas respectivasimagens e sons.
– Inicializa a física com as configurações escolhidas– Mapeia controles e teclas para o funcionamento no
jogo.
Tenha seus arquivos estruturados de maneira amigável
Componente de recursos
O que é…
Scene Graph – Grafo de cena
http://www.cs.berkeley.edu/~sequin/CS184/LECT_09/L7.html
• Troca de contextos– O gerenciador deve ser capaz de alterar o
mapping dos controles conforme contexto
• Polling / Listeners– Pode-se checar o estado do controle a cada
frame ou ficar na escuta de um evento.
• Independente do Hardware– Abstração via bibliotecas ou wrapping
Desmembrando
Input devices, não perca o controle4
Input devices, já perdendo o controle
Planejar para o futuro
Mind Control Helmet
Vocabulário importante
Esses dois monstros sempre voltam:
• Sempre relegado, sempre uma dor de cabeçadepois.
• O problema da sincronia
• BGM vs. FX’s
– BGM: eventos e troca de contexto
– FX’s: listeners ou polling
• BASS audio
Desmembrando
Audio, 1, 2, 3, SOM.5
21 infinite loop
• Exemplo:
while (g_renderManager->update()){
g_sceneManager->update();
entityManager->update();
psx->update();
inputManager->update();}
Pinta na tela o resultado final do frame atual
Verifica se há eventos de cena: telas de game over, HUD, outros
Faz update da animação e posição das entidades com os resultados do frame anterior.
Resolve a física dos objetos, detecta colisão e atualiza valores das posições.
Verifica input feito pelo jogador e deixa de prontidão outros blocos para o próximo frame.
• No final do dia, é atualizar a tela com as informações obtidas até o momento por todosos outros gerenciadores.
• Algoritmo do pintor: resolvendo o problemada visibilidade dos elementos 3D -> 2D; z-order.
• Bibliotecas: DirectX/OpenGL, Ogre3D, SDL, SFML.
Desmembrando
Renderização, o algoritmo do pintor6
Monstro do Polling ataca novamente
• Checa os gerenciadoresde cena e objetos
• Renderiza na ordemencontrada no grafo de Cena, i.e. respeitando o algoritmo do Pintor.
O que mudou entre frames?
Algoritmo do Pintor e Z-order
• Objetos do fundo são desenhados primeiramente.• Ordem de profundidade é respeitada. Objetos com menor
coordenada Z são desenhados primeiros. • Há redundância nas áreas pintadas, mas problema da visibilidade é
resolvido. O resultado final contém somente os objetos observáveis.
Primeiramente o que vem primeiro
3D
Microsoft Windows API was designed to provide software developers with direct access to low-level functions on PC peripherals -http://www.digitalhymnal.org/glossary_a-l.html#D
The class library abstracts all the details of using the underlying system libraries like Direct3D and OpenGL and provides an interface based on world objects and other intuitive classes – ogre3d.org/about
2D
Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. -http://www.libsdl.org/
SFML is a free multimedia C++ API that provides you low and high level access to graphics, input, audio, etc.; SFML is a portable and easy to use multimedia API written in C++. You can see it as a modern, object-oriented alternative to SDL – sfml-dev.org/features.php
• Cada fase é uma cena completa, e suaconfiguração geral e relação entre os elementosque a compõem são feitos por arquivos externos.
• Listeners para eventos• É uma ponte entre o renderizador e o conjunto
de elementos “vivos” (player e inimigos, porexemplo).
• Biblioteca: não conheço, mas Ogre3d e Cocos2d são baseado em cenas.
Desmembrando
Cena, fazendo uma7
• Pense nos designers
• Trabalhar com elementos concretos é mais fácildo que tileset
• Mesmo um XML de configuração é mais fácil de se consumir do que um ASCII
• Se trabalhar com 3D, vai bater em grafos de cenade uma maneira ou outra.
• É intuitivo (sort of…)
Volta do grafo de cena
Entendendo o porquê do arquivoexterno
• Todos os sprites em um só lugar
• Ponte entre e o gerenciador de cena e o de física
• É ótimo ter uma fábrica de entidades (a design pattern Factory)
Desmembrando
Entidades, tudo o que não for cenário ou som8
• Listas de objetos sãoutilizadas para teste de colisão e outros eventos. Se utilizarmos uma classebase, é mais fácil manipulá-los.
• Tudo que está na tela podeser uma entidade, mas nemtudo que está na tela é a MESMA entidade. Umafábrica de componentesresolve o problema.
Criando bichos
A design pattern factory em jogos
• Na verdade, uma biblioteca de física é um motor de animação dos elementos na tela
• Não crie seu solver de física, mesmo se soubercomo fazer um.
• Mesmo se for 2D, vale a pena usar físicanewtoniana “de verdade”. Não tenha medo.
• Bibliotecas prontas: Box2D, Havok, PhysX
Desmembrando
Física, caindo de pau no Newton9
EDOs, EDPs, Êita
O problema das equações diferenciais
generic scalar transport equation
Ok, essa equação é para o movimento de um fluido, mas vale pra assustar. A “classe” de equações utilizadas na programação de jogos é a mesma desta, e os problemas enfrentados na discretização também são os mesmos.
Bibliotecas
Box2D
Resumo
O game loop
• Exemplo:
while (g_renderManager->update()){
g_sceneManager->update();
entityManager->update();
psx->update();
inputManager->update();}
Pinta na tela o resultado final do frame atual
Verifica se há eventos de cena: telas de game over, HUD, outros
Faz update da animação e posição das entidades com os resultados do frame anterior.
Resolve a física dos objetos, detecta colisão e atualiza valores das posições.
Resumo
A game engine
Entidades Física
RenderizaçãoCena
Recursos
Input
Áudio
Uma game engine mínima
Inteligência artificial• Implementação, algoritmos e gerenciadores
Rede• Multiplayer online• Gravação / acesso
Engines / SDKs• Números demais para mencionar• Pesquise conforme necessidade, hardware e plataforma(s) de interesse
Estrutura de dados e algoritmos• De listas até Quad/Octress
Apenas que … busquem conhecimento…• Quem não tem o Bilú, que use o Google
There is a lot more…
O que faltou!
Referências
Game Engines• Game Engine Architecture, Jason Gregory• Game Engine Design and Implementation, Alan Thorn
Programação de jogos• Games programming, Alan Thorn• Beginning Game Programming, Hattan & Sikora• Game Code Complete, Mike McShaffry• www.gamedev.net• Data Structures and Algorithms for game Developers, Alan Sherrod
Design Patterns• Head First Design Patterns, Freeman & Freeman• Design Patterns, GoF
Física• www.box2d.org• 3D Math Primer for Graphics and Game Development, Fletcher Dunn