上面的代码配有很详细的注释,这里除了前面章节里的动画知识外,新出现了动态创建关键帧动画的知识。首先我们来看第一小段,它的作用是将主角所处的位置定义为起点,将鼠标点击的位置定义为终点,然后就和上一节中讲解的一样开始通过A*寻径,最终得到路径点的集合List<PathFinderNode> path。因为根据A*原理算出的path是反向序列的,即由终点开始到起点的点集,但是我们需要得到的是正向的点集,这样在后面可以更方便调用。所以这里就用到了反向换算来计算出正向点集Point[] framePosition。万事具备后,我们分别开始创建X轴,Y轴的关键帧动画。具体关于WPF/Silverlight关键帧动画的知识这里不多说了,因为是高级教程嘛,有迷糊的朋友请先查阅相关资料,网络上有很多。这里要提出来特别讲解一下的是int cost这个变量,就如它的注释中讲的每移动一个小方格(20*20)花费100毫秒。有朋友就要问了:我移动到直线邻近方格的距离(假设为10)和移动到对角线邻近方格距离(则为14.14,根据三角函数计算)是不一样的,统一使用100来衡量是不是不够精确?这里我要特别说的是,如果您将GridSize(上一节有关于它的详细解说)定义得比较小(例如本例中定义为20),那么在程序实际运行中将完全感觉不到不同方向上移动速度的不同,所有方向上的动画感觉都是匀速且非常平滑的。但是如果GridSize定义的值越大(例如>50),那么斜线方向上的速度将明显慢过直线方向上的速度,这是因为Storyboard动画是基于时间轴形成的动画,初中物理学中就有讲解,在相同时间内行走不同长度的路程肯定会导致平均速度的不同。所以,如果想在此条件下进行真实情况模拟,就需要再进行一些数据计算及换算,这样将导致性能上打折扣。并且GridSize>50的情况在现实游戏开发中基本不存在(RPG类型游戏就不说了,GridSize是越小越好,从而得到更精确的定位,但同时带来的是更加复杂精细的地图布局工作。而显式使用格子的SLG类型游戏你有见哪款将每个格子定义为50*50像素的?如果有,800*600的屏幕显示不到10*10个格子,这是相当滑稽可笑的)。所以大家完全可以统一化,将直接和斜线的移动花费时间均统一成100毫秒,GridSize进行合理的设置,这样将大大降低程序的复杂度且性能上得到非常好的效果。
回到代码上,在最后,我加入了一段代码用白色点来记录主角移动所经过的痕迹,其实就是Point[] framePosition,这样也可以非常方便大家去理解上面代码的功能作用。
完成以上代码后,我们来测试一下,运行程序我们随便乱点点看看,嘿嘿,主角可以幽雅的越过障碍物移动了呢,而且在移动的过程中你再点别的位置它将很平滑的重新向新的位置移动,可以说近乎完美的模拟了2D RPG游戏中的人物移动:
至此,我们已经实现了WPF/Silverlight游戏中人物的移动动画、越过障碍物、寻路等。那么后面的章节我将引入一个不可移动的地图作为背景并在地图中加入一些障碍物,最后结合第四章及第五章关于2D人物动画的知识模拟出一个RPG游戏场景,敬请关注。
原文地址:http://www.cnblogs.com/alamiye010/archive/2009/06/17/1505337.html