除战斗范围设定外,说到SLG中最有趣而经典的算法莫过于角色可移动范围的测算与寻路。当前成熟的SLG商业游戏中,以《火焰纹章》、《高级大战争》等系列新作为代表,它们在传统的基础上将可移动范围进行了拓展,组合上攻击范围并配合移动指向路径箭头,使得整场战局每个“棋子”的操控感受和趣味性都无与伦比。
SLG角色移动从程序设计的角度可大致分为3个步骤:
1)呈现可移动路径范围
2)确定移动目的地单元格
3)沿着路径移动到目的地
以四向为基础的Silverlight 2D SLG游戏,我们首先想到的当然是采用四叉树遍历算法来实现其中的角色可移动路径范围测算。
不要被它的行头所吓到,其实它只是一种很简单的四向延展循环遍历,我们不妨先来看下图:
每个角色以其所处的格子(坐标)为中心,第一步可移动的格子只有:北、东、南、西;那么要测算其可移动范围,首先得分析周围这4个格子角色是否可以移动到,其中判断的依据有地形矩阵边界、机动力极限(或四叉树深度)以及地形机动力消耗等元素;如果判断为可行,则将此格子进行标记(存储进可移动范围List<Point>表中);接下来再以同样的步骤,分别以这些被标记过的格子为中心,继续四向延伸遍历 (以减去当前单元格机动力消耗为基础);额外的,此时除了判断是否可以移动外,还需判断子节点是否有效(List中是否存在重复,Path是否回头等逻辑)。于是,最终我们可以得出类似如下算法:
/// <summary>
/// 显示可移动范围路径
/// </summary>
public void ShowPathRange(Sprite sprite) {
sprite.PathRange.Clear();
ClearAllRange();
Dictionary<Point2D, int> rangeList = new Dictionary<Point2D, int>();
Dictionary&l
/// 显示可移动范围路径
/// </summary>
public void ShowPathRange(Sprite sprite) {
sprite.PathRange.Clear();
ClearAllRange();
Dictionary<Point2D, int> rangeList = new Dictionary<Point2D, int>();
Dictionary&l