Arquiteturas de jogos e Animação 2D baseada em Sprites Prof. André Campos 30/04/2004
Arquitetura e características de jogos
Características dos jogos Jogos Aplicações em tempo-real Aplicações cujo tempo de resposta é crítico Possuem condições de restrições de tempo Ex: Monitoramento de vôos em um aeroporto Jogos Aplicações Interativas Aplicações cujo tempo de resposta das interações do usuário também é crítico Ex: Controle de tráfego aéreo Jogos Simulações Sincronização de Tempo real vs. Tempo virtual Eventos simulados
Jogos = simulações interativas em tempo real Tarefas concorrentes Apresentação (síncrona) Captura de eventos externos, ex. do usuário (assíncrona) Atualização do estado do “mundo simulado” (discreta) Eventos do usuário Apresentação Mundo simulado Atualização do estado
Módulos gerais Multi-threading? Apresentação (visual,áudio,...) Interação com o usuário Lógica do jogo Rede Multi-threading?
Módulos sincronizados Abordagens Seja Interação, Lógica e Rede = Atualização Atualização Atualização Atualização Apresentação Apresentação Apresentação Único thread Vários threads Módulos sincronizados
Módulos sincronizados Estratégia mais amplamente utilizada Idéia Executar as rotinas de atualização e apresentação seqüencialmente (único thread) em loop. Descartar as atualizações de forma a deixar um intervalo de tempo fixo de chamada às atualizações. Atualizações Apresentações Tick time
Exemplo básico de loop int TICK_TIME = 1000/frequency; long timeLastCall = getTime(); while(!end) { elapsedTime = getTime() – timeLastCall; if (elapsedTime > TICK_TIME) { gameUpdate(); timeLastCall = getTime(); } gamePresentation(elapsedTime);
Passos na fase de atualização Atualização do usuário Captura eventos Calcula restrições Atualiza o estado do jogador Atualização do mundo Elementos passivos Seleciona elementos relevantes para a engine Elementos dinâmicos básicos Ordena por relevância Executa mecanismos de controle Atualiza estado Elementos inteligentes (agentes) Tomada de decisão de acordo com objetivos e restrições
Passos na fase de apresentação Apresentação do mundo Seleciona elementos visíveis Seleciona resolução dos elementos (nível de detalhe) Empacota geometria Apresenta Seleciona e toca fontes de som Apresentação de personagens (NPC) Seleciona personagens visíveis Anima personagem Apresentação do jogador (avatar) Anima avatar
Animação 2D baseada em Sprites
O que é um Sprite? “Cel animation”: técnica utilizada no início da indústria de animação (Walt Disney) Desenho em folhas transparentes sobre imagem de fundo A ilusão de movimento é dada a partir de uma seqüência de desenhos sobre o mesmo fundo. Em animação 2D, o processo é similar Personagens são representados por várias imagens com partes transparentes A animação é o resultado da apresentação de uma seqüência de imagens (sprite) do personagem.
Animação baseada em sprite Conjunto de sprites de um elemento Imagem de fundo + sprite Loop da animação (do próprio jogo) Ilusão de movimento
Loop da animação Cada sprite pode ter seu próprio tempo de apresentação Importância a “elapsedTime” do loop do jogo gamePresentation(elapsedTime); 40ms 20ms 20ms 20ms
Exemplo de atualização void spriteUpdate(long elapsedTime) { animTime += elapsedTime; if (animTime >= totalDuration) { animTime = animTime % totalDuration; currImageIndex = 0; } while (animTime > image[i].endTime) { currFrameIndex++; } currFrameIndex 0ms 40ms 60ms 80ms 100ms animTime_0 animTime_1
Area de memória DoubleDuffer Double buffering Animação piscando Seqüência repetida de desenhar na tela a imagem de fundo e depois o sprite Solução Desenhar a imagem de fundo e o sprite em uma área de memória temporária (imagem) e depois transferir esta imagem para a tela Area de memória DoubleDuffer Tela
Page flipping Modo “full-screen” Solução Copiar toda uma área de memória para a memória de tela é custoso (tempo) Solução Redirecionar o ponteiro da área de memória da tela para o doublebuffer e utilizar um segundo buffer para desenhar o próximo frame. Ponteiro da tela Display buffer Back buffer Tela
Efeito Tearing Monitores possuem taxa de refresh Ex: 75MHz monitor é atualizado 75 vezes/s Tearing ocorre quando um page flipping é feito durante a atualização do monitor. Solução Sincronizar o page flipping com a taxa de refresh do monitor Antigo frame Novo frame
Exercício Implementar o loop de um jogo, onde o usuário controla o andar de seu avatar para a direita e para a esquerda