Desenvolvendo em XNA

GameDev #14: Adicione alguns efeitos sonoros e um placar de pontuação e seu primeiro jogo está pronto

Os últimos artigos da coluna GameDev instruíram você a desenvolver um projeto simples de jogo para aplicar todos os conhecimentos adquiri... (por Sergio Oliveira em 29/04/2013, via Xbox Blast)

Os últimos artigos da coluna GameDev instruíram você a desenvolver um projeto simples de jogo para aplicar todos os conhecimentos adquiridos nos primeiros artigos. O projeto de jogo, chamado “Asteroides”, consiste em uma nave intergaláctica que se encontra em meio a uma chuva de asteroides. Para passar por essa chuva, ela deve desviar de todos eles, algo semelhante a Space Invaders.
Nunca é demais lembrar que para executar o que é desenvolvido nesta coluna, é necessária a instalação do Microsoft Visual C# 2010 Express e do XNA Game Studio, ambos gratuitos.

A última versão do projeto “Asteroides” também está disponível. Acesse http://sdrv.ms/ZrGfm0 para realizar o download do código-fonte.
Até aqui, o projeto já se encontra jogável. É possível controlar a nave por toda a tela e, à medida que o tempo vai passando, novos asteroides vão surgindo. Inclusive foi isso que fizemos no último artigo. No entanto, o jogo ainda não apresenta duas coisas essenciais aos jogos de hoje (até mesmo para um tão simples quanto “Asteroides”): áudio e placar.

Adicionando sons e efeitos sonoros ao projeto

Você já sabe como é fácil e simples adicionar sons e efeitos sonoros a um jogo feito com XNA. “Asteroides” utilizará apenas dois arquivos WAV para os efeitos sonoros e um arquivo MP3 para a música de fundo do jogo.

Essa é a realidade do seu jogo por enquanto - GameDev Xbox Blast

Os arquivos a seguir podem ser encontrados fazendo o download da pasta “Conteudo_Asteroides.rar” em http://sdrv.ms/107q1kv:
  • Explosion.wav é um som de explosão que será tocado quando o jogador colidir com um asteroide;
  • Newmeteor.wav tocará quando um novo asteroide for adicionado à tela do jogo; 
  • Backmusic.mp3 é a música de fundo do jogo.
Antes de qualquer coisa, declare os objetos de som na classe Game1 do projeto:

//Objetos de som
private SoundEffect explosao;
private SoundEffect novoAsteroide;
private Song musicaFundo;

E antes de inicializar os objetos, adicione os arquivos de sons no content pipeline do projeto. Isso é feito clicando com o botão direito na pasta Content na Solution Explorer e selecionando a opção Add Existing Item. Procure pelo local onde você descompactou os arquivos e adicione-os:

Adicione os sons que farão parte do seu jogo - GameDev Xbox Blast

Escolha os arquivos de audio e adicione-os - GameDev Xbox Blast

Com os arquivos devidamente adicionados ao projeto, inicialize os objetos criados no primeiro passo. Para isso, adicione o seguinte bloco de código no método LoadContent():

//Inicializa os elementos de audio
explosao = Content.Load<SoundEffect>("explosion");
novoAsteroide = Content.Load<SoundEffect>("newmeteor");
musicaFundo = Content.Load<Song>("backmusic");

Para fazer que a música de fundo do jogo tenha início, adicione a seguinte linha de código logo após a inicialização dos objetos em LoadContent():

//Inicia o som de fundo
MediaPlayer.Play(musicaFundo);

No método DoLogicaJogo, adicione o seguinte bloco de código dentro da verificação condicional que diz se houve colisão ou não, assim o som de explosão será tocado quando houver uma:

//Se houver colisão, então o som de explosão é tocado
explosao.Play();

Finalmente, no método ChecarNovoAsteroide, adicione o bloco de código a seguir logo após a linha que contém asteroideCount++:

novoAsteroide.Play();

Isso fará com que o som de um novo asteroide da tela seja tocado quando um novo aparecer. Agora, rode o jogo apertando F5 e veja que, sem dificuldades, adicionamos sons ao nosso jogo e agora ele até parece mais emocionante.

Isso foi fácil e intuitivo demais, concordam?

Não deixe o jogador às cegas, adicione um placar ao jogo

Apesar do jogo já possuir sons e uma boa música tocando ao fundo enquanto sua nova desvia freneticamente dos asteroides, ele ainda não possui um placar que marque a pontuação do jogador. Para os fins didáticos propostos pelo projeto, este placar será simples e só  mostrará a quantidade atual de asteroides que estão na tela.

Para tal atividade, utilizaremos o objeto SpriteFont que nos permite escrever e desenhar na tela do jogo. Declare o objeto na classe Game1 logo após a declaração dos objetos dos sons:

//Declaração do spritefont para o placar
private SpriteFont gameFonte; 

No método LoadContent, inicialize o objeto criado após a inicialização dos sons do jogo.

//Inicializa a fonte do jogo
gameFonte = Content.Load<SpriteFont>("font");

Perceba que não existe nenhum arquivo font na pasta Content do projeto. Isso é porque as fontes num projeto XNA são tratadas como um GameComponent e é preciso adicioná-las clicando com o direito na pasta Content, e selecionando Add New Item. Na janela que abrir, selecione Sprite Font:

Adicione um novo GameComponent ao projeto para poder escrever em tela - GameDev Xbox Blast

Assim que criar o arquivo, o XNA o abre para edição. Nesse arquivo você poderá explicitar qual a família da fonte que deseja utilizar, seu tamanho e outras propriedades numa linguagem de marcação semelhante ao XML. Fique à vontade para explorá-lo e alterar o que achar interessante.

O placar é um típico GameComponent, mas para mostrar que você não precisa criar um componente para ele, vamos desenhá-lo diretamente do método Draw. Você pode adicioná-lo imediatamente depois de desenhar os sprites do jogo com o seguinte código:

//Desenha o placar
spriteBatch.Begin();
spriteBatch.DrawString(gameFonte, "Asteroides: " + asteroideCount.ToString(),
                new Vector2(15, 15), Color.GreenYellow);
spriteBatch.End();

Perceba que foram utilizados objetos spriteBatch separados para desenhar o placar. Dessa forma nós “modularizamos” o desenho do jogo em plano de fundo, sprites e placar. Essa é uma técnica utilizada para que a placa de vídeo possa tratá-los como processos independentes e separados a fim de evitar alguma confusão na renderização dos objetos quando o projeto ficar maior e mais robusto.

Agora execute o jogo e perceba que ele possui um placar e, finalmente, está completo!

Aqui está o seu primeiro jogo 2D completo - GameDev Xbox Blast

Ao longo da coluna GameDev, ensinamos o básico da criação de jogos 2D utilizando o XNA. Um pequeno jogo foi planejado e focamos nos itens que programadores e designers de jogos deveriam ter em mente antes de começar a escrever qualquer linha de código para tornar um jogo realidade. 

Também aprendemos como utilizar os componentes de jogo do XNA e a criar uma lógica, modificando e testando o estado desses componentes dentro do loop do jogo. Aprendemos que podemos implementar sprites simples utilizando os objetos GameComponent e tirar vantagem de todas as classes que o XNA oferece (aliás, já parou para ver quantas delas utilizamos nesse pequeno projeto?). 

Por fim, vimos como é fácil trabalhar com sons no XNA. Não precisamos de nenhuma ferramenta adicional para manipular e/ou compilar o áudio – tudo foi feito em tempo de execução pelo XNA Framework. Nossa única preocupação foi achar uma boa música de fundo e bons efeitos sonoros. Demais, não acham?

Desafio GameDev

O término desse 14º artigo da GameDev marca o fim de um ciclo de desenvolvimento proposto pela coluna. Não se espante, você terminou sim de criar o seu primeiro jogo! Foi rápido, não foi? Agora que você está familiarizado com os componentes essenciais ao desenvolvimento de um jogo 2D, temos um desafio para propor para você.

A nossa pobre nave intergaláctica apenas desvia dos asteroides. Como uma nave desbravadora de galáxias, essa nave deveria ter um canhão que dispare tiros de laser. Que tal tentar desenvolver essa nova funcionalidade para o jogo? Ao atingir um asteroide, este seria destruído e um som de destruição seria tocado. Se você conseguir desenvolver essa nova função, não será difícil alterar o tipo de placar do jogo. Ao invés de contar a quantidade de asteroides na tela, planeje um placar que dê uma pontuação baseada na quantidade de asteroides destruídos pela nave.

A coluna entrará num breve recesso a partir de hoje. Afinal de contas, quem desenvolve jogos também precisa de um tempo para jogar, certo? Daremos tempo suficiente para você trabalhar no desafio e quando retornarmos, aprenderemos a como desenvolver jogos para dispositivos móveis com Windows Phone!


Até lá, caso tenham alguma dúvida, envie-nos um e-mail para sergioliveira@nintendoblast.com.br. E não deixe de dar uma espiada no projeto completo em http://sdrv.ms/Yc4tlt.

Revisão: Leandro Freire e Jaime Ninice
Capa: Douglas Fernandes
Sergio Oliveira escreve para o Xbox Blast sob a licença Creative Commons BY-SA 3.0. Você pode usar e compartilhar este conteúdo desde que credite o autor e veículo original do mesmo.

Comentários

Google+
Disqus
Facebook