SunsetHigh.FreeMovingSprite.moveDirectionHelper C# (CSharp) Method

moveDirectionHelper() private method

private moveDirectionHelper ( Direction dir, float speed, float elapsed, bool collide = true ) : bool
dir Direction
speed float
elapsed float
collide bool
return bool
        private bool moveDirectionHelper(Direction dir, float speed, float elapsed, bool collide = true)
        {
            Point l_offset = new Point(0, 0);
            int distX = 0;
            int distY = 0;
            bool a, b;

            switch (dir)
            {
                case Direction.North:
                    pixelsRemainderY -= speed * elapsed;
                    distY = (int)pixelsRemainderY;
                    pixelsRemainderY -= distY;
                    break;
                case Direction.South:
                    pixelsRemainderY += speed * elapsed;
                    distY = (int)pixelsRemainderY;
                    pixelsRemainderY -= distY;
                    break;
                case Direction.East:
                    pixelsRemainderX += speed * elapsed;
                    distX = (int)pixelsRemainderX;
                    pixelsRemainderX -= distX;
                    break;
                case Direction.West:
                    pixelsRemainderX -= speed * elapsed;
                    distX = (int)pixelsRemainderX;
                    pixelsRemainderX -= distX;
                    break;

                case Direction.NorthWest:
                    a = this.moveDirectionHelper(Direction.North, speed * RAD2BY2, elapsed);
                    b = this.moveDirectionHelper(Direction.West, speed * RAD2BY2, elapsed);
                    return a || b;
                case Direction.NorthEast:
                    a = this.moveDirectionHelper(Direction.North, speed * RAD2BY2, elapsed);
                    b = this.moveDirectionHelper(Direction.East, speed * RAD2BY2, elapsed);
                    return a || b;
                case Direction.SouthWest:
                    a = this.moveDirectionHelper(Direction.South, speed * RAD2BY2, elapsed);
                    b = this.moveDirectionHelper(Direction.West, speed * RAD2BY2, elapsed);
                    return a || b;
                case Direction.SouthEast:
                    a = this.moveDirectionHelper(Direction.South, speed * RAD2BY2, elapsed);
                    b = this.moveDirectionHelper(Direction.East, speed * RAD2BY2, elapsed);
                    return a || b;
                default: break;
            }
            l_offset.Y = distY;
            l_offset.X = distX;

            if (!collide)
            {
                this.setX(this.getX() + l_offset.X);
                this.setY(this.getY() + l_offset.Y);
                return true;
            }

            IInteractable interactObj = CollisionManager.collisionWithInteractableAtRelative(this, l_offset, this);
            if (interactObj != null)
            {
                interactObj.onCollide(this);
                if (interactObj is Character)
                {
                    if ((l_offset.X == 0) != (l_offset.Y == 0))     //only one offset is zero (multiple cannot be handled yet)
                    {
                        return CollisionManager.setSpriteOutsideRectangle(this, interactObj.getBoundingRect());
                    }
                }
            }

            // collision checking here
            MapObject mapObj = CollisionManager.collisionWithObjectAtRelative(this, l_offset);
            if (mapObj != null)
            {
                if ((l_offset.X == 0) != (l_offset.Y == 0))     //only one offset is zero (multiple cannot be handled yet)
                {
                    return CollisionManager.setSpriteOutsideRectangle(this, mapObj.Bounds);
                }
            }

            //no collisions detected!
            this.setX(this.getX() + l_offset.X);
            this.setY(this.getY() + l_offset.Y);
            return true;
        }