This article is currently in the process of being translated into Portuguese (~99% done).
In this article series, we're building a complete Snake game from scratch. It makes sense to start with the Introduction and then work your way through the articles one by one, to get the full understanding.
If you want to get the complete source code for the game at once, to get started modifying and learning from it right now, consider downloading all our samples!
Controlling the Snake
Neste estágio na nossa série de artigos do jogo SnakeWPF, obtivemos uma área de fundo agradável aos olhos e uma cobra que se movimenta. Infelizmente a cobra se movimenta apenas em uma direção até deixar a área. Obviamente precisamos adicionar mais código para que possamos controlar a cobra com o teclado.
A maioria dos controles WPF têm eventos para receber o sinal do mouse e do teclado. Logo, dependendo de onde você queira checar o sinal de entrada, você pode se inscrever nestes eventos para um ou vários controles e então executar a mágica. Entretanto, como isto é um jogo, queremos capturar o sinal do teclado independente de onde o foco esteja. Portanto, iremos simplesmente nos inscrever para o evento diretamente na classe Window.
Para aquilo que desejamos atingir, o evento KeyUp é uma pedida perfeita. Logo, abra o arquivo XAML da classe Window e modifique a etiqueta de Window para que ela inclua o evento KeyUp conforme o código abaixo:
<Window x:Class="WpfTutorialSamples.Games.SnakeWPFSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfTutorialSamples.Games"
mc:Ignorable="d"
Title="SnakeWPF - Score: 0" SizeToContent="WidthAndHeight"
ContentRendered="Window_ContentRendered" KeyUp="Window_KeyUp">
Adicione o gerenciador de evento Window_KeyUp no seu Code-behind conforme o código abaixo:
private void Window_KeyUp(object sender, KeyEventArgs e)
{
SnakeDirection originalSnakeDirection = snakeDirection;
switch(e.Key)
{
case Key.Up:
if(snakeDirection != SnakeDirection.Down)
snakeDirection = SnakeDirection.Up;
break;
case Key.Down:
if(snakeDirection != SnakeDirection.Up)
snakeDirection = SnakeDirection.Down;
break;
case Key.Left:
if(snakeDirection != SnakeDirection.Right)
snakeDirection = SnakeDirection.Left;
break;
case Key.Right:
if(snakeDirection != SnakeDirection.Left)
snakeDirection = SnakeDirection.Right;
break;
case Key.Space:
StartNewGame();
break;
}
if(snakeDirection != originalSnakeDirection)
MoveSnake();
}
A primeira coisa que fazemos é salvar a referência da direção atual para a qual a cobra está se movendo - precisamos disso para garantirmos que o jogador não está tentando algo que não queremos que aconteça como voltar sobre o corpo da cobra (da direita para a esquerda, por exemplo). Em outras palavras, se a cobra está se movimentando verticalmente e o jogador deseja mudar a direção, ele tem que primeiro se mover horizontalmente - você não pode se mover diretamente de cima para baixo ou da esquerda para a direita.
Na sequência temos um comando switch onde checamos qual tecla foi pressionada. Aqui verificamos se uma das setas (Acima, Abaixo, Esquerda, Direita) foi pressionada - se sim, permitimos a mudança de direção da cobra à menos que essa mudança seja fisicamente impossível, conforme descrito acima. Perceba também que adicionei uma verificação para a tecla Espaço: isto irá executar o método StartNewGame() que permitirá ao jogador escolher quando iniciar o jogo ao invés de iniciá-lo automaticamente. Isso também permitirá ao jogador iniciar um novo jogo quando o anterior terminar.
Ao final do método, checamos se a direção mudou em comparação com a original - caso verdadeiro, executamos o método MoveSnake() para que a mudança seja refletida imediatamente.
Anteriormente, adicionamos uma chamada ao método StartNewGame() no evento Window_ContentRendered - agora você pode remover essa chamada e no seu lugar iniciar o jogo pressionando a tecla Espaço. Agora eis que a cobra pode se movimentar - está próximo de ser um jogo de verdade e não apenas uma animação de cobra!
Resumo:
Neste artigo, adicionamos algumas funcionalidades muito importantes à nossa implementação SnakeWPF: Controle da cobra! Entretanto, se tentar jogar, notará que ainda precisamos de um aspecto importante uma vez que a cobra está desaparecendo ao atravessar as bordas do tabuleiro e ela se recusa à comer a comida mesmo quando você à atinge. Em outras palavras, precisamos adicionar alguma detecção de colisão! Mais sobre isso no próximo artigo.