Ponto V!

Home Ethanon Como funcionam os games
André Santee
Como funcionam os gamesImprimir
Escrito por André Santee

O video game é um jogo eletrônico que envolve interação, e algum tipo de desafio através de uma interface que contenha entrada de dados, e produza saída de dados ao jogador. A palavra vídeo diz respeito a um sistema de visualização baseado em imagens rasterizadas, isto é, grades de pixeis distribuidas em tela, que é o dispositivo de saída mais comum. Por envolver interatividade, os video games precisam de dispositivos de entrada, ou em inglês Input, de dados. Praticamente todo tipo de input pode ser utilizado pelos jogos eletrônicos para algum propósito, e diferentes tipos de jogos podem utilizar vantagens específicas de cada dispositivo. Os dispositivos mais comuns são os joysticks, teclados, mouses, telas sensíveis ao toque, acelerômetros e demais sensores de movimento. Estes são denominados de dispositivos de entrada.

O laço principal

Já sabemos que para programar video games precisamos estar constantemente obtendo dados dos dispositivos de entrada e exibindo o resultado dessas ações através do dispositivo de saída, obedecendo uma determinada lógica do jogo. Toda essa ação acontece dentro de um laço lógico que vamos chamar de laço principal.

Laço principal: Leitura da entrada de dados; atualização da IA, física e lógica e desenho do quadro atual.

O laço principal não é uma exclusividade dos jogos. Todo o programa de computador que ofereça interatividade em tempo real deve se basear num laço principal, mesmo que esse seja abstraído por alguma API de alto nível. Antes de mais nada, devemos entender que um laço principal nada mais é do que um laço lógico como um for ou while. Para entender como ele funciona, vamos pegar como exemplo o diagrama da figura acima. Nele vemos três pequenas etapas aninhadas dentro de um laço.

Para melhor imaginá-lo dentro de um programa real, podemos considerar o seguinte pseudocódigo em C++:

while (sair != false)
{
    captura_entrada_de_dados();
    processa_IA();
    processa_Fisica();
    exibe_Imagem_Final();
}

Note que neste exemplo estamos considerando um laço simples de única thread, mas também existem laços onde algumas etapas são executadas paralelamente por múltiplas threads, aspecto que deve ser abstraído pelo engine e normalmente não concerne à preocupação do programador de gameplay.

Quadros e animação

A primeira tarefa dentro do laço trata de obter dos dispositivos de entrada alguns dados úteis, por exemplo: “O jogador pressionou o botão de tiro?”. Esta tarefa está estreitamente ligada com a segunda, que trata de processá-la,
seja aplicando física, ou executando algum tipo de inteligência artificial ou resposta imediata.

Por exemplo: “Se o jogador pressionou o botão de tiro, exibimos a animação de tiro e calculamos quanto de dano isso causou ao inimigo”. Ao processar essas ações primárias, podemos processar ações secundárias ainda dentro da tarefa de física, lógica e IA, por exemplo: “Se o inimigo já sofreu dano suficiente, exibimos a animação dele sendo destruído”.

Depois que já temos todas essas informações, como “O jogador atirou”, “O inimigo está sendo destruído”, “Outro inimigo está correndo em direção ao jogador”, etc. começamos o processo de desenho, que consiste em “tirar uma foto” de toda a ação nesse exato instante e enviar essa foto para a tela.

Para que um jogador visualize o simples evento de um inimigo sendo destruído, podem ser necessárias diversas repetições do laço principal, e em conseqüência disso, dezenas de “fotos” sendo enviadas à tela dentro de um espaço de tempo de um segundo ou menos.

Desde o momento em que o tiro do jogador é processado até o início e fim da animação que irá mostrar o inimigo sendo atingido, o laço terá se repetido dezenas ou centenas de vezes.

Cada repetição desse laço, que em seu último passo termina por desenhar tudo e exibir essa ação na tela, é chamada de quadro, ou muitas vezes usa-se o termo em inglês: frame.

Animação quadro-a-quadro

A figura anterior ilustra como seriam alguns quadros que exibissem uma ação como a descrita anteriormente. Observe que no quadro 1 temos dois personagens sendo desenhados sobre uma paisagem qualquer.

Quando o jogador pressiona o botão de tiro, essa ação será detectada no quadro 2 e o programa irá exibir uma animação que mostra o personagem do jogador disparando com a arma de fogo. Esse evento é detectado e processado e os quadros 3 ao 6 exibem a conseqüência: uma animação de explosão que é executada sobre o monstro e essa seqüência se segue por 4 quadros.

A seqüência de eventos desencadeada por ações do jogador pode acontecer dezenas, até centenas de vezes por segundo em um jogo, e tudo isso é processado dentro do laço principal.

Espaço ortogonal

As coordenadas na tela são determinadas num plano de projeção ortogonal (bidimensional) simples. Com as peculiaridades de que seu eixo central localiza-se no canto superior esquerdo da tela e o eixo Y aponta para baixo:

Espaço ortogonal

A primeira linha e a primeira coluna de pixeis são contadas como 0, isso significa que a última coluna na tela é a w1, onde w é a quantidade total de colunas em tela. Pixeis são identificados por sua posição em (X,Y), onde X descreve o número identificador da coluna (contado da esquerda para direita) e Y o número da linha (de cima para baixo).

Sprites

Sabemos que a unidade gráfica mínima em uma imagem é o pixel, e que juntos, pixeis formam imagens. Imagens digitais podem ser geradas digitalmente em tempo de execução ou carregadas de arquivos como o PNG ou JPEG. Esses formatos armazenam imagens retangulares compostas por pixeis. A essas imagens damos o nome de bitmap. Quando desenvolvemos jogos 2D, não podemos depender somente de figuras retangulares em nossa cena. Na maioria das vezes, os elementos de cena precisam assumir formatos arbitrários, para isso utilizamos os sprites.

Sprites

Sprites possuem linhas e colunas de pixeis e podem ser armazenadas em formatos de bitmap comuns. O que faz dos sprites especiais em relação aos bitmaps é a forma com que eles são tratados pelo renderizador, pois possuem cor de fundo transparente.

Alfa para transparência

Com o avanço do hardware, tornou-se viável o uso de sprites com níveis de transparência individuais para cada pixel no bitmap. O nível de transparência está armazenado no canal alfa, ao lado dos já conhecidos canais vermelho, verde e azul. O ato de combinar um pixel à cor de fundo no intuito de criar um efeito de transparência chama-se alpha blending.

Se o sprite possui canal alpha, este valor pode variar de 0 (completamente invisível) a 255 (completamente opaco). Quando o valor do alfa está entre 1 e 254, a cor do pixel é combinada progressiva e linearmente à cor no fundo, produzindo efeitos de transparência em diversas intensidades.

Alpha blending

Bitmaps no padrão PNG podem armazenar pixeis no formato ARGB (alpha, red, green, blue), por isso são usados com frequência em games 2D. Outros formatos populares como o BMP convencional e JPEG não suportam canal alpha. Boa parte dos bons editores de imagens como o Photoshop ou Pixelmator podem criar e exportar imagens com canal alpha.

O alpha blending alpha blending pode ser utilizado em jogos para criar efeitos como fumaça, fogo, nuvens, sombras e reflexos.


Comentários (14)
  • almarakk
    avatar

    Estou achando bem interessante mesmo os textos, esperando por mais agora. Sempre achei interessante a sua visão de 2D como um estilo, sempre pensei parecido.

  • Emerson  - Aprendiz
    avatar

    Bem, adorei a matéria, tava fazendo umas pesquisas e me deparei com essa matéria, esclareceu várias dúvidas iniciais, quero entrar nessa área de desenvolvimento, mas como um aprendiz inicial, esse post foi bastante esclarecedor! ^^

  • Mauricio  - Duvida
    avatar

    Olá, André, esses posts aqui fazem parte, do desenvolvimento de jogos 2D ? [Oque são Game Engines] [Como funcionam os jogos] ? a proposito estão ótimos os seus posts, estou aguardando os próximos, abraço e obrigado.

  • André Santee
    avatar

    Oi Mauricio, é sim, uma série, eles devem ser lidos em seqüência. Vou sugerir ao editor renomear com um "Gamedev com Ethanon N" para facilitar entender isso.

    No mais, obrigado pelo feedback pessoal!

  • ViniGodoy
    avatar

    Pessoal, nós vamos fazer os ajustes para isso ficar mais claro. Quem quiser ver a sequencia completa, pode clicar na sessão Ethanon, no lado esquerdo do site.

  • André Santee
    avatar

    Pessoal, só esclarecendo, esse texto faz parte de uma série sobre desenvolvimento de games com a Ethanon engine que está sendo postado em seqüência aqui no PontoV. Isolado, o título parece "pretensioso demais" :)

  • Carlos Magno
    avatar

    Primeiramente meus parabéns pelo nível de qualidade dos conteúdos.
    Gostaria de saber se o aprendizado de Fisíca e Matemática é indispensável ou se as engines suprem TODA a falta de conhecimento dos mesmos?
    Pergunto isto pois, ao meu modo de ver, um programador de linguagens de alto nível cosnegue se virar muito bem mesmo sem quaisquer conhecimentos de linguagens de máquina.
    O conselho de vocês seria MUITO valioso, pois não sei se me dedico a reeaprender(e aprender tbem) física e matemática ou partir direto para a programação de jogos 2D.

    Desde já muito obrigado!

  • André Santee
    avatar

    Oi Carlos,
    Bom, linguagem de máquina é algo que hoje em dia é dispensável, você consegue fazer praticamente qualquer coisa sem dominá-la, já matemática e física, também acredito que você possa até se virar em alguns casos com um domínio limitado, mas acho que o domínio de vetores, um pouco de matrizes e uma fluidez um pouco maior com a lógica matemática pode ser um empecilho para você criar bons jogos sim.

    Mas você não precisa ser nenhum Einstein. Eu mesmo me considero bem ruim, sempre ia mal em matemática na escola. Acho que prática em lógica é mais importante que domínio teórico se a finalidade for criar algo novo, sem ter necessariamente uma finalidade teórica.

  • Gustavo Silveira  - Muito bom
    avatar

    Parabéns André Santee e equipe do Pontov, muito bom o site e esta série sobre desenvolvimento em 2D.

    Estou muito interessado nesse mundo de programação de jogos, mas tenho tido dificuldade em focar uma vertente específica. Tem muita informação na WEB, mas muita coisa dispersa.

    Após ler esta série de textos decidi concentrar meus estudos em 2D e 2.5D, formato com o qual sempre simpatizei por ter jogado muito em consoles de 4, 8 e 16 bits.
    Aguardo ansiosamente pelo Ethanon para Linux, enquanto isso vou tentar desenvolver em java, pois já tive bons resultados com a plataforma Greenfoot.

    Parabéns novamente e espero ler em breve a continuação dessa ótima série de textos.

  • Diego  - Muito legal
    avatar

    Ola,
    gostei bastante, estou procurando algo pra fazer no tcc, e este pequeno "artigo" e fundamental para quem esta començando na area, como eu, por exemplo. Obrigado!

  • Kauã  - Legal
    avatar

    Ola,
    Muito interessante isso agora sabemos como funciona os games.

  • asdfhashhinasnf  - bachjknjcasnc nsanbcv
    avatar

    :woohoo: :X :side: :P :confused: :angry: :evil: :silly: :dry: :lol: :kiss: :D :pinch: :( :shock: :X :side: :) :P :woohoo: :woohoo: :huh: :whistle: ;) :S :!: :?: :idea: :arrow:

  • asdfhashhinasnf  - NBV,BMMK~,L
    avatar

    ujvhsvjdjsavjdsakovmdojksmvmisdnvsdjinjnjomgvjinhjnhu bjhnnnnnn leuaHagIAU O JOGO QUYE JOGAO VHDCBHVUSDGYVSATUGYTSDAUGCS ACGSYDUNGYU FTFTRFRF

  • Gui Carneiro
    avatar

    Ótimo artigo, principalmente para os iniciantes. :D

    Eu também escrevo, porém é mais focado em notícias ( www.pyre.com.br ), super aceito feedbacks :P

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter