TOC

This article has been localized into Polish by the community.

Tworzenie Gry: 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!

Kontrolowanie węża

Na ten moment w naszym artykule na temat serii SnakeWPF stworzyliśmy ładnie wyglądające tło i poruszającego się węża. Niestety, ale wąż porusza się tylko w jednym kierunku do momentu opuszczenia obszaru. Oczywiście musimy dodać trochę kodu, wtedy będziemy mogli kontrolować ruch węża przy pomocy klawiatury.

Większość kontrolerów WPF posiada zdarzenia do obsługi otrzymywanych sygnałów wejściowych z myszki i klawiatury. W zależności gdzie chcesz sprawdzić sygnał wejściowy, możesz nasłuchiwać konkretnych sygnałów wejściowych i wykonywać tam magię. Jednakże, ponieważ to jest tylko gra, chcemy otrzymać sygnał z klawiatury bez znaczenia na jakim elemencie jesteśmy skupieni, więc będziemy nasłuchiwać zdarzeń prosto z samego okna.

Do tego co chcemy osiągnąć, zdarzenie KeyUp jest świetnym wyborem. Więc, znajdź swój plik XAML dla okna i zmodyfikuj tag okna tak, że zawiera on zdarzenie KeyUp jak poniżej:

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

W twoim głównym kodzie dodaj Window_KeyUp kontroler zdarzeń, tak jak poniżej:

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

Pierwszą rzeczą jaką robimy jest zapisanie odniesienia do obecnego kierunku w którym porusza się wąż - potrzebujemy tego aby mieć pewność, że gracz nie próbuje zrobić czegoś na co my nie zezwalamy, jak zawrócić przez ciało węża (np. z lewej do prawej). Innymi słowy, jeżeli wąż porusza się pionowo, gracz musi najpierw zmienić kierunek poziomo - nie możesz od razu zmienić kierunku z góry na dół lub z lewej do prawej.

Następnie jest deklaracja switch, gdzie sprawdzamy czy przycisk został wciśnięty. Tutaj sprawdzamy czy jedna ze strzałek (Left, Down, Left, Right) zostały wciśnięte - jeżeli tak, kierunek węża może zostać zmieniony, o ile nie jest to fizycznie niemożliwe, tak jak opisane powyżej. Należy również zauważyć, że dodałem sprawdzenie dla przycisku Space. Wywoła to metodę StartNewGame(), która pozwoli graczowi kiedy gra się rozpocznie, zamiast rozpoczynać grę automatycznie. Pozwoli również to rozpocząć nową grę graczowi, kiedy poprzednia się zakończy.

Na koniec metody sprawdzamy czy kierunek zmienił się w stosunku do oryginalnego kierunku - jeżeli tak, wywołujemy metodę MoveSnake() aby zmiana była pokazana natychmiast.

Wcześniej dodaliśmy odwołanie do metody StartNewGame() w zdarzeniu Window_ContonentRendered - możesz teraz usunąć to i wystartować grę przy pomocy przycisku spacji. Teraz wąż może być kontrolowany - jest już to bliskie do bycia grą, a nie tylko animowanym wężem!

Podsumowanie

W tym artykule dodaliśmy trochę ważnych funkcjonalności do naszej implementacji SnakeWPF: Kontrolę naszego węża! Jednakże, jeżeli spróbujesz w to zagrać, zauważysz że nadal potrzebujemy dodać jeden bardzo ważny aspekt, ponieważ nasz wąż znika za ścianami i odmawia jedzenia, nawet gdy uderzysz prosto w nie. Innymi słowy, musimy dodać detekcję kolizji! Więcej na ten temat w następnym artykule.


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!