
Aqui, eu tratarei um pouco sobre o fluxo de jogo.
Qualquer jogo possui uma estrutura genérica que geralmente segue o mesmo padrão. Aqui, o principal é mostrar o básico, e sem utilizar ferramentas que escondem alguns dos passos básicos do fluxo.
Como eu havia falado, o Windows Forms atualiza as figuras na tela automaticamente quando detecta uma mudança, e isso é bem difícil de controlar manualmente. Então, a parte de fazer as imagens ser renderizadas fica oculta para nós.
Abaixo está a figura com o fluxo básico do WinForms Lander. Vejam:
Como podem ver, não é nada muito complicado. Dos 3 blocos, o mais importante é o Update. Nele todas as coisas que fazem a partida funcionar são continuamente executadas num loop infinito. Bom, só não é infinito porque se o jogador vencer ou perder, o loop se quebra e o jogo segue para o terceiro bloco.
No caso do WinForms Lander, e muito povavelmente para qualquer engine, o update é disparado automaticamente. Geralmente é utilizado um temporizador (timer para os íntimos) que dispara uma função a cada X milisegundos. Em Windows Forms, eu utilizo o controle Timer. No evento Timer.Tick eu chamo a minha função Update().
O padrão para os jogos é rodar a 60 quadros por segundo, e isso conta também os updates, e não somente a atualização dos gráficos. Na verdade, como os videogames são feitos para ligar na TV, e a TV atualiza as imagens 60 vezes por segundo, o video dos consoles gera e envia imagens nesta taxa também. E como o processo de update e geração de imagens são síncronas, o update acaba rodando nesta velocidade.
Muito provavelmente, até os jogos de PC com taxa de quadros variável deve rodar seus updates 60 vezes por segundo. Ou seja, mesmo que o jogo esteja exibindo 20 frames por segundo, a captura de teclas, detecção de colisão, movimentos e toda a lógica do jogo está executando a cada 16,66 milisegundos (60Hz). Isso se deve ao fato dos jogos modernos serem assíncronos. Ou seja, a geração das imagens não bate com a atualização delas, nem com a lógica de jogo. Isso quer dizer que é possível jogar Quake 3 com a lógica rodando a 60Hz, taxa de atualização do monitor à 85Hz, e 70 FPS. Num console, principalmente os antigos, é tudo síncrono. Acredito que nos consoles antigos, disparar o update seja uma implementação de hardware, com o uso de algum temporizador baseado num chip.
Mas isso é só suposição. Imagino que seja assim porque ao usar um jogo NTSC (60Hz) num console PAL (50Hz), o jogo roda mais lento. O inverso também ocorre.
Usando o Timer do Windows Forms, é possível informar o intervalo de tempo em que o evento Timer.Tick será disparado. Com isso, podemos fazer com que a lógica do jogo seja executada no tempo que quiser. E o melhor é que o intervalo pode ser alterado a qualquer momento. O legal é que diminuindo o intervalo, todo o jogo se acelera. Não sei se é possível alterar o intervalo em qualquer ferramenta.
Por enquanto é isso.
Tags: C#, Desenvolvimento, Jogos, Windows Forms, WinForms Lander
Categorias: Desenvolvimento | No Comments »