Beispiel #1
0
        private void CastRay(int xOrig, int yOrig, int xDest, int yDest, int radiusSquared, bool lightWalls)
        {
            int  xCur    = xOrig;
            int  yCur    = yOrig;
            bool inMap   = false;
            bool blocked = false;
            bool end     = false;

            var lineData = new BresenhamLineData();

            InitLineData(xOrig, yOrig, xDest, yDest, lineData);

            if (xCur.Between(0, Width) && yCur.Between(0, Height))
            {
                inMap = true;
                Tiles[xCur, yCur].InView = true;
            }

            while (!end)
            {
                end = StepLineData(ref xCur, ref yCur, lineData);

                if (radiusSquared > 0)
                {
                    int curRadius = (xCur - xOrig) * (xCur - xOrig) + (yCur - yOrig) * (yCur - yOrig);

                    if (curRadius > radiusSquared)
                    {
                        return;
                    }
                }

                if (xCur.Between(0, Width) && yCur.Between(0, Height))
                {
                    inMap = true;
                    if (!blocked && !Tiles[xCur, yCur].Transparent)
                    {
                        blocked = true;
                    }
                    else if (blocked)
                    {
                        return;
                    }

                    if (lightWalls || !blocked)
                    {
                        Tiles[xCur, yCur].InView = true;
                    }
                }
                else if (inMap)
                {
                    return;
                }
            }
        }
Beispiel #2
0
        private void InitLineData(int xOrig, int yOrig, int xDest, int yDest, BresenhamLineData data)
        {
            data.OrigX  = xOrig;
            data.OrigY  = yOrig;
            data.DestX  = xDest;
            data.DestY  = yDest;
            data.DeltaX = xDest - xOrig;
            data.DeltaY = yDest - yOrig;

            if (data.DeltaX > 0)
            {
                data.StepX = 1;
            }
            else if (data.DeltaX < 0)
            {
                data.StepX = -1;
            }
            else
            {
                data.StepX = 0;
            }

            if (data.DeltaY > 0)
            {
                data.StepY = 1;
            }
            else if (data.DeltaY < 0)
            {
                data.StepY = -1;
            }
            else
            {
                data.StepY = 0;
            }

            if (data.StepX * data.DeltaX > data.StepY * data.DeltaY)
            {
                data.E       = data.StepX * data.DeltaX;
                data.DeltaX *= 2;
                data.DeltaY *= 2;
            }
            else
            {
                data.E       = data.StepY * data.DeltaY;
                data.DeltaX *= 2;
                data.DeltaY *= 2;
            }
        }
Beispiel #3
0
        private bool StepLineData(ref int xCur, ref int yCur, BresenhamLineData data)
        {
            if (data.StepX * data.DeltaX > data.StepY * data.DeltaY)
            {
                if (data.OrigX == data.DestX)
                {
                    return(true);
                }

                data.OrigX += data.StepX;
                data.E     -= data.StepY * data.DeltaY;

                if (data.E < 0)
                {
                    data.OrigY += data.StepY;
                    data.E     += data.StepX * data.DeltaX;
                }
            }
            else
            {
                if (data.OrigY == data.DestY)
                {
                    return(true);
                }

                data.OrigY += data.StepY;
                data.E     -= data.StepX * data.DeltaX;

                if (data.E < 0)
                {
                    data.OrigX += data.StepX;
                    data.E     += data.StepY * data.DeltaY;
                }
            }

            xCur = data.OrigX;
            yCur = data.OrigY;

            return(false);
        }