Desenvolvendo em XNA

GameDev #10: Capturando as ações do usuário

No último artigo da coluna GameDev , você ficou por dentro de como funcionam e se comportam os sistemas de colisão, e, de quebra, ainda pô... (por Sergio Oliveira em 25/03/2013, via Xbox Blast)

GameDev #10: Capturando as ações do usuário
No último artigo da coluna GameDev, você ficou por dentro de como funcionam e se comportam os sistemas de colisão, e, de quebra, ainda pôde implementar o seu próprio utilizando a ideia do método bounding boxes. O projeto está crescendo à medida que você acrescenta novas funcionalidades e já faz um tempo que ele deixou de ser apenas uma tela azul. Hoje você aprenderá mais uma coisa: a como capturar as ações executadas pelo usuário. Vamos lá?!

Não esqueça de preparar seu ambiente de desenvolvimento

Se você não acompanhou o último artigo e não tiver a última versão do projeto que está sendo desenvolvido, poderá fazer o download dele acessando o endereço: http://sdrv.ms/103ONfV.

Lembrando que, para desenvolver o que é proposto na coluna, é necessário ter instalado em sua máquina o Microsoft Visual C# 2010 Express e o XNA Game Studio, ambos gratuitos.

Microsoft Visual C# 2010 Express

XNA Game Studio 4.0
Caso esteja utilizando o Windows 8, talvez você tenha algum problema ao instalar o XNA Game Studio. Esse erro ocorre porque o Game Studio traz consigo uma versão do Games for Windows – LIVE nos bastidores. O problema é que há incompatibilidade entre o Games for Windows – LIVE que o XNA está tentando instalar e o Windows 8, mas isso pode ser corrigido baixando e instalando manualmente a versão mais recente no seguinte link: http://bit.ly/W96StP.

Ao finalizar a atualização, basta tentar instalar o XNA Game Studio novamente e deverá funcionar.

Maneiras de capturar as ações

Se você pensa que capturar ações do usuário no teclado, mouse e até mesmo no controle do Xbox 360 é difícil, vai se decepcionar. Para os três, o XNA oferece classes bem elaboradas que te pouparão da árdua tarefa de comunicação com esses dispositivos.

Prometemos que você não precisará quebrar nada para capturar as ações do controle

Talvez a mais elaborada delas seja a GamePad, responsável por intermediar a comunicação com o controle do Xbox 360. Um exemplo simples e fácil de entender está no próprio projeto. Dentro do método Update da classe Game1 existe um pedaço de código muito peculiar.


Basta entender minimamente inglês para perceber o que ele faz.

O jogo captura o estado do primeiro controle [GamePad.GetState(PlayerIndex.One)] e verifica se o botão Back está pressionado (Buttons.Back == ButtonState.Pressed). Confirmada essa ação, ele sairá. Simples, não é mesmo?

Trabalhar com a classe GamePad é fácil e sua utilização é bem documentada pelo próprio IntelliSense do Visual C# 2010 Express. Faça um teste: digite na sua aplicação o código GamePad.GetState(PlayerIndex.One). e saia navegando pela estrutura da classe.

Perceba que é possível trabalhar com os botões do controle pela estrutura Buttons, as alavancas analógicas com a ThumbSticks e o direcional através da DPad. Você ainda pode verificar se um controle está devidamente conectado através do método IsConnected ou então fazê-lo vibrar com o GamePad.SetVibration.

Apesar de ser muito simples usar a classe GamePad, o foco deste artigo é fazer com que o usuário seja capaz de controlar uma das bolinhas com o teclado e o mouse.

Utilizando o teclado e o mouse para controlar o sprite

Assim como a GamePad intermedeia a comunicação com o controle, as classes KeyBoardState e Mouse auxiliam o trabalho com o teclado e o mouse no projeto.

A KeyBoardState oferece dois métodos de verificação de estado do teclado – IsKeyDown, para checar se a tecla está pressionada, e IsKeyUp, para ver se ela  foi solta. A partir disso, será possível acessar qualquer tecla sem mistérios nem complicações.

Sendo assim, comece a preparação do projeto para fazer com que seja possível controlar a segunda bolinha do jogo, mantendo todas as características programadas anteriormente. 

Primeiramente, na classe Game1, remova o código que define a velocidade inicial do mySprite2 no método LoadContent() e a chamada para mySprite2.Mover() no Update(). Essas alterações são fundamentais para que a segunda bolinha se mexa sozinha e você não deseja mais isso a partir de agora. 

Também será preciso alterar o código da detecção de colisão no Update(), simplificando-o para apenas inverter a velocidade do mySprite1:


Agora que você preparou o projeto, poderá capturar o estado das teclas pressionadas pelo usuário.

No método Update da classe Game1, instancie um objeto do tipo KeyBoardState:


Perceba que ele já é criado com o estado atual do teclado (Keyboard.GetState). 

A partir do keyBoardState você verificará a situação de cada uma das teclas e assim pode disparar ações no jogo. O exemplo abaixo utiliza as setas direcionais do teclado para fazer a segunda bolinha se mover de acordo com a tecla pressionada:


Para testar, execute o jogo apertando F5 e veja se consegue mexer a bolinha pela tela e se elas colidirão quando a sua estiver no caminho da primeira.

Já é possível controlar a bola pelo teclado! Agora você vai adicionar mais algumas linhas para capturar a movimentação do mouse e traduzi-la em ações dentro do jogo.

Logo após o código acima, digite o seguinte:


A lógica aqui também é simples e não existe mistério sobre como utilizar a classe Mouse. O que acontece é apenas uma comparação da posição atual do mySprite2 nos eixos com a posição atual do mouse. Se esta  for maior ou menor, a bola deve mover até lá de acordo com as comparações.

Caso o projeto seja executado novamente, você perceberá que mexendo o mouse dentro da tela do jogo a bola irá segui-lo exatamente como foi previsto. Veja também que há dois pequenos bugs: uma bola entra na outra se insistirmos em colidir as duas – isso ocorre devido à simplicidade do algoritmo utilizado para detectar colisões; e a segunda bola ultrapassa os limites da tela por não utilizarmos mais o método Mover que os verifica. 


A simplicidade do sistema de detecção de colisão faz com que o sistema de detecção de colisão funcione inapropriadamente. Você já seria capaz de resolvê-lo sozinho?

Como estamos apenas discutindo e desenvolvendo conceitos de programação de jogos em XNA, esses bugs serão abordados novamente posteriormente (mesmo assim, você conseguiria pensar em uma solução para eles?).
Capturar as ações dos jogadores e traduzi-las não é algo difícil no XNA. As classes GamePad, KeyBoardState e Mouse exemplificam muito claramente o porquê de utilizarmos frameworks para desenvolver jogos. Se não fosse o XNA, provavelmente seria necessário recorrer a APIs de desenvolvimento e escrever linhas e mais linhas de código para programar ações simples que aqui foram feitas em menos de dez.

Para fechar esse ciclo de introdução ao XNA e seus conceitos de programação, no próximo artigo você criará conteúdo de áudio e irá incorporá-lo ao projeto. Fique atento e participe. Até lá!

O projeto atualizado com as alterações de hoje pode ser baixado no seguinte endereço: http://sdrv.ms/11vN70a

Revisão: Bruna Lima 
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