Ejemplo n.º 1
0
    /// <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);
        }
    }
Ejemplo n.º 2
0
    /// <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);
            }
        }
    }
Ejemplo n.º 3
0
    /// <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();
    }