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); /// 忽略九宫格四角 }
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); } } } }