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!

Ovládání hada

Na tomto místě naší série článků o SnakeWPF už máme pěkně vypadající pozadí a pohybujícího se hada. Bohužel had se pohybuje jen jedním směrem, dokud neopustí oblast. Zjevně potřebujeme přidat nějaký kód, abychom mohli hada ovládat pomocí klávesnice.

Většina ovládacích prvků WPF má události pro příjem vstupu z myši a klávesnice. Takže v závislosti na tom, kde chcete vstup kontrolovat, můžete se přihlásit k odběru těchto událostí pro jeden nebo několik ovládacích prvků a poté tam provést kouzlo. Jelikož se ale jedná o hru, chceme zachytit vstup z klávesnice bez ohledu na to, kde by mohl být fokus, takže se jednoduše přihlásíme k odběru události přímo na okně.

Pro to, co chceme dosáhnout, je událost KeyUp skvělou volbou. Proto najděte svůj XAML soubor pro okno a upravte tag Window tak, aby zahrnoval událost KeyUp, jako je toto:

<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">

Ve vašem kódu za běhu přidejte obslužnou rutinu události Window_KeyUp, takto:

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

První věc, kterou uděláme, je uložení odkazu na aktuální směr, kterým se had pohybuje - potřebujeme to, abychom se ujistili, že hráč se nepokouší dělat něco, co nebudeme povolovat, jako je například otáčení zpět přes tělo hada (např. zprava doleva). Jinými slovy, pokud se had pohybuje vertikálně a hráč chce změnit směr, musí se nejprve pohybovat horizontálně - nemůžete jít přímo z nahoru dolů nebo zleva doprava.

Dalším krokem je příkaz switch, kde kontrolujeme, která klávesa byla stisknuta. Zde kontrolujeme, zda byla stisknuta jedna ze šipek (Up, Down, Left, Right) - pokud ano, je jim umožněno změnit směr hada, pokud změna není fyzicky nemožná, jak bylo popsáno výše. Všimněte si také, že jsem přidal kontrolu pro klávesu Space: Volá metodu StartNewGame(), aby hráč mohl rozhodnout, kdy se hra spustí, místo aby se spustila automaticky. Také to umožní hráči začít novou hru, když předchozí hra skončila.

Na konci metody kontrolujeme, zda došlo ke změně směru ve srovnání s původním směrem - pokud ano, zavoláme metodu MoveSnake(), aby se změna okamžitě projevila.

Dříve jsme přidali volání metody StartNewGame() v události Window_ContentRendered - to nyní můžete odstranit a místo toho hru spustit stisknutím klávesy Space. A hle, hada lze ovládat - je to nyní blízko být skutečnou hrou, a ne jen animovaným hadem!

Shrnutí

V tomto článku jsme přidali do naší implementace SnakeWPF několik velmi důležitých funkcí: ovládání hada! Pokud se však pokusíte hrát, všimnete si, že nám stále chybí velmi důležitý aspekt, protože had momentálně mizí za hranicemi stěn a odmítá sníst jídlo, i když do něj narazíte. Jinými slovy, potřebujeme přidat nějakou detekci kolizí! Více o tom v dalším článku.


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!