TOC

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

Creando un juego: 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

En los artículos anteriores, creamos un área de juego agradable para nuestra Serpiente y luego agregamos código para realizar la creación y el movimiento reales de la serpiente. Sin embargo, como ya se mencionó, el código para el movimiento no es algo que deba llamarse solo una vez, sino que debe llamarse una y otra vez para mantener a la serpiente en movimiento mientras el juego se está ejecutando. En otras palabras, necesitaremos un temporizador.

En términos generales, en la programación, un temporizador suele ser un mecanismo que permitirá que una tarea se repita una y otra vez, en función de un intervalo. En otras palabras, cada vez que el temporizador "marca", se ejecuta un fragmento de código y el temporizador marca en función del intervalo definido. Esto es exactamente lo que necesitamos para mantener nuestra serpiente en movimiento, por lo que agregaremos un DispatcherTimer a nuestra ventana:

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

Con eso en su lugar, ahora debemos suscribirnos a su único evento: el evento Tick . Lo haremos en el constructor de la ventana:

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

Y aquí está la implementación del evento:

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

Entonces, cada vez que el temporizador funciona, se llama al evento Tick, que a cambio llama al método MoveSnake () que implementamos anteriormente. Para finalmente ver el resultado de todo nuestro trabajo duro y tener una serpiente visual y en movimiento, básicamente solo tenemos que crear las partes iniciales de la serpiente y luego iniciar el temporizador. Crearemos un método llamado StartNewGame () , que usaremos para comenzar tanto el primer juego como cualquier cantidad de juegos nuevos adicionales cuando el jugador muera. Sin embargo, comenzaremos con una versión muy básica, y luego la expandiré con más funcionalidades a medida que avanzamos, por ahora, ¡hagamos que esta serpiente se mueva!

El primer paso es agregar otro conjunto de constantes, que usaremos para comenzar el nuevo juego:

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

En este punto, solo se utilizan las tres primeras constantes para controlar el tamaño, la longitud y la velocidad de inicio de la serpiente. Usaremos el SnakeSpeedThreshold más tarde, pero por ahora, agreguemos una implementación simple del método StartNewGame () como se prometió:

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;  
}

Comenzamos configurando snakeLength y snakeDirection en función de los valores iniciales. Luego agregamos una sola parte a la lista snakeParts (más sobre eso más adelante), dándole una buena posición de inicio para moverse hacia la derecha: una vez más usaremos la constante SnakeSquareSize para ayudar a calcular la posición correcta. Con eso en su lugar, podemos dibujar la serpiente llamando al método DrawSnake () y luego habilitar el temporizador, que básicamente iniciará el movimiento de la serpiente.

Ahora estamos finalmente en el punto en el que casi podemos sentarnos y disfrutar de la primera versión de algo que realmente parece un juego; de hecho, todo lo que tenemos que hacer ahora es llamar al método StartNewGame (). Esto, por supuesto, debe hacerse cuando el usuario esté listo, pero por ahora, para comprobar que todo funciona, simplemente lo haremos tan pronto como se inicialice todo lo demás; una vez más, confiaremos en el eventoContentRendered de la Ventana, que agregamos en uno de los primeros artículos. Simplemente agregue una llamada a nuestro método StartNewGame () y finalmente estamos listos para compilar y ejecutar:

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

Si hiciste todo como se describe, ahora deberías poder iniciar el juego y ver cómo se crea la serpiente e inmediatamente comenzar a moverse:

Observe cómo la serpiente aparece de la nada, como un solo cuadrado, y luego crece hasta una longitud de tres cuadrados. Eso sucede porque solo agregamos una parte a la lista snakeParts , pero cada vez que el temporizador llama al método MoveSnake () , se agrega una nueva parte (para que sea crecer), mientras solo se eliminan las partes de la cola si la longitud actual está a punto de exceder la longitud deseada de la serpiente, que comienza en 3 (decidido por la constante SnakeStartLength ).

Resumen

¡Ahora tenemos una serpiente en movimiento, que es realmente increíble! Pero como puede ver en la imagen animada de arriba, todavía hay cosas por hacer: la serpiente no puede comer, y cuando la serpiente golpea la pared, no pasa nada. Trabajaremos en estos aspectos en los próximos artículos.


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!