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.
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.
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.
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?).
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
Comentários