Exemple #1
0
        public void UpdateTransparent(int x, int y, int r)
        {
            FogTransparentRange rangeData = null;

            if (!fogRangeDic.ContainsKey(r))
            {
                rangeData       = new FogTransparentRange(r);
                fogRangeDic [r] = rangeData;
            }
            else
            {
                rangeData = fogRangeDic [r];
            }
            /// 先求取视野范围内的有效坐标
            /// 即根据视点坐标求出视野范围内有效用于战场的尺寸范围
            /// 有效坐标奉行小闭大开原则
            //if (x - r >= 0) {
            //	vl = 0;
            //} else {
            //	vl = r - x;
            //}
            int view_l = (x - r >= 0) ? 0 : (r - x);
            //if (x + r < w) {
            //	vr = 2 * r + 1;
            //} else {
            //	vr = r - x + w;
            //}
            int view_r = (x + r < w) ? (2 * r + 1) : (r - x + w);
            //if (y - r >= 0) {
            //	vt = 0;
            //} else {
            //	vt = r - y;
            //}
            int view_t = (y - r >= 0) ? 0 : (r - y);
            //if (y + r < h) {
            //	vb = 2 * r + 1;
            //} else {
            //	vb = r - y + h;
            //}
            int view_b    = (y + r < h) ? (2 * r + 1) : (r - y + h);
            int view_lt_x = x - r;
            int view_lt_y = y - r;


            /// 操作九宫格四边 上(y值为0开始)
            _UpdateTransparentTop(rangeData, view_lt_x, view_lt_y, view_l, view_r, view_t, view_b);
            /// 操作九宫格四边 左(x值为0开始)
            _UpdateTransparentLeft(rangeData, view_lt_x, view_lt_y, view_l, view_r, view_t, view_b);

            /// 操作九宫格中心全部为透明区域
            _UpdateTransparentCenter(rangeData, view_lt_x, view_lt_y, view_l, view_r, view_t, view_b);

            /// 操作九宫格四边 右
            _UpdateTransparentRight(rangeData, view_lt_x, view_lt_y, view_l, view_r, view_t, view_b);
            /// 操作九宫格四边 下
            _UpdateTransparentBottom(rangeData, view_lt_x, view_lt_y, view_l, view_r, view_t, view_b);

            /// 忽略九宫格四角
        }
Exemple #2
0
        private void _UpdateTransparentCenter(FogTransparentRange rangeData,
                                              int view_lt_x, int view_lt_y,
                                              int view_left, int view_right, int view_top, int view_bottom)
        {
            int xMin = Max(view_left, rangeData.l);
            int xMax = Min(view_right, rangeData.r + 1);
            int yMin = Max(view_top, rangeData.t);
            int yMax = Min(view_bottom, rangeData.b + 1);

            if (xMin < xMax && yMin < yMax)
            {
                for (int i = xMin, j = 0; i < xMax; i++)
                {
                    for (j = yMin; j < yMax; j++)
                    {
                        SetTransparent(view_lt_x + i, view_lt_y + j);
                    }
                }
            }
        }