示例#1
0
        /// <summary>
        /// 计算并存储所有被照亮的边缘
        /// </summary>
        public void CalcLightedEdges(List<GameObject> wallTiles, Vector2 lightPos)
        {
            Init(wallTiles);

            //1.基于edge中点与光源的距离与所在tile与光源的距离,筛出朝向光源的edge
            for (int i = 0; i < _listEdges.Count; i++)
            {
                if (_listEdges[i].CalcLightDistance(lightPos))
                {
                    _listLightedEdges.Add(_listEdges[i]);
                }
            }

            //2.移除两个块之间夹着的edge
            CleanInsideEdges();

            //3.按照edge之间的相连关系,设置他们的prev和next
            for (int i = 0; i < _listLightedEdges.Count; i++)
            {
                Edge edge = _listLightedEdges[i];
                for (int j = 0; j < _listLightedEdges.Count; j++)
                {
                    Edge another = _listLightedEdges[j];
                    if (edge.PointEnd.Equals(another.PointStart))
                    {
                        edge.Next = another;
                        another.Prev = edge;
                        break;
                    }
                }
            }

            //4.按distance由近及远排序
            _listLightedEdges.Sort((x, y) =>
            {
                if (x.Distance < y.Distance) return -1;
                if (x.Distance > y.Distance) return 1;
                return 0;
            });

            //5.进行射线切割
            SliceEdges(lightPos);

            //6.清理无头无尾的edge
            CleanIsolatedEdges();

            if (action != null)
            {
                DataShadow data = new DataShadow
                {
                    LightedEdges = _listLightedEdges.ToArray()
                };
                action(data);
            }
        }
示例#2
0
 public void OnReceiveShadowData(DataShadow data)
 {
     _data = data;
     UpdateLineParams();
 }
示例#3
0
        /// <summary>
        /// 计算并存储所有被照亮的边缘
        /// </summary>
        public void CalcLightedEdges(List <GameObject> wallTiles, Vector2 lightPos)
        {
            Init(wallTiles);

            //1.基于edge中点与光源的距离与所在tile与光源的距离,筛出朝向光源的edge
            for (int i = 0; i < _listEdges.Count; i++)
            {
                if (_listEdges[i].CalcLightDistance(lightPos))
                {
                    _listLightedEdges.Add(_listEdges[i]);
                }
            }

            //2.移除两个块之间夹着的edge
            CleanInsideEdges();

            //3.按照edge之间的相连关系,设置他们的prev和next
            for (int i = 0; i < _listLightedEdges.Count; i++)
            {
                Edge edge = _listLightedEdges[i];
                for (int j = 0; j < _listLightedEdges.Count; j++)
                {
                    Edge another = _listLightedEdges[j];
                    if (edge.PointEnd.Equals(another.PointStart))
                    {
                        edge.Next    = another;
                        another.Prev = edge;
                        break;
                    }
                }
            }

            //4.按distance由近及远排序
            _listLightedEdges.Sort((x, y) =>
            {
                if (x.Distance < y.Distance)
                {
                    return(-1);
                }
                if (x.Distance > y.Distance)
                {
                    return(1);
                }
                return(0);
            });

            //5.进行射线切割
            SliceEdges(lightPos);

            //6.清理无头无尾的edge
            CleanIsolatedEdges();

            if (action != null)
            {
                DataShadow data = new DataShadow
                {
                    LightedEdges = _listLightedEdges.ToArray()
                };
                action(data);
            }
        }
示例#4
0
 public void OnReceiveShadowData(DataShadow data)
 {
     _data = data;
     UpdateLineParams();
 }