TOC

This article has been localized into Czech by the community.

Tvoříme počítačovou hru: 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!

Plynulý pohyb s DispatcherTimer

V předchozích článcích jsme vytvořili pěkně vypadající herní oblast pro našeho hada a poté jsme přidali kód pro skutečné vytvoření a pohyb hada. Avšak, jak již bylo zmíněno, kód pro pohyb není něco, co by mělo být voláno jen jednou - místo toho by mělo být voláno znovu a znovu, aby se had pohyboval, dokud hra běží. Jinými slovy, budeme potřebovat časovač.

Obecně řečeno, v programování je Časovač obvykle mechanismus, který umožňuje opakování úkolu znovu a znovu na základě intervalu. Jinými slovy, pokaždé, když časovač "tikne", je proveden kus kódu, a časovač tiká na základě definovaného intervalu. To je přesně to, co potřebujeme, abychom udrželi našeho hada v pohybu, takže do našeho okna přidáme DispatcherTimer:

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

S tím se nyní potřebujeme přihlásit k odběru jeho jediné události: Události Tick. Uděláme to v konstruktoru okna:

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

A zde je realizace akce:

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

Takže pokaždé, když časovač tikne, je volána událost Tick, která na oplátku volá metodu MoveSnake(), kterou jsme implementovali dříve. Abychom konečně viděli výsledek všeho našeho tvrdého úsilí a měli vizuálně se pohybujícího hada, v podstatě stačí vytvořit počáteční části hada a poté spustit časovač. Vytvoříme metodu nazvanou StartNewGame(), kterou použijeme jak pro spuštění první hry, tak pro libovolný počet dalších nových her, když hráč zemře. Začneme ale velmi základní verzí a poté ji rozšíříme o další funkce, jak budeme pokračovat - prozatím se pojďme jen podívat, jak se tento had pohybuje!

Prvním krokem je přidání další sady konstant, které použijeme pro spuštění nové hry:

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

V tomto okamžiku se používají pouze první tři konstanty, které kontrolují velikost, délku a počáteční rychlost hada. Konstantu SnakeSpeedThreshold použijeme později, ale prozatím přidáme, jak bylo slíbeno, jednoduchou implementaci metody StartNewGame():

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

Začínáme nastavením snakeLength (délky hada) a snakeDirection (směru hada) na základě počátečních hodnot. Poté přidáme jednu část do seznamu snakeParts (více o tom později), čímž mu dáme hezkou startovní pozici pro pohyb doprava - opět použijeme konstantu SnakeSquareSize k výpočtu správné pozice. S tímto nastavením můžeme hada nakreslit voláním metody DrawSnake() a poté povolit časovač, který v podstatě zahájí pohyb hada.

Nyní jsme konečně v bodě, kdy si můžeme téměř sednout a užít si velmi první verzi něčeho, co vypadá jako hra - ve skutečnosti vše, co musíme nyní udělat, je zavolat metodu StartNewGame(). To by samozřejmě mělo být provedeno, když je uživatel připraven, ale prozatím, abychom ověřili, že vše funguje, jednoduše to uděláme, jakmile je vše ostatní inicializováno - opět se spolehneme na událost ContentRendered okna Window, kterou jsme přidali v jednom z prvních článků. Stačí přidat volání naší metody StartNewGame() a konečně jsme připraveni zkompilovat a spustit:

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

Pokud jste vše provedli podle popisu, nyní byste měli být schopni hru spustit a vidět, jak je had vytvořen a ihned začne se pohybovat:

Všimněte si, jak se had objevuje z ničeho nic, jako jediný čtverec, a poté naroste na délku tří čtverců. To se děje, protože do seznamu snakeParts přidáváme pouze jednu část, ale pokaždé, když je metoda MoveSnake() volána časovačem, je přidána nová část (aby had rostl), zatímco části ocasu jsou odstraněny pouze v případě, že aktuální délka má překročit požadovanou délku hada, která začíná na 3 (rozhodnuto konstantou SnakeStartLength).

Shrnutí

Nyní máme pohybujícího se hada, což je opravdu úžasné! Ale jak můžete vidět z animovaného obrázku výše, stále je co dělat - pro hada není žádné jídlo a když had narazí do zdi, nic se nestane. Na těchto aspektech budeme pracovat v dalších článcích.


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!