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;
}