This article has been localized into Italian by the community.
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!
Controllare the Snake
A questo punto della nostra serie di articoli su SnakeWPF, ora abbiamo uno sfondo piacevole e un serpente in movimento. Sfortunatamente, il serpente si muove solo in una direzione fino a quando lascia l'area. Ovviamente dobbiamo aggiungere del codice in modo da poter controllare il serpente con la tastiera.
La maggior parte dei controlli WPF ha eventi per ricevere input dal mouse e dalla tastiera. Quindi, a seconda di dove vuoi controllare l'input, puoi iscriverti a questi eventi per uno o più controlli e quindi eseguire la magia lì. Tuttavia, dal momento che questo è un gioco, vogliamo catturare l'input da tastiera indipendentemente da dove possa essere il focus, quindi ci iscriveremo semplicemente all'evento direttamente sulla finestra.
Per quello che vogliamo realizzare, l'evento KeyUp va benissimo. Quindi, nel file XAML modifica il tag Window in modo che includa l'evento KeyUp in questo modo:
<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">
Nel tuo Code-behind, aggiungi il gestore di eventi Window_KeyUp , in questo modo:
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();
}
La prima cosa che facciamo è salvare un riferimento alla direzione corrente in cui sta andando il serpente - ne abbiamo bisogno per assicurarci che il giocatore non stia cercando di fare qualcosa di non consentito, come tornare indietro sul corpo del serpente. In altre parole, se il serpente si muove verticalmente e il giocatore vuole cambiare direzione, deve prima andare in orizzontale.
Nell'istruzione switch , controlliamo quale tasto è stato premuto. Se è stato premuto uno dei tasti freccia (Up, Down, Left, Right) è possibile cambiare la direzione del serpente, a meno che il cambiamento non sia fisicamente impossibile, come descritto sopra. Nota anche che ho aggiunto il tasto Space : chiamerà il metodo StartNewGame (), per consentire al giocatore di scegliere quando iniziare il gioco, anziché avviarlo automaticamente. Permetterà inoltre al giocatore di iniziare una nuova partita al termine della partita precedente.
Alla fine del metodo, controlliamo se la direzione è cambiata rispetto alla direzione originale - in caso affermativo, chiamiamo il metodo MoveSnake() , in modo che la modifica si rifletta immediatamente.
In precedenza avevamo aggiunto una chiamata al metodo StartNewGame () nell'evento Window_ContentRendered : ora puoi rimuoverlo e invece avviare il gioco premendo il tasto Spazio. Ora ecco, il serpente può essere controllato - ora è quasi un gioco reale e non solo un serpente animato!
Sommario
In questo articolo, abbiamo aggiunto alcune funzionalità piuttosto importanti alla nostra implementazione di SnakeWPF: il controllo del serpente! Tuttavia, se provi a giocarci, noterai che abbiamo ancora bisogno di un aspetto molto importante, perché il serpente sta attualmente scomparendo dai confini del muro e si rifiuta di mangiare il cibo anche quando lo colpisci. In altre parole, dobbiamo aggiungere un rilevamento delle collisioni ! Maggiori informazioni su questo nel prossimo articolo.