上一篇:C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十四) 精灵控件横空出世!①

紧接着上一节,我们打开QXSpirit.xaml.cs文件。在游戏设计中,为了能够轻易控制及管理精灵的各项属性及功能等,我赋予每个精灵一个专属线程,它在精灵的使用中起到关键作用:
  1.       public QXSpirit() {

  2.             InitializeComponent();

  3.             InitThread(); //初始化精灵线程

  4.         }

  5.         DispatcherTimer Timer = new DispatcherTimer();

  6.         private void InitThread() {

  7.             Timer.Tick += new EventHandler(Timer_Tick);

  8.             Timer.Start();

  9.         }

  10.         //精灵线程间隔事件

  11.         int count = 1;

  12.         private void Timer_Tick(object sender, EventArgs e) {

  13.             Body.Source = new BitmapImage((new Uri(ImageAddress + count + ".png", UriKind.Relative)));

  14.             count = count == 7 ? 0 : count + 1;

  15.         }
复制代码
DispatcherTimer线程的创建在前面的章节中见得不要太多,这里不再累述了。那为何要在精灵控件中配置一个线程呢?打这样一个比方吧:我们可以把精灵比做一个人,它的生命就好比这个线程,每个人只有一条命,在精子与卵子结合之后(控件的初始化中创建),生命即开始鲜活(创建后即启动)简单说就是“命悬一线”啦。汗一个…。目前该线程与前面章节中的一样,暂时只做精灵动作图片切换用(Timer_Tick()),至于其他功能,我将在后面的章节中进行讲解。

    赋予了精灵生命以后,接着需要培养它的性格,让它拥有更多的能力、更多的属性。当然,大家首先迫切想要实现的就是前两节遗留下来关于精灵的X,Y属性。那么先来看代码:
  1.         //精灵X坐标(关联属性)

  2.         public double X {

  3.             get { return (double)GetValue(XProperty); }

  4.             set { SetValue(XProperty, value); }

  5.         }

  6.         public static readonly DependencyProperty XProperty = DependencyProperty.Register(

  7.             "X", //属性名

  8.             typeof(double), //属性类型

  9.             typeof(QXSpirit), //属性主人类型

  10.             new FrameworkPropertyMetadata(

  11.                 (double)0, //初始值0

  12.                 FrameworkPropertyMetadataOptions.None, //不特定界面修改

  13.                 //不需要属性改变回调

  14.                 null,//new PropertyChangedCallback(QXSpiritInvalidated),

  15.                 //不使用强制回调

  16.                 null

  17.                 )

  18.             );



  19.         //精灵Y坐标(关联属性)

  20.         public double Y {

  21.             get { return (double)GetValue(YProperty); }

  22.             set { SetValue(YProperty, value); }

  23.         }

  24.         public static readonly DependencyProperty YProperty = DependencyProperty.Register(

  25.             "Y",

  26.             typeof(double),

  27.             typeof(QXSpirit),

  28.             new FrameworkPropertyMetadata(

  29.                 (double)0,

  30.                 FrameworkPropertyMetadataOptions.None,

  31.                 null,

  32.                 null

  33.                 )

  34.             );
复制代码
以上代码实现了QXSpirit控件的X,Y关联属性。大家不要被看似复杂的代码所吓着,其实很简单的,让我一一道来。首先将以上代码分成两部分:X坐标为第一部分,Y坐标为第二部分。它们的结构是一模一样的,我们可以忽略Y坐标,只要理解了X关联属性的实现,将X换成Y即可。

    关于关联属性(上一节中的AttachProperty(附加属性)其实也是通过关联属性来实现的)的相关知识,网上不要太多,它不是本教程的重点所以就不多做解释了。理解它的朋友都明白,上面代码是它的标准创建形式,public double X是它的属性访问器,public static readonly DependencyProperty XProperty 则是定义它。就如上面代码注释中写到的,分别定义它的属性名、类型、所处类名等等。这样,一个完整的X关联属性就完成了。有的朋友又困惑了,为什么要那么麻烦去创建关联属性?我直接这样写不就得了:
  1.         double _X;

  2.         public double X {

  3.             get { return _X; }

  4.             set { _X = value; }

  5.         }
复制代码
TOP