Exemplo n.º 1
0
    /// <summary>
    /// 填充地表建筑数据(0为清除)
    /// </summary>
    /// <param name="entity"></param>
    /// <param name="value"></param>
    private void FillBuildingMapData(TileEntity entity, int entity_id)
    {
        if (!EntityTypeUtil.IsCostMapGrid(entity.entityType))
        {
            return;
        }
        int x = entity.GetTilePos().x;
        int y = entity.GetTilePos().y;
        //  填充建筑全部区域
        int w = entity.width;
        int h = entity.height;

        for (int i = x; i < x + w; ++i)
        {
            for (int j = y; j < y + h; ++j)
            {
                m_buildingMap[i, j] = entity_id;
            }
        }

        //  填充建筑不可通行区域(blockingRange最大值为边数减1,所以不会导致建筑边上的entity_id重合。)
        int blocking = entity.blockingRange;

        if (blocking > 0)
        {
            int offset_x = (int)((w + 1 - blocking) / 2);
            int offset_y = (int)((h + 1 - blocking) / 2);
            Assert.Should(offset_x >= 1 && offset_y >= 1, "Entity的blockingRange不正确...");
            for (int i = x + offset_x; i < x + offset_x + blocking; ++i)
            {
                for (int j = y + offset_y; j < y + offset_y + blocking; ++j)
                {
                    m_routeMap[i, j].EntityID = entity_id;
                }
            }
        }

        //  更新墙之间的连接器 并 刷新墙的方向(显示用)
        if (entity.entityType == EntityType.Wall)
        {
            RefreshWallLinkerAndDirection(entity, entity_id);
        }
    }