This article is currently in the process of being translated into French (~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
À ce stade de notre série d'articles sur SnakeWPF, nous avons maintenant un joli arrière-plan et un serpent en mouvement. Malheureusement, le serpent se contente de se déplacer dans une seule direction jusqu'à ce qu'il quitte la zone. Nous devons évidemment ajouter du code afin de pouvoir contrôler le serpent avec le clavier.
La plupart des contrôles WPF comportent des événements permettant de recevoir des entrées à la souris et au clavier. Ainsi, en fonction de l'endroit où vous souhaitez vérifier les données, vous pouvez vous inscrire à ces événements pour un ou plusieurs contrôles et y effectuer les traitements correspondants. Cependant, comme il s'agit d'un jeu, nous voulons capter les entrées du clavier quel que soit l'endroit où se trouve le centre d'intérêt, donc nous allons simplement nous inscrire à l'événement directement sur la fenêtre.
Pour réaliser cette tâche, l'événement KeyUp correspond parfaitement. Donc, dans le fichier XAML correspondant à la fenêtre, modifiez la balise Window de façon à ce qu'elle inclue l'événement KeyUp comme ceci :
<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">
Dans votre le code associé (Code-behind), ajoutez le handler pour l'événement Window_KeyUp comme ceci :
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 première chose à faire est de sauvegarder une référence de la direction actuelle du serpent : nous devons le faire pour être sûr que le joueur n'est pas en train de faire quelque chose que nous ne voulons pas autoriser, comme faire demi-tour sur lui-même (par ex : par la gauche ou la droite). en d'autres termes, si le serpent se déplace verticalement et que le joueur veut changer de direction, il doit se déplacer horizontalement d'abord : vous ne pouvez pas vous déplacer vers le haut puis vers le bas directement, ni de la gauche vers la droite.
Ensuite, il y a une instruction switch, dans laquelle nous vérifions quelle touche a été enfoncée. Nous vérifions si une des touches fléchées (Haut, Bas, Gauche, Droite) a été enfoncée : si c'est le cas, elles permettent de changer la direction du serpent, à moins que le changement ne soit physiquement impossible, comme décrit ci-dessus. Notez également qu'une vérification pour la touche Espace a été ajoutée : elle appellera la méthode StartNewGame(), qui permet au joueur de lancer le jeu, au lieu de le démarrer automatiquement. Cela permettra également au joueur de commencer une nouvelle partie quand la précédente est terminée.
A la fin de la méthode, on vérifie si la direction a changer par rapport à la direction d'origine : si c'est le cas, on appelle la méthode MoveSnake(), qui affiche le changement immédiatement.
Précédemment, nous avions ajouté un appel à la méthode StartNewGame() dans l'évènement Window_ContentRendered : on peut maintenant l'enlever car on peut lancer le jeu en appuyant sur la touche Espace. Le serpent est maintenant entièrement contrôlé, nous sommes plus proche d'un jeu actuel que d'un serpent animé!
Résumé
Dans cet article, nous avons ajouté quelques fonctionnalités importantes à notre implémentation de SnakeWPF : le contrôle du serpent! Pourtant, si vous essayer de jouer, vous noterez qu'il manque un point crucial, car le serpent disparait quand il rentre en collision avec les murs et qu'il refuse de "manger" la nourriture, même si il rentre dedans. En d'autres termes, nous devons ajouter une gestion des Détection de collisions! La suite dans le prochain article.