segunda-feira, 29 de junho de 2009

XNA Game Studio 3.1

No dia 11 de junho de 2009 foi lançada a versão 3.1 do XNA Game Studio. Essa é uma versão incremental a versão 3.0 e contém muita coisa nova.


Agora é possível renderizar e animar avatares para serem usados nos jogos representando jogadores e outros personagens do jogo, permitir a comunicação entre os jogadores mesmo se eles não estiverem jogando na mesma sessão, suporte ao playback de vídeos durante o jogo, também tivemos algumas mudanças na API de áudio, melhorias no Content Pipeline e suporte ao XACT3.

Os jogos desenvolvidos com a versão 3.1 do XNA Game Studio poderão ser enviados ao Xbox LIVE Community Games em julho por usuários premium.

quinta-feira, 18 de junho de 2009

Tutorial - Nosso Primeiro Jogo 2D - Parte 6

Neste tutorial veremos, passo a passo, como criar um jogo 2D simples. Este tutorial foi baseado nos vídeos Beginners Guide to 2D Games encontrados no site creators.xna.com.

Esta é a sexta parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio. Aqui veremos como manter e atualizar o controle da pontuação do nosso jogo. Mas antes...

Pesquisando sobre as colisões em jogos 2D, encontrei um método de verificar a colisão por pixel que funciona checando se os pixels de uma imagem intercedem algum pixel de uma outra imagem. Assim podemos tornar nossas colisões mais realistas pois só irão colidir se os pixels das duas imagens entrarem em contato.

Atualizando as Colisões

No nosso arquivo GameObject.cs vamos adicionar um vetor de cores que chamaremos de textureData e que armazenará a informação dos pixels dos nossos objetos.

No arquivo Game1.cs, onde carregamos nossos mísseis, e onde carregamos as aeronaves inimigas, vamos carregar também os vetores de textura de cada um deles.

Agora que temos os dados das texturas de cada imagem, tanto dos mísseis como das aeronaves inimigas, vamos criar no final do arquivo Game1.cs o método IntersectPixels que receberá os retangulos que envolvem duas imagens e suas informações de textura e retornará verdadeiro ou falso caso essas imagens colidam ou não. Esse método também está disponível no site creators.xna.com.

Por último, na função UpdateCannonMissiles(), no trecho em que testávamos a colisão dos mísseis com as aeronaves inimigas, vamos utilizar o método que acabamos de criar.

Se não esquecemos de nada e modificamos tudo direito o projeto deve compilar e rodar sem problemas e agora com colisões mais precisas.

Agora podemos partir para nosso placar. rs.

Criando e Carregando o Arquivo de Definição de Fonte

Para criarmos o nosso controle da pontuação do jogo, precisaremos criar um arquivo que descreverá a fonte que usaremos para escrever algo na tela. Assim, no Solution Explorer, vamos criar uma sub pasta dentro da pasta Content. Clicando com o botão direito na pasta Content, no Solution Explorer, Add->New Folder. Chamaremos essa nova pasta de Fonts.

Após a criação da nossa nova pasta chamada Fonts, iremos clicar com o botão direito nela e Add-> New Item. Aparecerá na tela uma janela para adicionarmos um novo item ao nosso projeto. Selecionaremos adicionar um Sprite Font cujo nome será gameFont.spritefont.

Clicando no botão Add veremos o arquivo gameFont.spritefont ser adicionado ao projeto dentro da pasta em que o inserimos no Solution Explorer e uma nova aba aberta exibindo o conteúdo do nosso novo arquivo. Esse arquivo não é descrito em C# mas em XML que é uma linguagem criada para descrever dados. O nosso arquivo XML está organizado de modo que descreve as informações de nossa fonte.

Faremos algumas alterações nesse arquivo para que fique de acordo com o que desejamos em nosso jogo. Dentro das tags que descrevem o nome da nossa fonte, FontName, iremos colocar o nome da fonte que desejamos utilizar no nosso jogo e que tenhamos no nosso sistema, neste caso usaremos a fonte Arial. Logo abaixo das tags de nome da nossa fonte, temos as tags Size, responsáveis pelo seu tamanho e iremos alterá-la para 18. Feitas essas alterações, podemos salvar nosso arquivo.

Agora iremos ao arquivo Game1.cs e no início do arquivo, logo depois das declarações de variáveis que fizemos para os inimigos vamos declarar mais algumas. A primeira variável que iremos declarar é um inteiro chamado score para computar os pontos que o jogador fizer, logo após iremos declarar uma variável do tipo SpriteFont chamada font que será a representação da nossa fonte e por último um vetor da posição da tela onde nosso placar será desenhado.

Dentro da função LoadContent() iremos carregar com a variável font nossa fonte ao Content Pipeline como fizemos com todas as outras imagens do nosso jogo.

Antes de desenhar nosso placar na tela, vamos verificar como estamos computando as baixas das aeronaves inimigas.

Atualizando a Pontuação a Cada Colisão

No método UpdateCannonBalls() temos um trecho de código que identifica as colisões dos mísseis com as aeronaves inimigas. Dentro da condição que checa essa colisão vamos incrementar a nossa variável score para que ela registre o número de inimigos que derrubamos.


Desenhando o Placar na Tela

Vamos ao método Draw(). Após o trecho de código onde desenhamos nossos inimigos, iremos utilizar o spriteBatch mais uma vez para desenharmos nosso placar. Mas dessa vez utilizaremos sua função DrawString().

Se não nos esquecemos de nenhum detalhe podemos rodar o jogo e teremos nosso placar no canto esquero superior da tela e a cada aeronave que destruimos ele será atualizado.

Resumo

Nesta sexta parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio vimos como adicionar um placar para a contagem de inimigos que acertamos durante o jogo.

Na sétima e última parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio veremos como animar um pouco mais as cenas inserindo explosões realistas a cada colisão.

quarta-feira, 29 de abril de 2009

Tutorial - Nosso Primeiro Jogo 2D - Parte 5

Finalmente, depois de muita espera, o tutorial do nosso primeiro jogo 2D está de volta. Tive alguns problemas com meu PC, que infelizmente "pifou" e não pude continuar postando. Como ainda não estão nos meus planos consertar meu PC, tive que tomar uma atitude quanto a continuidade dos nossos tutoriais... Instalar o Visual C# e o XNA aqui no PC do trabalho! Isso implica em ficar horas a mais "trabalhando"... rs

Neste tutorial veremos, passo a passo, como criar um jogo 2D simples. Este tutorial foi baseado nos vídeos Beginner's Guide 2D encontrados no site creators.xna.com.

Esta é a quinta parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio. Aqui veremos como calcular a colisão dos mísseis com as aeronaves inimigas e destrui-las. Também veremos como criar e atualizar nossa pontuação.

Detectando a Colisão entre os Mísseis e as Aeronaves

Atualmente no nosso jogo, quando um míssil cruza com uma aeronave inimiga nada acontece, cada um desses objetos continua seu trajeto como se nada tivesse acontecido. Não é esse efeito que desejamos durante o jogo. Gostariamos que quando o míssil encontrasse a aeronave inimiga, ambos desaparecessem indicando a colisão. Para isso, vamos ao método UpdateCannonMissiles(). Nele verificamos, para cada míssil, se o mesmo ainda está "vivo". Se estiver, apenas o "matamos" caso esteja fora da tela, que é a checagem mais básica que podemos fazer. Para checarmos se o míssil encontra a aeronave inimiga faremos uma checagem um pouco parecida. Assim, logo depois do final do escopo da checagem do caso do míssil ainda estar dentro da tela, criaremos um retângulo que é do tamanho da textura do nosso míssil, e que a cada loop do nosso jogo estará iniciado de acordo com a posição do míssil.

Agora teremos que criar outro retângulo, que compararemos com esse, para saber se eles colidem ou não. Criaremos retângulos ao redor das aeronaves inimigas, que são os objetos com os quais desejamos identificar colisões. Ainda dentro do método UpdateCannonMissiles(), logo em seguida do trecho que acabamos de escrever, faremos um loop em que, para cada aeronave inimiga, criaremos um retângulo. Testaremos também se há interseção entre esses dois retângulos e, se houver, "mataremos" tanto o míssil quanto a aeronave.


Para conseguirmo visualizar melhor as colisões, vamos alterar o valor das variáveis MaxCannonMissiles e MaxEnemyPlanes para 3. Esse modo de verificar colisões através de retângulos é o jeito mais simples de verificarmos colisões mas não é muito bom, pois a forma de nossos objetos não são retangulares o que causa algumas detecções mesmo sem haverem colisões. Se não nos esquecemos de nenhum detalhe podemos rodar nosso jogo e teremos os mísseis colidindo com as aeronaves.


Resumo

Nesta quinta parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio vimos como detectar as colisões dos mísseis de nosso Belonave com as aeronaves dos inimigos.

Deixarei para uma sexta parte do nosso tutorial como manter e atualizar a pontuação do nosso jogo e nesse finalzinho me focarei em algumas alterações que devemos fazer para melhorar a experiencia do jogo, principalmente com relação a esse recém introduzido sistema de colisões.

Alterações

Como pudemos perceber, nosso sistema de colisões está muito falho. Muito desse problema se deve ao seguinte fato: Utilizamos uma imagem grande para as aeronaves e a reduzimos no momento em que a desenhamos. Com isso, ao gerarmos o retangulo com as dimensões da aeronave, o fazemos baseado nas dimensões da imagem grande, o que causa grande erro nas nossas detecções de colisão. A alternativa mais simples que temos para esse caso é diminuir a imagem das aeronaves inimigas que adicionamos ao projeto com o nome de EnemyOne.png.


Ao baixarmos a imagem acima, temos que adiciona-la no projeto substituindo a que estavamos usando. Primeiramente podemos excluir do projeto a imagem da aeronave que já estamos usando. Faremos isso clicando com o botão direito do mouse em cima da imagem que está em Content->Sprites no Solution Explorer.


Agora podemos clicar com o botão direito na pasta Sprites e selecionar Add->Existing Item..., onde procuraremos e adicionaremos a nova imagem reduzida da aeronave.


Também teremos que fazer uma alteração no código do nosso jogo 2D. Onde desenhavamos a aeronave como sendo 65% da imagem original, podemos desenha-la sendo 100% da nova imagem redimensionada. Assim passaremos para a função Draw do spriteBatch 1.0f que é a escala que desejamos desenhar nossa aeronave.


Com essas alterações, se não nos esquecemos de nenhum detalhe podemos rodar nosso jogo e teremos as imagens no tamanho que estavam antes, mas a detecção de colisões teve uma notável melhora, pois agora estamos desenhando retângulos do tamanho das imagens que estamos desenhando.

Finalização

Na sexta parte do nosso tutorial de como criar um jogo 2D com o XNA Game Studio iremos descobrir como mantemos e atualizamos o controle da pontuação do nosso jogo.