TOC

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

Creare un gioco: 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!

Movimento continuo con DispatcherTimer

Negli articoli precedenti, abbiamo creato un'area di gioco dall'aspetto gradevole per il nostro Snake e quindi abbiamo aggiunto il codice per eseguire la creazione e il movimento del serpente. Tuttavia, come già accennato, il codice per il movimento non è qualcosa che dovrebbe essere chiamato solo una volta - invece, dovrebbe essere chiamato ancora e ancora, per mantenere il serpente in movimento finché il gioco è in esecuzione. In altre parole, avremo bisogno di un timer.

In generale, nella programmazione, un timer è di solito un meccanismo che consente di ripetere un'attività ripetutamente, in base a un intervallo. In altre parole, ogni volta che il timer "scatta", viene eseguito un pezzo di codice e il timer scatta in base all'intervallo definito. Questo è esattamente ciò di cui abbiamo bisogno per far muovere il nostro serpente, quindi aggiungeremo un Timer dispatcher alla nostra finestra:

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

Con questo in atto, ora dobbiamo iscriverci al suo unico e unico evento: l'evento Tick. Lo faremo nel costruttore della finestra:

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

E qui l'implementazione di un evento:

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

Quindi, ogni volta che il timer passa, viene chiamato l'evento Tick, che a sua volta chiama il metodo MoveSnake () che abbiamo implementato in precedenza. Per vedere finalmente il risultato di tutto il nostro duro lavoro e avere un serpente visivo e in movimento, in pratica dobbiamo solo creare le parti iniziali del serpente e quindi avviare il timer. Creeremo un metodo chiamato StartNewGame () , che useremo per iniziare sia il primo gioco sia qualsiasi numero di nuovi giochi aggiuntivi quando il giocatore muore. Inizieremo con una versione molto semplice di esso, e poi la espanderò con più funzionalità man mano che ci muoviamo - per ora, facciamo muovere questo serpente!

Il primo passo è aggiungere un altro set di costanti, che useremo per iniziare il nuovo gioco:

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

A questo punto vengono utilizzate solo le prime tre costanti, per controllare dimensioni, lunghezza e velocità iniziale del serpente. Useremo SnakeSpeedThreshold in seguito, ma per ora, aggiungiamo una semplice implementazione del metodo StartNewGame () come promesso:

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

Iniziamo impostando snakeLength e snakeDirection in base ai valori iniziali. Quindi aggiungiamo una singola parte alla lista snakeParts (ne parleremo più avanti), dandogli una posizione di partenza valida per spostarci a destra - useremo ancora una volta la costante SnakeSquareSize per aiutare a calcolare la posizione corretta. Possiamo quindi disegnare il serpente chiamando il metodo DrawSnake () e quindi abilitare il timer, che fondamentalmente inizierà il movimento del serpente.

Siamo finalmente arrivati ​​al punto in cui possiamo quasi sederci e goderci la primissima versione di qualcosa che in realtà sembra un gioco - in effetti, tutto ciò che dobbiamo fare ora è chiamare StartNewGame () . Questo dovrebbe ovviamente essere fatto quando l'utente è pronto, ma per ora, per verificare che tutto funzioni, lo faremo semplicemente non appena tutto il resto verrà inizializzato - faremo ancora una volta affidamento sul ContentRendered evento della Window, che abbiamo aggiunto in uno dei primi articoli. Aggiungi semplicemente una chiamata al nostro metodo StartNewGame () e siamo finalmente pronti per compilare ed eseguire:

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

Se hai fatto tutto come descritto, ora dovresti essere in grado di avviare il gioco e vedere il serpente in fase di creazione e iniziare immediatamente a muoversi:

Notare come il serpente appare dal nulla, come un singolo quadrato, e poi cresce fino a una lunghezza di tre quadrati. Ciò accade perché aggiungiamo solo una parte all'elenco snakeParts , ma ogni volta che il metodo MoveSnake () viene chiamato dal timer, viene aggiunta una nuova parte (per renderla crescere), rimuovendo le parti di coda solo se la lunghezza attuale sta per superare la lunghezza desiderata del serpente, che inizia da 3 (deciso dalla costante SnakeStartLength ).

Summary

Ora abbiamo un serpente in movimento, il che è davvero fantastico! Ma come puoi vedere dall'immagine animata sopra, ci sono ancora cose da fare: non c'è cibo per il serpente da mangiare e quando il serpente colpisce il muro, non succede nulla. Lavoreremo su questi aspetti nei prossimi articoli.

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!