Exemplo n.º 1
0
        public GridPoint2D(EDirection2D direction, int length = 1)
        {
            X = 0;
            Y = 0;

            switch (direction)
            {
            case EDirection2D.Up:
                Y = length;
                break;

            case EDirection2D.Down:
                Y = -length;
                break;

            case EDirection2D.Left:
                X = -length;
                break;

            case EDirection2D.Right:
                X = length;
                break;

            default:
                throw new NotImplementedException();
            }
        }
Exemplo n.º 2
0
        public GridPoint2D Translate(EDirection2D direction, int distance)
        {
            switch (direction)
            {
            case EDirection2D.Up:
                return(new GridPoint2D(X, Y + distance));

            case EDirection2D.Down:
                return(new GridPoint2D(X, Y - distance));

            case EDirection2D.Right:
                return(new GridPoint2D(X + distance, Y));

            case EDirection2D.Left:
                return(new GridPoint2D(X - distance, Y));

            default:
                throw new NotImplementedException();
            }
        }
Exemplo n.º 3
0
 public static EGridAxis2D ToAxis(this EDirection2D direction)
 {
     return(m_Axes[(int)direction]);
 }
Exemplo n.º 4
0
 public static EDirection2D GetOpposite(this EDirection2D direction)
 {
     return(m_Opposite[(int)direction]);
 }
Exemplo n.º 5
0
        public static int Raycast(float startX, float startY, float directionX, float directionY, GridHit2D[] hitBuffer)
        {
            int stepX = Math.Sign(directionX);
            int stepY = Math.Sign(directionY);

            if (stepX == 0 && stepY == 0)
            {
                return(0);
            }

            int bufferSize = hitBuffer.Length;

            int currentX = (int)Math.Floor(startX);
            int currentY = (int)Math.Floor(startY);

            currentX = Math.Max(currentX, 0);
            currentY = Math.Max(currentY, 0);

            float nextBoundX = CalculateBound(currentX, startX, stepX);
            float nextBoundY = CalculateBound(currentY, startY, stepY);

            float deltaX = (1f / directionX) * stepX;
            float deltaY = (1f / directionY) * stepY;

            float travelX = nextBoundX / directionX;
            float travelY = nextBoundY / directionY;

            int iterator = 0;

            EDirection2D xExitFace = (stepX > 0 ? EDirection2D.Left : EDirection2D.Right);
            EDirection2D yExitFace = (stepY > 0 ? EDirection2D.Down : EDirection2D.Up);

            EDirection2D selectedFace;
            float        startDecimalX = startX - (float)Math.Truncate(startX);
            float        startDecimalY = startY - (float)Math.Truncate(startY);

            if (startDecimalX < startDecimalY)
            {
                selectedFace = (directionX > 0 ? EDirection2D.Left : EDirection2D.Right);
            }
            else
            {
                selectedFace = (directionY > 0 ? EDirection2D.Down : EDirection2D.Up);
            }

            while (iterator < bufferSize)
            {
                GridPoint2D point = new GridPoint2D(currentX, currentY);
                if (travelX < travelY)
                {
                    hitBuffer[iterator++] = new GridHit2D(point, selectedFace);
                    selectedFace          = xExitFace;

                    currentX += stepX;
                    travelX  += deltaX;
                }
                else
                {
                    hitBuffer[iterator++] = new GridHit2D(point, selectedFace);
                    selectedFace          = yExitFace;

                    currentY += stepY;
                    travelY  += deltaY;
                }
            }

            return(iterator);
        }
Exemplo n.º 6
0
 public GridHit2D(GridPoint2D point, EDirection2D face)
 {
     Point = point;
     Face  = face;
 }