Example #1
0
    void UpdateCheckList()
    {
        while (m_checkListMap.Count != 0)
        {
            Dictionary <IntVec3, CubeBrick> .Enumerator _enum = m_checkListMap.GetEnumerator();
            bool _b = _enum.MoveNext();
            KeyValuePair <IntVec3, CubeBrick> _it = _enum.Current;
            CubeBrick _cb = _it.Value;

            //如果为独立brick,无任何连接方向
            if (_cb.m_dirP == NoDir && _cb.m_dirN == NoDir)
            {
                IntVec3 _upIdx = _cb.GetPY();
                if (m_buildBrickMap.ContainsKey(_upIdx))
                {
                    m_checkListMap.Add(_upIdx, m_buildBrickMap[_upIdx]);
                }
                DetachBrick(_cb);
                break;
            }

            //如果为Y轴正方向
            if (_cb.m_dirP == PYAxis)
            {
                if (_cb.m_neighbour[_cb.m_dirP] != null)  //非Y轴最顶层
                {
                    m_checkListMap.Add(_cb.m_neighbour[_cb.m_dirP].GetIdx(), _cb.m_neighbour[_cb.m_dirP]);
                }
                else //为Y抽最顶层
                {
                    IntVec3 _upIdx = _cb.GetPY();
                    if (m_buildBrickMap.ContainsKey(_upIdx))
                    {
                        m_checkListMap.Add(_upIdx, m_buildBrickMap[_upIdx]);
                    }
                }

                DetachBrick(_cb);
                continue;
            }

            //如果为非Y轴队列:先检查每个brick下面是否存在支撑点,如果一个支撑点都没有,则detach改队列所有brick
            bool             _hasPillar  = false;
            List <CubeBrick> _brickGroup = new List <CubeBrick>();
            IntVec3          _downIdx    = _cb.GetNY();

            //首先检查当前brick下面是否存在支撑点
            if (m_buildBrickMap.ContainsKey(_downIdx))
            {
                _hasPillar = true;
            }
            else
            {
                _brickGroup.Add(_cb); //加入当前cubebrick
            }
            if (_hasPillar == false)
            {
                CubeBrick _cbNgb = _cb.m_neighbour[_cb.m_dirP];
                //检查正方向
                while (_cbNgb != null)
                {
                    _downIdx = _cbNgb.GetNY();
                    if (m_buildBrickMap.ContainsKey(_downIdx))
                    {
                        _hasPillar = true;
                        break;
                    }
                    else
                    {
                        _brickGroup.Add(_cbNgb);
                        _cbNgb = _cbNgb.m_neighbour[_cbNgb.m_dirP];
                    }
                }

                //检查负方向
                if (_hasPillar == false)
                {
                    _cbNgb = _cb.m_neighbour[_cb.m_dirN];
                    while (_cbNgb != null)
                    {
                        _downIdx = _cbNgb.GetNY();
                        if (m_buildBrickMap.ContainsKey(_downIdx))
                        {
                            _hasPillar = true;
                            break;
                        }
                        else
                        {
                            _brickGroup.Add(_cbNgb);
                            _cbNgb = _cbNgb.m_neighbour[_cbNgb.m_dirN];
                        }
                    }
                }
            }

            if (_hasPillar == false)
            {
                foreach (CubeBrick _brick in _brickGroup)
                {
                    m_buildBrickMap.Remove(_brick.GetIdx());
                    DetachBrick(_brick);
                    IntVec3 _upIdx = _brick.GetPY();
                    if (m_buildBrickMap.ContainsKey(_upIdx))
                    {
                        m_checkListMap.Add(_upIdx, m_buildBrickMap[_upIdx]);
                    }
                }
            }

            m_checkListMap.Remove(_cb.GetIdx());
        }
        //yield return 0;
    }