This article is currently in the process of being translated into Spanish (~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
En este punto de nuestra serie de artículos sobre la serpiente en WPF (SnakeWPF), ahora tenemos un fondo atractivo y una serpiente en movimiento. Desafortunadamente, la serpiente solo se mueve en una dirección hasta que abandona el área. Obviamente, necesitamos agregar algo de código para poder controlar la serpiente con el teclado.
La mayoría de los controles WPF tienen eventos para recibir entradas del ratón y el teclado. Entonces, dependiendo de dónde desee verificar la entrada, puede suscribirse a estos eventos para uno o varios controles y luego realizar la magia allí. Sin embargo, dado que este es un juego, queremos capturar la entrada del teclado sin importar dónde esté el foco, por lo que simplemente nos suscribiremos al evento directamente en la Ventana.
Para lo que queremos lograr, el evento KeyUp es una gran combinación. Por lo tanto, busque su archivo XAML para la ventana y modifique la etiqueta de la ventana para que incluya el evento KeyUp como este:
<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">
En su Código subyacente, agregue el controlador de eventos Window_KeyUp , de esta manera:
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();
}
Lo primero que hacemos es guardar una referencia a la dirección actual en la que se dirige la serpiente; necesitamos esto para asegurarnos de que el jugador no esté tratando de hacer algo que no permitiremos, como retroceder sobre el cuerpo de la serpiente ( por ejemplo, de derecha a izquierda). En otras palabras, si la serpiente se mueve verticalmente y el jugador quiere cambiar la dirección, primero tiene que ir horizontalmente: no puede ir directamente de arriba a abajo o de izquierda a derecha.
Lo siguiente es una declaración de cambio , donde verificamos qué tecla se presionó. Aquí verificamos si se presionó una de las teclas de flecha ( Arriba , Abajo , Izquierda , Derecha ) si entonces, se les permite cambiar la dirección de la serpiente, a menos que el cambio sea físicamente imposible, como se describió anteriormente. Observe también que he agregado una marca para la tecla Espacio : llamará al método StartNewGame (), para permitir que el jugador elija cuándo se inicia el juego, en lugar de simplemente comenzar
Al final del método, verificamos si la dirección ha cambiado en comparación con la dirección original; si lo ha hecho, llamamos al método MoveSnake () , para que el cambio se refleje de inmediato.
Anteriormente agregamos una llamada al método StartNewGame () en el evento Window_ContentRendered : ahora puede eliminarlo y comenzar el juego presionando la tecla Espacio. Ahora, he aquí, la serpiente se puede controlar: ¡ahora está cerca de ser un juego real y no solo una serpiente animada!
Resumen
En este artículo, agregamos algunas funcionalidades bastante importantes a nuestra implementación SnakeWPF: ¡Control de la serpiente! Sin embargo, si intentas jugarlo, notarás que todavía necesitamos un aspecto muy importante, porque la serpiente actualmente está desapareciendo de los límites de la pared y se niega a comer la comida incluso cuando la golpeas. En otras palabras, ¡necesitamos agregar algo de detección de colisión ! Más sobre eso en el próximo artículo.