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!
在我们关于WPF贪吃蛇系列文章中,我们现在有了一个好看的背景和一条移动的蛇.不幸地是,蛇只是在一个方向移动直到离开游戏区域.我们显然需要去添加一些代码使我们能够通过键盘控制贪吃蛇.
大多数WPF控件都有事件去接收键盘和鼠标的输入。因此,根据你想要检查输入的位置,你能够去订阅一个或多个控件的它们的事件,然后在那里表演魔术。然而,因为这是个游戏,无论焦点在哪里,我们都想要去捕捉键盘的输入,因此我们将会订阅事件在Window窗体上。
为了我们想要去实现的东西,KeyUp事件是一个不错的选择。因此,找到你的Window 的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">
在你的Code-behind,添加一个Window_KeyUp事件handler,像这样:
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 s语句,我们可以检查哪个键被我们按下。这里我们检查如果是其中一个方向键(Up, Down, Left, Right)被按下-如果是,它们将允许去改变蛇的方向,除非改变在物理上是不可能的,正如描述那样。也要注意我添加一个对Space键的检查:它将会去调用StartNewGame()方法,去允许玩家选择游戏什么时候开始,而不是自动启动它。它也将允许当之前的游戏已经结束的时候玩家去开始一个新的游戏
在方法的末尾,我们通过去比较原始方向来检查方向是否被改变-如果是的话,我们调用MoveSnake() 方法,以便立即反应更改。
我们之前在Window_ContentRendered 事件中添加一个StartNewGame()的调用-你现在可以移除它,反之通过按下Space 键去启动游戏。现在你看,贪吃蛇能够被控制-现在接近一个真正的游戏而不仅仅像一条动画蛇!
在这篇文章,我们为WPF贪吃蛇实现添加一些非常重要的功能:贪吃蛇的控制!然而,如果你尝试去玩它,你将会注意到我们仍然需要一个非常重要的方面,因为贪吃蛇正在从墙外消失,然后当你撞击到食物的时候拒绝去吃它。换句话说,我们需要添加一些碰撞检测!更多内容将在下一篇文章讲解。