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!

Безперервний рух за допомогою DispatcherTimer

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

Загалом кажучи, у програмуванні таймер – це зазвичай механізм, який дозволяє повторювати завдання знову і знову, залежно від інтервалу. Іншими словами, кожного разу, коли таймер «цокає», виконується фрагмент коду, і таймер цокає, залежно від визначеного інтервалу. Це саме те, що нам потрібно, щоб наша змійка рухалася, тому ми додамо DispatcherTimer до нашого вікна:

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

Після цього нам потрібно підписатися на його єдину подію: подію Tick. Ми зробимо це в конструкторі вікна:

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

А ось реалізація події:

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

Отже, кожного разу, коли таймер цокає, викликається подія Tick, яка у відповідь викликає метод MoveSnake(), який ми реалізували раніше. Щоб нарешті побачити результат усієї нашої наполегливої ​​праці та мати візуальну рухому змію, нам просто потрібно створити початкові частини змії, а потім запустити таймер. Ми створимо метод під назвою StartNewGame(), який ми використовуватимемо для запуску як першої гри, так і будь-якої кількості додаткових нових ігор після смерті гравця. Ми почнемо з дуже базової версії, а потім я розширю її функціональністю в міру просування — а поки що давайте просто зрушимо цю змію!

Першим кроком є ​​додавання ще одного набору констант, які ми використовуватимемо для запуску нової гри:

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

На цьому етапі використовуються лише перші три константи для керування розміром, довжиною та початковою швидкістю Змії. Пізніше ми скористаємося SnakeSpeedThreshold, а зараз додамо просту реалізацію методу 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;  
}

Ми починаємо з встановлення snakeLength та snakeDirection на основі початкових значень. Потім ми додаємо одну деталь до списку snakeParts (про це пізніше), надаючи їй гарну початкову позицію для руху праворуч - ми знову використаємо константу SnakeSquareSize, щоб допомогти розрахувати правильну позицію. З цим ми можемо намалювати змію, викликавши метод DrawSnake(), а потім увімкнувши таймер, який фактично запустить рух змії.

Нарешті ми дійшли до точки, де можемо майже розслабитися та насолоджуватися першою версією чогось, що насправді схоже на гру – насправді, все, що нам потрібно зробити зараз, це викликати метод StartNewGame(). Звичайно, це слід зробити, коли користувач буде готовий, але зараз, щоб перевірити, чи все працює, ми просто зробимо це, як тільки все інше буде ініціалізовано – ми знову покладатимемося на подію ContentRendered об'єкта Window, яку ми додали в одній з перших статей. Просто додайте виклик нашого методу StartNewGame(), і ми нарешті готові до компіляції та запуску:

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

Якщо ви все зробили, як описано, то тепер ви зможете запустити гру та побачити, як створюється змія, і одразу почати рухатися:

Зверніть увагу, як змія з'являється з нічого, як один квадрат, а потім виростає до довжини в три квадрати. Це відбувається тому, що ми додаємо лише одну частину до списку snakeParts, але щоразу, коли таймер викликає метод MoveSnake(), нова частина додається (щоб вона зростала), а хвостові частини видаляються лише тоді, коли поточна довжина майже перевищує бажану довжину змії, яка починається з 3 (визначається константою SnakeStartLength).

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

Тепер у нас є рухома змія, що справді чудово! Але, як видно з анімованого зображення вище, є ще багато чого зробити — змії немає їжі, а коли вона вдаряється об стіну, нічого не відбувається. Ми розглянемо ці аспекти в наступних статтях.


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!