Upload
fabio-fonseca
View
659
Download
4
Embed Size (px)
Citation preview
Programação de Jogos: visão geral para iniciantes
da cobrinha ao Bioshock em 50 min…
Fabio Fonseca – catavento.art.br
Disclaimer
• Esta apresentação é baseada nos meus estudos sobre programação de jogos. Qualquer disparidade com autor X ou Y ou design Z ou W ou engine A ou B é por sua conta 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 componentes de uma game engine
VS.
Antes de começar, o que você precisa saber?
• 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 qual plataforma? • 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 grupos criassem 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 ficariam separadas dos outros elementos, permitindo que vários jogos do mesmo estilo fossem feitos 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 can be 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 e gerenciador 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 seus componentes1
• Custos: Time is money. Inclusive o seu tempo livre.
• Divisão de trabalho: componentes independentes sendo produzidos em separado; boas práticas.
• Sucesso: Você tem uma equipe, e agora!? • Foco no negócio.
Por que utilizar
Precisar não precisa… ou um breve conto de Engenharia de software
Dividir e conquistar
Dividir e conquistar
Entidades Física
RenderizaçãoCena
Recursos
Input
Áudio
Uma game engine mínima
Log
• 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 os arquivos que a game engine utilizará.
• Alimentação dos outros componentes. Em específico:– Preenche gerenciador de cenas com seus grafos
(“desenho” das cenas).– Conecta as entidades do game (personagens, cenário, etc)
com suas respectivas imagens 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 controlePlanejar para o futuro
Mind Control Helmet
WTF???????
Vocabulário importante
Esses dois monstros sempre voltam:
Polling
Listeners
• Sempre relegado, sempre uma dor de cabeça depois.
• 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.
E O SOM????
• No final do dia, é atualizar a tela com as informações obtidas até o momento por todos os outros gerenciadores.
• Algoritmo do pintor: resolvendo o problema da 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 gerenciadores de cena e objetos
• Renderiza na ordem encontrada no grafo de Cena, i.e. respeitando o algoritmo do Pintor.
O que mudou entre frames?
Polling
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 sua configuração geral e relação entre os elementos que 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, por exemplo).• Biblioteca: não conheço, mas Ogre3d é baseado em
cenas.
Desmembrando
Cena, fazendo uma7
• Pense nos designers• Trabalhar com elementos concretos é mais fácil
do 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 cena
de uma maneira ou outra.• É intuitivo (sort of…)
Volta do grafo de cena
Entendendo o porquê do arquivo externo
• Deve conversar com o gerenciador de recursos e levar uma cena e suas relações para a memória
• Conter um gerenciador de eventos, onde, a cada frame, será checado se devo mudar de cena, entrar em um menu, etc
• Transformações da própria cena: rotação, câmera, iluminação.
• Ponteiro para as entidades… próximo slide
Entendi! Mas o que deve conter?
• 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ão utilizadas para teste de colisão e outros eventos. Se utilizarmos uma classe base, é mais fácil manipulá-los.
• Tudo que está na tela pode ser uma entidade, mas nem tudo que está na tela é a MESMA entidade. Uma fábrica de componentes resolve 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 souber como fazer um.
• Mesmo se for 2D, vale a pena usar física newtoniana “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.
E O SOM E O AI E A REDE
E ....????
Resumo
A game engine!Entidades Física
RenderizaçãoCena
Recursos
Input
Áudio
Uma game engine mínima
Log
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