C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十七)战斗前夜之构建动态障碍物系统
在标准的MMORPG中,每个精灵对象都占据着一块区域(脚底的一块小面积),该区域同样是障碍物系统中的一部分,并且它是动态的,随着精灵的移动而时时变化着。实现游戏中动态的障碍物构建使障碍物系统趋向完美是全面进军战斗系统的必要前奏,大家不想看着主角和怪物叠在一起打来打去吧?
之前的章节中障碍物数组只有一个,它只包含地图障碍物信息(地图中固定不动的障碍物),因此要实现动态的障碍物构建,我们还得再增加一个障碍物数组做为当前游戏游戏中相对于主角的动态障碍物数组,以下为这两个障碍物数组的定义:
byte[,] FixedObstruction = new byte[1024, 1024], VaryObstruction;
其中FixedObstruction即为前面章节中的Matrix,这里为了方便理解,我将之重新命了名。
那么如何定义精灵的角底的障碍物区域呢?我们还得为精灵控件添加如下两个属性:
// 获取或设置脚底示为障碍物区域扩展宽度
public int HoldWidth { get; set; }
// 获取或设置脚底示为障碍物区域扩展高度
public int HoldHeight { get; set; }
这两个属性分别代表以精灵脚底坐标(即它的X,Y)为中心,拓展的宽度与高度(见下图)。
在本节实例中我将所有精灵的HoldWidth均设置为1,HoldHeight设置为0;这样所有精灵的脚底障碍物区域即为上图中左数第二个精灵所示区域。
定义好精灵脚底障碍物区域后,我们同样还需要对目前的障碍物预测方法进行相应的调整。此时在预测障碍物的时候就必须首先排除自身精灵占据的障碍物区域,然后以该区域边缘点来取代原先的障碍物预测点(关于障碍物预测点可以参考第二十节)。下面我以精灵向左方向移动为例,该方向的障碍物预测需要进行如下改进:
private bool WillCollide() {
switch ((int)Leader.Direction) {
case 6:
return VaryObstruction[
(int)(Leader.X / GridSizeX) - Leader.HoldWidth - 1,
(int)(Leader.Y / GridSizeY)
]
== 0 ? true : false;
}
}
黄色部分代码为在原先基础上新添加的部分,通过它拓展了障碍物预测区域。下图为该例子演示图: