TOC

This article is currently in the process of being translated into Portuguese (~99% done).

Criando um jogo: SnakeWPF:
Chapter introduction:

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!

Continuous movement with DispatcherTimer

Em artigos anteriores, criamos uma bonita área de jogo para nossa Cobra e depois adicionamos código para realizar a real criação e movimento da cobra. No entanto, como já mencionado, o código para movimento não é algo que deva ser chamado apenas uma vez - na verdade, deve ser chamado constantemente, para manter a cobra em movimento enquanto o jogo estiver rodando. Em outras palavras, precisaremos de um Timer (temporizador).

Geralmente falando, em programação, um Timer é normalmente um mecanismo que permitirá a repetição de uma tarefa uma e outra vez, com base em um intervalo. Em outras palavras, cada vez que o timer "clica", uma pedaço de código é executado e o temporizador clica com base no intervalo definido. Isto é exatamente o que precisamos para manter nossa cobra em movimento, então adicionaremos um DispatcherTimer a nossa Window:

public partial class SnakeWPFSample : Window        
{        
    private System.Windows.Threading.DispatcherTimer gameTickTimer = new System.Windows.Threading.DispatcherTimer();  
    ....

Com isso no lugar, agora precisamos nos registrar para o seu único evento: o evento Tick. Faremos isso no construtor da Window:

public SnakeWPFSample()  
{  
    InitializeComponent();  
    gameTickTimer.Tick += GameTickTimer_Tick;      
}

E aqui está a implementação do evento:

private void GameTickTimer_Tick(object sender, EventArgs e)  
{  
    MoveSnake();  
}

Ou seja, cada vez que o temporizador clica, o evento Tick é chamado, que por sua vez chama o método MoveSnake() que implementamos anteriormente. Para finalmente ver o resultado de nosso árduo trabalho e poder visualizar uma cobra em movimento, basicamente temos apenas que criar as partes iniciais da cobra e depois iniciar o temporizador. Criaremos um método chamado StartNewGame(), que usaremos para iniciar tanto o primeiro jogo bem como qualquer número de novos jogos quando o jogador morre. Começaremos com uma versão bem básica e depois o expandirei com mais funcionalidades na medida que avancemos - por agora, vamos apenas colocar esta cobra em movimento!

O primeiro passo é adicionar um outro conjunto de constantes, que usaremos para iniciar um novo jogo:

public partial class SnakeWPFSample : Window  
{  
    const int SnakeSquareSize = 20;  
    const int SnakeStartLength = 3;  
    const int SnakeStartSpeed = 400;  
    const int SnakeSpeedThreshold = 100;  
    ......

Apenas as primeiras três constantes são usadas neste momento, para controlar o tamanho, comprimento e a velocidade inicial da Cobra. Usaremos SnakeSpeedThreshold mais tarde, mas por enquanto, vamos adicionar uma implementação simples do método StartNewGame() tal como prometido:

private void StartNewGame()  
{  
    snakeLength = SnakeStartLength;  
    snakeDirection = SnakeDirection.Right;  
    snakeParts.Add(new SnakePart() { Position = new Point(SnakeSquareSize * 5, SnakeSquareSize * 5) });  
    gameTickTimer.Interval = TimeSpan.FromMilliseconds(SnakeStartSpeed);  

    // Draw the snake  
    DrawSnake();  

    // Go!      
    gameTickTimer.IsEnabled = true;  
}

Começamos ajustando snakeLength e snakeDirection com base nos valores iniciais. Depois adicionamos uma única parte à lista snakeParts List (mais sobre isto depois), e dando-lhe uma boa posição inicial para movimento para a direita - de novo usaremos a constante SnakeSquareSize para ajudar a calcular a posição adequada. Com isso feito, podemos desenhar a cobra chamando o método DrawSnake() e depois habilitando o temporizador, que basicamente iniciará o movimento da cobra.

Finalmente estamos no ponto onde quase podemos sentar e apreciar a primeiríssima versão de algo que se parece com um jogo - na verdade, tudo que precisamos fazer agora é chamar o método StartNewGame(). Claro que isto deve ser feito quando o usuário estiver pronto, mas por agora, para verificar que tudo funciona, o faremos simplesmente tão logo todo o resto estiver inicializado - de novo confiaremos no evento ContentRendered da Window, que adicionamos em um dos primeiros artigos. Basta adicionar uma chamada ao nosso método StartNewGame() e finalmente estamos prontos para compilar e rodar:

private void Window_ContentRendered(object sender, EventArgs e)  
{  
    DrawGameArea();  
    StartNewGame();  
}

Se fez tudo como descrito, agora você deve poder iniciar o jogo e ver a cobra sendo criada e imediatamente começar a mover-se:

Note como a cobra aparece do nada, como um único quadrado, e depois cresce para o comprimento de três quadrados. Isso acontece porque adicionamos apenas uma parte à lista snakeParts, mas cada vez que o método MoveSnake() é chamado pelo temporizador, uma nova parte é adicionada (para fazê-la crescer), enquanto removemos partes do rabo somente quando o comprimento atual está para exceder o comprimento desejado da cobra, que começa em 3 (determinado pela constante SnakeStartLength).

Resumo

Agora temos uma cobra em movimento, o que é sensacional! Mas como você pode ver na animação acima, ainda existem coisas a serem feitas - não há alimento para a cobra comer, e quando a cobra bate na parede, nada acontece. Trabalharemos nesses aspectos nos próximos artigos.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!