This article has been localized into Vietnamese by the community.
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!
Điều khiển Rắn
Tại thời điểm này trong loạt bài viết của chúng tôi về SnakeWPF, bây giờ chúng ta có một nền tảng đẹp mắt và một con rắn di chuyển. Thật không may, con rắn chỉ di chuyển theo một hướng cho đến khi nó rời khỏi khu vực. Rõ ràng chúng ta cần thêm một số mã để có thể điều khiển con rắn bằng bàn phím.
Hầu hết các điều khiển WPF có các sự kiện để nhận đầu vào từ chuột và bàn phím. Vì vậy, tùy thuộc vào nơi bạn muốn kiểm tra đầu vào, bạn có thể đăng ký các sự kiện này cho một hoặc một số điều khiển và sau đó thực hiện điều chỉnh ở đó. Tuy nhiên, vì đây là một trò chơi, chúng tôi muốn bắt đầu vào bàn phím bất kể trọng tâm có thể ở đâu, vì vậy chúng tôi chỉ cần đăng ký sự kiện trực tiếp trên Window.
Đối với những gì chúng tôi muốn thực hiện, sự kiện KeyUp là một sự kiện tuyệt vời. Vì vậy, hãy tìm tệp XAML của bạn cho Window và sửa đổi thẻ Window để nó bao gồm sự kiện KeyUp như thế này:
<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">
Trong Code-behind của bạn, hãy thêm trình xử lý sự kiện Window_KeyUp, như thế này:
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();
}
Điều đầu tiên chúng ta làm là lưu tham chiếu đến hướng hiện tại mà con rắn đang đi - chúng ta cần điều này để đảm bảo rằng người chơi không cố gắng làm điều gì đó mà chúng ta sẽ không cho phép, như đảo ngược cơ thể con rắn ( ví dụ từ phải sang trái). Nói cách khác, nếu con rắn di chuyển theo chiều dọc và người chơi muốn thay đổi hướng, nó phải đi theo chiều ngang trước - bạn không thể đi thẳng từ trên xuống hoặc từ trái sang phải.
Tiếp theo là một câu lệnh switch, trong đó chúng tôi kiểm tra phím nào được nhấn. Ở đây chúng tôi kiểm tra xem một trong các phím mũi tên (Up, Down, Left, Right) đã được nhấn - nếu vậy, chúng được phép thay đổi hướng của con rắn, trừ khi thay đổi là không thể, như mô tả ở trên. Cũng lưu ý rằng tôi đã thêm một kiểm tra cho phím Space: Nó sẽ gọi phương thức StartNewGame(), để cho phép người chơi chọn khi trò chơi bắt đầu, thay vì chỉ bắt đầu tự động. Nó cũng sẽ cho phép người chơi bắt đầu một trò chơi mới khi trò chơi trước đó đã kết thúc.
Khi kết thúc phương thức, chúng tôi kiểm tra xem hướng đã thay đổi so với hướng ban đầu hay chưa - nếu có, chúng tôi gọi phương thức MoveSnake(), để thay đổi được phản ánh ngay lập tức.
Trước đây chúng tôi đã thêm một cuộc gọi đến phương thức StartNewGame() trong sự kiện Window_ContentRendered - bây giờ bạn có thể xóa cuộc gọi này và thay vào đó bắt đầu trò chơi bằng cách nhấn phím Space. Bây giờ con rắn có thể được điều khiển - giờ đây nó gần giống như một trò chơi thực tế chứ không chỉ là một con rắn hoạt hình!
Tổng kết
Trong bài viết này, chúng tôi đã thêm một số chức năng khá quan trọng vào việc triển khai SnakeWPF của chúng tôi: Điều khiển con rắn! Tuy nhiên, nếu bạn thử chơi nó, bạn sẽ nhận thấy rằng chúng ta vẫn cần một khía cạnh rất quan trọng, bởi vì con rắn hiện đang biến mất khỏi ranh giới tường và nó từ chối ăn thức ăn ngay cả khi bạn đâm vào nó. Nói cách khác, chúng ta cần thêm một số phát hiện va chạm! Thêm vào đó trong bài viết tiếp theo.