上一篇:C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(八) 完美实现A*寻径动态动画

本节将运用前两节的知识到实际的2D游戏人物在地图上移动中,同时也算是对前面八节的内容进行一次综合运用吧。

    那么先从最底层的地图讲起。首先我将一张地图添加进游戏窗口中,这里我同样使用Image控件:
  1.         Image Map = new Image();

  2.         private void InitMap() {

  3.             Map.Width = 800;

  4.             Map.Height = 600;

  5.             Map.Source = new BitmapImage((new Uri(@"Map\Map.jpg", UriKind.Relative)));

  6.             Carrier.Children.Add(Map);

  7.             Map.SetValue(Canvas.ZIndexProperty, -1);

  8.         }
复制代码
我将一个800*600名叫Map.jpg的地图图片添加进项目Map文件夹中,然后将它的Canvas.Zindex属性设置为-1,这样它就相当于地图背景的作用了。有了这张地图以后,我们需要对它进行障碍物设置:


附件: 1.jpg



    从上图可以看到,理想的状态下,障碍物为我用蓝色填充的区域,这是理想状态下障碍物的设置。但是实际运用中,就拿本教程来讲,因为GridSize设置为20,那么我们最终得到的障碍物将是这样的:


附件: 3.jpg



    从上图可以看到,每个绿色格子代表一个20*20像素的障碍物,只能说勉强达到描绘障碍物的效果吧。从而又验证了我们上一节所讲到的GridSize越小,定位将越精确,难道不是至理名言吗!

    有了这个思路,接下来我用了3个循环算法实现了左部分的障碍物设定:
  1.             //构建障碍物

  2.             for (int y = 12; y <= 27; y++) {

  3.                 for (int x = 0; x <= 7; x++) {

  4.                     //障碍物在矩阵中用0表示

  5.                     Matrix[x, y] = 0;

  6.                     rect = new Rectangle();

  7.                     rect.Fill = new SolidColorBrush(Colors.GreenYellow);

  8.                     rect.Opacity = 0.3;

  9.                     rect.Stroke = new SolidColorBrush(Colors.Gray);

  10.                     rect.Width = GridSize;

  11.                     rect.Height = GridSize;

  12.                     Carrier.Children.Add(rect);

  13.                     Canvas.SetLeft(rect, x * GridSize);

  14.                     Canvas.SetTop(rect, y * GridSize);

  15.                 }

  16.             }

  17.             int move = 0;

  18.             for (int x = 8; x <= 15; x++) {

  19.                 for (int y = 12; y <= 18; y++) {

  20.                     Matrix[x, y - move] = 0;

  21.                     rect = new Rectangle();

  22.                     rect.Fill = new SolidColorBrush(Colors.GreenYellow);

  23.                     rect.Opacity = 0.3;

  24.                     rect.Stroke = new SolidColorBrush(Colors.Gray);

  25.                     rect.Width = GridSize;

  26.                     rect.Height = GridSize;

  27.                     Carrier.Children.Add(rect);

  28.                     Canvas.SetLeft(rect, x * GridSize);

  29.                     Canvas.SetTop(rect, (y - move) * GridSize);

  30.                 }

  31.                 move = x % 2 == 0 ? move + 1 : move;

  32.             }

  33.             int start_y = 4;

  34.             int end_y = 10;

  35.             for (int x = 16; x <= 23; x++) {

  36.                 for (int y = start_y; y <= end_y; y++) {

  37.                     Matrix[x, y + move] = 0;

  38.                     rect = new Rectangle();

  39.                     rect.Fill = new SolidColorBrush(Colors.GreenYellow);

  40.                     rect.Opacity = 0.3;

  41.                     rect.Stroke = new SolidColorBrush(Colors.Gray);

  42.                     rect.Width = GridSize;

  43.                     rect.Height = GridSize;

  44.                     Carrier.Children.Add(rect);

  45.                     Canvas.SetLeft(rect, x * GridSize);

  46.                     Canvas.SetTop(rect, (y + move) * GridSize);

  47.                 }

  48.                 start_y = x % 3 == 0 ? start_y + 1 : start_y;

  49.                 end_y = x % 3 == 0 ? end_y - 1 : end_y;

  50.             }
复制代码
TOP