public void _CreateSpaceSpanGroup(SolidSpanGroup solidSpanGroup) { Dictionary <int, LinkedList <SolidSpan> > soildSpanDict = solidSpanGroup.soildSpanDict; LinkedList <SolidSpan> solidSpanList; SpaceSpan spaceSpan; int[] cellIdxs; Vector3d[] voxRect; CellSpaceSpans cellSpaceSpans; List <SpaceSpan> spaceSpanList; double startpos; double endpos; foreach (var item in soildSpanDict) { cellIdxs = solidSpanGroup.GetCellIdxs(item.Key); voxRect = voxSpace.GetFloorGridCellRect(cellIdxs[0], cellIdxs[1]); solidSpanList = item.Value; var node = solidSpanList.First; cellSpaceSpans = new CellSpaceSpans(); spaceSpanList = new List <SpaceSpan>(); cellSpaceSpans.spaceSpanList = spaceSpanList; cellSpaceSpans.rect = voxRect; for (; node != null; node = node.Next) { startpos = node.Value.endPos; if (node.Next != null) { endpos = node.Next.Value.startPos; } else { endpos = startpos + 1000000; } if (endpos - startpos >= minWalkHeight) { spaceSpan = new SpaceSpan(); spaceSpan.startPos = startpos; spaceSpan.endPos = endpos; spaceSpan.cellSpaceSpans = cellSpaceSpans; spaceSpan.connectSpan = new SpaceSpan[] { null, null, null, null }; spaceSpanList.Add(spaceSpan); } } spaceSpanDict[item.Key] = cellSpaceSpans; } }
/// <summary> /// 根据障碍方向,和角色行走半径,给当前span上的角色半径范围内不可移动的周边spans作标记 /// </summary> /// <param name="spanIdx"></param> /// <param name="span"></param> /// <param name="obstacleDir">以当前span为中心,按左手顺时针: 0← 1↑ 2→ 3↓</param> void SetNotWalkSpansByObstacleDir(int[] spanIdx, SpaceSpan span, int obstacleDir) { int x, y; int flag = 1; if (obstacleDir == 2 || obstacleDir == 3) { flag = -1; } double limitEndPosY = span.startPos + minWalkHeight; switch (obstacleDir) { case 0: case 2: { for (int i = 0; i < walkRadiusVoxCount; i++) { x = spanIdx[0] + i * flag; SetNotWalkSpans(x, spanIdx[1], span.startPos, limitEndPosY); for (int j = 0; j <= i + 1; j++) { SetNotWalkSpans(x, spanIdx[1] - j, span.startPos, limitEndPosY); SetNotWalkSpans(x, spanIdx[1] + j, span.startPos, limitEndPosY); } } } break; case 1: case 3: { for (int i = 0; i < walkRadiusVoxCount; i++) { y = spanIdx[0] + i * flag; SetNotWalkSpans(spanIdx[0], y, span.startPos, limitEndPosY); for (int j = 1; j <= i + 1; j++) { SetNotWalkSpans(spanIdx[0] - j, y, span.startPos, limitEndPosY); SetNotWalkSpans(spanIdx[0] + j, y, span.startPos, limitEndPosY); } } } break; } }
void SplitOneRegion(SpaceSpan startSpan, int region) { SpaceSpan centerSpan, connectSpan; List <SpaceSpan> tmp; List <SpaceSpan> frontSpanlist = new List <SpaceSpan>(200); List <SpaceSpan> backSpanlist = new List <SpaceSpan>(200); frontSpanlist.Add(startSpan); while (frontSpanlist.Count > 0) { for (int i = 0; i < frontSpanlist.Count; i++) { centerSpan = frontSpanlist[i]; centerSpan.isEdge = false; for (int j = 0; j < 4; j++) { connectSpan = centerSpan.connectSpan[j]; if (connectSpan == null || connectSpan.region > 0 || connectSpan.type == 1) { centerSpan.isEdge = true; continue; } if (connectSpan.cellSpaceSpans.region == region) { centerSpan.isEdge = true; continue; } connectSpan.region = region; backSpanlist.Add(connectSpan); } } tmp = frontSpanlist; frontSpanlist = backSpanlist; backSpanlist = tmp; backSpanlist.Clear(); } }