game programming

43
Programação de Jogos: visão geral para iniciantes da cobrinha ao Bioshock em 50 min… Fabio Fonseca – catavento.art.br

Upload: fabio-fonseca

Post on 27-Jun-2015

659 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Game programming

Programação de Jogos: visão geral para iniciantes

da cobrinha ao Bioshock em 50 min…

Fabio Fonseca – catavento.art.br

Page 2: Game programming

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...).

Page 3: Game programming

Meta

• Entender o Game Loop

• Entender o que é e quais são os componentes de uma game engine

Page 4: Game programming

VS.

Page 5: Game programming

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

Page 6: Game programming

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 -> ∞ ...

Page 7: Game programming

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

Page 8: Game programming

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

Page 9: Game programming

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

Page 10: Game programming

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

Page 11: Game programming

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.

Page 12: Game programming

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.

Page 13: Game programming

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

Page 14: Game programming

• 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

Page 15: Game programming

• 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

Page 16: Game programming

Dividir e conquistar

Page 17: Game programming

Dividir e conquistar

Entidades Física

RenderizaçãoCena

Recursos

Input

Áudio

Uma game engine mínima

Log

Page 18: Game programming

• 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

Page 19: Game programming

• 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

Page 20: Game programming

• 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

Page 21: Game programming

O que é…

Scene Graph – Grafo de cena

http://www.cs.berkeley.edu/~sequin/CS184/LECT_09/L7.html

Page 22: Game programming

• 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

Page 23: Game programming

Input devices, já perdendo o controlePlanejar para o futuro

Mind Control Helmet

WTF???????

Page 24: Game programming

Vocabulário importante

Esses dois monstros sempre voltam:

Polling

Listeners

Page 25: Game programming

• 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

Page 26: Game programming

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????

Page 27: Game programming

• 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

Page 28: Game programming

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

Page 29: Game programming

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

Page 30: Game programming

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

Page 31: Game programming

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

Page 32: Game programming

• 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

Page 33: Game programming

• 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

Page 34: Game programming

• 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?

Page 35: Game programming

• 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

Page 36: Game programming

• 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

Page 37: Game programming

• 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

Page 38: Game programming

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.

Page 39: Game programming

Bibliotecas

Box2D

Page 40: Game programming

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 ....????

Page 41: Game programming

Resumo

A game engine!Entidades Física

RenderizaçãoCena

Recursos

Input

Áudio

Uma game engine mínima

Log

Page 42: Game programming

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!

Page 43: Game programming

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