TOC

This article is currently in the process of being translated into Russian (~99% done).

Создание игры: WPF змейка:
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!

Controlling the Snake

На данном этапе наших статей о змейке в WPF у нас есть красиво выглядящий фон и движущаяся змейка. К сожалению, змейка двигается в одном направлении, пока не покинет окно. Нам, очевидно, нужно добавить код, который позволит контролировать движение змейки с помощью клавиатуры.

У большинства WPF контролов есть события для получения входных сигналов от мыши и клавиатуры. Таким образом, в зависимости от того, где вы хотите проверить входной сигнал, вы можете подписаться на события одного или нескольких контролов и затем осуществить там магию. Однако, поскольку это игра, мы хотим отлавливать нажатия клавиатуры вне зависимости от того где будет фокус, поэтому мы просто подпишемся на событие непосредственно в окне.

Событие KeyUp - отличный выбор для того, что мы хотим выполнить. Потому найдите ваш XAML - файл окна и измените его атрибуты так, чтобы они включали событие 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. Сейчас вы можете удалить его, и вместо этого начать игру нажатием клавиши Пробел. И теперь змейка под контролем, а мы близки к созданию настоящей игры и не просто движущейся змейки.

Заключение

В этой статье мы добавили довольно важный аспект в нашей реализации змейки: контроль над змейкой. Однако, если вы попытаетесь сыграть в неё, вы заметите, что нам по-прежнему необходимо кое-что важное. Змейка выходит и исчезает за пределами окна и не ест еду, даже если сталкивается с ней. Другими словами, нам нужно добавить обнаружение столкновений. Об этом в следующей статье.


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!