从代码可以看出,我们已经可以自由的使用Spirit的X,Y属性了,并且轻松的控制该精灵的图片切换频率(为什么我们需要去控制它的切换频率呢?因为在游戏中,角色施放魔法有施法速度;物理攻击时有攻击速度、甚至可能会被冻结(移动速度减)、麻痹(精灵不动)、加速移动攻击BUFF等等,这些不光需要更改角色的相关属性逻辑,更需要在游戏窗口表现时通过调整精灵图片切换速率来实现之,因此意义是相当相当重大的),是不是有些成就感了?
至于我们在牵引地图移动的同时,如何实现角色及障碍物的跟随移动?有了X,Y属性以后,接下来的就再简单不过了,首先来看这张图:

因为地图图片在随鼠标牵引的情况下,它的Canvas.getLeft(Map)和Canvas.getTop(Map)属性是时时更新的,在第十三节中有提到。那么在地图动的时候,当已知主角在地图图片中的坐标(Spirit.X,Spirit.Y)后,即可以按上图根据公式计算出它在游戏窗口中显示的时时位置为:Spirit.X+ Canvas.getLeft(Map) - SpiritCenterX * GridSize,Spirit.Y+ Canvas.getTop(Map) - SpiritCenterY * GridSize。有了它,在后面章节中包括A*寻路计算,直线移动等方面的计算不再需要考虑SpiritCenterX和SpiritCenterY,这将大大简化游戏设计。据此,我们在游戏窗口的Timer_Tick事件中这样写:
private void Timer_Tick(object sender, EventArgs e) {
double mapleft = Canvas.GetLeft(Map);
double maptop = Canvas.GetTop(Map);
……
//主角跟随地图同时移动
Canvas.SetLeft(Spirit, Spirit.X + mapleft – SpiritCenterX * GridSize);
Canvas.SetTop(Spirit, Spirit.Y + maptop – SpiritCenterY * GridSize);
//所有障碍物实体同样跟随移动(实际中并不需要下面代码,这里只为测试用)
foreach (UIElement uie in Carrier.Children) {
if (uie is Rectangle) {
Rectangle r = uie as Rectangle;
Point p = getPointFromTag(r.Tag); //此方法在上一节有介绍
Canvas.SetLeft(r, mapleft + p.X * GridSize);
Canvas.SetTop(r, maptop + p.Y * GridSize);
}
}
}
上面黄色代码部分即为通过公式来改变主角在游戏窗口中的显示。由于此时的障碍物实体为Rectangle,因此可以通过foreach来改变窗口中所有障碍物显示实体Rectangle对象的显示位置来描绘障碍物同样随着地图的移动而移动(实际中并不需要此段代码,只为了演示)。
到此为止就完成了牵引式地图移动模式中的所有对象跟随地图移动。最后大家按下CTRL+F5并任意移动移动地图看看:

嘿嘿,都能跟随移动了呢,但是仿佛还遗漏了什么??对了,还没实现此模式下主角通过鼠标点击进行走路呢,而且在走路的同时如果我们牵引地图移动,主角也能同样的显示在正确窗口位置上,这又涉及到多个坐标系中坐标的换算,就让这头疼的问题留给下节去处理吧,敬请关注。
原文地址:http://www.cnblogs.com/alamiye010/archive/2009/06/21/1507926.html