TOC

This article has been localized into Ukrainian by the community.

Створення гри: 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!

Контроль над змією

На цьому етапі нашої серії статей про SnakeWPF у нас є гарний фон і рухома змія. На жаль, змія рухається лише в одному напрямку, поки не покине область. Нам, очевидно, потрібно додати трохи коду, щоб ми могли керувати змією за допомогою клавіатури.

Більшість елементів керування WPF мають події для отримання вводу від миші та клавіатури. Тож, залежно від того, де ви хочете перевірити ввод, ви можете підписатися на ці події для одного або кількох елементів керування, а потім виконувати магію там. Однак, оскільки це гра, ми хочемо перехоплювати ввод з клавіатури незалежно від того, де знаходиться фокус, тому ми просто підпишемося на подію безпосередньо у вікні.

Для нашої мети подія KeyUp чудово підійде. Отже, знайдіть свій XAML-файл для вікна та змініть тег Window, щоб він містив подію KeyUp ось так:

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

У вашому коді програмного забезпечення додайте обробник події Window_KeyUp, ось так:

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

Перше, що ми робимо, це зберігаємо посилання на поточний напрямок руху змії — це потрібно, щоб переконатися, що гравець не намагається зробити щось заборонене, наприклад, розвернутися назад через тіло змії (наприклад, справа наліво). Іншими словами, якщо змія рухається вертикально, а гравець хоче змінити напрямок, вона повинна спочатку рухатися горизонтально — не можна рухатися безпосередньо зверху вниз або зліва направо.

Далі йде оператор switch, де ми перевіряємо, яка клавіша була натиснута. Тут ми перевіряємо, чи була натиснута одна з клавіш зі стрілками (Вгору, Вниз, Вліво, Вправо) - якщо так, то їм дозволено змінювати напрямок змійки, якщо зміна фізично неможлива, як описано вище. Також зверніть увагу, що я додав перевірку для клавіші Пробіл: вона викличе метод StartNewGame(), щоб дозволити гравцеві вибрати, коли гра починається, замість того, щоб просто запускати її автоматично. Це також дозволить гравцеві розпочати нову гру, коли попередня гра закінчилася.

В кінці методу ми перевіряємо, чи змінився напрямок порівняно з початковим напрямком — якщо так, ми викликаємо метод MoveSnake(), щоб зміна відобразилася негайно.

Раніше ми додали виклик методу StartNewGame() у події Window_ContentRendered — тепер ви можете видалити його та натомість запустити гру, натиснувши клавішу пробілу. Тепер, дивіться, змією можна керувати — вона майже як справжня гра, а не просто анімованою змією!

Короткий зміст

У цій статті ми додали до нашої реалізації SnakeWPF кілька досить важливих функцій: керування змією! Однак, якщо ви спробуєте її відтворити, ви помітите, що нам все ще потрібен один дуже важливий аспект, оскільки змія зараз зникає за межами стіни та відмовляється їсти їжу, навіть коли ви її вдаряєте. Іншими словами, нам потрібно додати деяке виявлення зіткнень! Детальніше про це в наступній статті.


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!