/// <summary> /// 处理扇区边缘的tile /// </summary> /// <param name="ms">所在扇区</param> /// <param name="side">所在边</param> private static void ProcessSideTile(LowSector ms, Side side) { MapSector neighbourms = g_map.Findneighbour(ms, side); if (neighbourms != null) { if (g_map.SectorLevelNum > 1) { MapSector high1 = ms.GetParentMapSector(g_map); MapSector high2 = neighbourms.GetParentMapSector(g_map); // 还是高级扇区的边缘。 if (high1 != high2) { NeighbourSector nb = new NeighbourSector(); if (ms.ID < neighbourms.ID) { nb.side = side; nb.A = high1; nb.B = high2; } else { nb.side = Util.FlipDirection(side); nb.A = high2; nb.B = high1; } if (!g_sectorEdgeChangesHighLevel.Contains(nb)) { g_sectorEdgeChangesHighLevel.Add(nb); } } } // if (g_sectorEdgeChangesLowLevel.ContainsKey(neighbourms as LowSector)) { if (g_sectorEdgeChangesLowLevel[neighbourms as LowSector].Contains(Util.FlipDirection(side))) // other side already filled in { if (!g_sectorChanges.Contains(ms as LowSector)) // other sector exist and the side. add our sector for general change { g_sectorChanges.Add(ms as LowSector); } } else if (!g_sectorEdgeChangesLowLevel[ms as LowSector].Contains(side)) // other sector exist but not the side. add our sector for Edge change { g_sectorEdgeChangesLowLevel[ms as LowSector].Add(side); } } else// other sector not (yet? )added. add ourselves and other sector for genral change { if (!g_sectorChanges.Contains(neighbourms as LowSector)) { g_sectorChanges.Add(neighbourms as LowSector); } if (!g_sectorEdgeChangesLowLevel[ms].Contains(side)) { g_sectorEdgeChangesLowLevel[ms].Add(side); } } } else if (!g_sectorEdgeChangesLowLevel[ms as LowSector].Contains(side))// other sector does not exist, add ourselves { g_sectorEdgeChangesLowLevel[ms as LowSector].Add(side); } }
/// <summary> /// 分析影响到的扇区 /// </summary> /// <param name="tile"></param> private static void ParseChangeSector(MapTile tile) { if (tile == null) { return; } LowSector ms = g_map.FindMapSector(0, tile.sectorIndex) as LowSector; if (ms == null) { return; } // 是否为边上的点 bool tileOnEdge = false; if (!g_sectorEdgeChangesLowLevel.ContainsKey(ms)) { g_sectorEdgeChangesLowLevel.Add(ms, new List <Side>()); } if (tile.Pos.y == ms.top && ms.top != 0) //top { tileOnEdge = true; if (!g_sectorEdgeChangesLowLevel[ms].Contains(Side.Top)) { ProcessSideTile(ms, Side.Top); } } if (tile.Pos.y == ms.bottom && ms.Pos.y < g_map.levelDimensions[0].numHeight - 1) { tileOnEdge = true; if (!g_sectorEdgeChangesLowLevel[ms].Contains(Side.Down)) { ProcessSideTile(ms, Side.Down); } } if (tile.Pos.x == ms.left && ms.left != 0)//left { tileOnEdge = true; if (!g_sectorEdgeChangesLowLevel[ms].Contains(Side.Left)) { ProcessSideTile(ms, Side.Left); } } if (tile.Pos.x == ms.right && ms.Pos.y < g_map.levelDimensions[0].numWidth - 1) //right { tileOnEdge = true; if (!g_sectorEdgeChangesLowLevel[ms].Contains(Side.Right)) { ProcessSideTile(ms, Side.Right); } } if (!tileOnEdge) { if (!g_sectorChanges.Contains(ms as LowSector)) { g_sectorChanges.Add(ms as LowSector); } } }
/// <summary> /// 构建地图 /// </summary> private void BuildMap() { // 构建tile tileArray = new MapTile[TileYnum][]; for (short y = 0; y < TileYnum; y++) { tileArray[y] = new MapTile[TileXnum]; for (short x = 0; x < TileXnum; x++) { MapTile tile = new MapTile(); tile.Pos = new IntVector2(x, y); tile.SetSectorIndex(TileXnum, TileYnum, SectorSize); tile.integrationValue = TileHelp.tileResetIntegrationValue; tileArray[y][x] = tile; } } ushort sectorWidth = SectorSize; ushort sectorHeight = SectorSize; // SectorLevelWayPointLink = new Dictionary <MapTile, PathNode> [SectorLevelNum]; lookUpLowerSectors = new SectorIndexList[SectorLevelNum - 1][]; levelDimensions = new SectorLevelInfo[SectorLevelNum]; sectorArray = new MapSector[SectorLevelNum][]; for (ushort level = 0; level < SectorLevelNum; level++) { SectorLevelWayPointLink[level] = new Dictionary <MapTile, PathNode>(); levelDimensions[level] = new SectorLevelInfo(sectorWidth, sectorHeight, (ushort)(Mathf.CeilToInt((TileXnum / (float)sectorWidth))), (ushort)(Mathf.CeilToInt((TileYnum / (float)sectorHeight)))); sectorArray[level] = new MapSector[levelDimensions[level].numWidth * levelDimensions[level].numHeight]; for (short i = 0; i < levelDimensions[level].numHeight; i++) { for (short j = 0; j < levelDimensions[level].numWidth; j++) { int index = (i * levelDimensions[level].numWidth) + j; if (level == 0) { sectorArray[level][index] = new LowSector(); } else { sectorArray[level][index] = new HighSector(); } sectorArray[level][index].Pos = new IntVector2(j, i); sectorArray[level][index].ID = (ushort)index; sectorArray[level][index].level = level; sectorArray[level][index].top = (ushort)(i * levelDimensions[level].sectorWidth); sectorArray[level][index].bottom = (ushort)(i * levelDimensions[level].sectorWidth + levelDimensions[level].sectorWidth - 1); sectorArray[level][index].left = (ushort)(j * levelDimensions[level].sectorHeight); sectorArray[level][index].right = (ushort)(j * levelDimensions[level].sectorHeight + levelDimensions[level].sectorHeight - 1); sectorArray[level][index].tilesInWidth = (ushort)(Mathf.Min(TileXnum - sectorArray[level][index].left, levelDimensions[level].sectorWidth)); sectorArray[level][index].tilesInHeight = (ushort)(Mathf.Min(TileYnum - sectorArray[level][index].top, levelDimensions[level].sectorHeight)); sectorArray[level][index].Init(); } } // hight level 包含更多的格子数 sectorWidth *= SectorlevelScale; sectorHeight *= SectorlevelScale; if (level > 0) { lookUpLowerSectors[level - 1] = new SectorIndexList[sectorArray[level].Length]; } } FillInLookUpLowerSectors(); }