精灵控件让游戏开发更美好!有了它,离完善牵引式地图移动模式可谓一步之遥。只剩下最后一个环节了,大家加油吧。
上一节,我在界面线程中通过时时设置Canvas.SetLeft(Spirit, Spirit.X + Canvas.GetLeft(Map) - SpiritCenterX * GridSize);和Canvas.SetTop(Spirit, Spirit.Y + Canvas.GetTop(Map) - SpiritCenterY * GridSize);来实现主角跟随着地图移动。从该公式我们可以分析出影响主角在窗口中显示位置的两个因素:第一个为地图图片(Image Map)相对于窗口的位置(Canvas.GetLeft(Map),Canvas.GetTop(Map)),它是在鼠标牵引地图移动的时候时时改变的,与主角在地图上的走动无关;第二个则为主角自身的X,Y坐标属性(Spirit.X,Spirit.Y),当主角在地图上走动时,它是时时更改的。由此可以得到一个结论:要实现主角在此模式地图上的移动,只需要在它走路的时候时时更新它的坐标Spirit.X和Spirit.Y即可,这样界面线程中会同步更新主角在窗口中的位置而达到完美的游戏动画衔接。
找到了切入点,那么实现起来就简单多了。
这里,我们首先需要对前面章节中的A*寻路方法进行一些改进。在前面的章节中,由于地图是固定死不动的,且尺寸相当于窗口大小,这样我们简单的将地图和窗口示为一体。因此,在A*寻路过程(AStarMove())中同时实现了主角相对于地图的移动,即基于对象关联属性为PropertyPath("Canvas.Left"), PropertyPath("Canvas.Top")的Storyboard动画。但是在牵引式地图移动模式中就不能这样做了,根据前面分析的原理,则必须改为基于对象关联属性为PropertyPath("X"),PropertyPath("Y")的Storyboard动画。此时的动画或许将之理解为从寻路得到的路径序列点中连续取出坐标的计时器更加贴切,因为它只负责改变Spirit的X,