void CalculateMovement(float frameTime)
{
Vector2 previousPos = Position;
Velocity.X = MathHelper.Clamp(Velocity.X + horizontalAcceleration * frameTime * movement, -maxHorizontalSpeed, maxHorizontalSpeed);
if (onGround)
Velocity.X *= horizontalDragGround;
else
Velocity.X *= horizontalDragAir;
Velocity.Y = MathHelper.Clamp(Velocity.Y + verticalAcceleration * frameTime, -maxVerticalSpeed, maxVerticalSpeed);
if (onGround)
Velocity.Y = DoJump();
DoCollisions();
if (previousPos.X == Position.X)
Velocity.X = 0;
if (previousPos.Y == Position.Y)
Velocity.Y = 0;
}
float DoJump()
{
if (World.renderWindow.Input.IsKeyDown(KeyCode.Space))
return -10;
else
return Velocity.Y;
}
void DoCollisions()
{
onGround = false;
Position.Y += Velocity.Y;
Vector2 tileCollision = GetTileCollision();
if (tileCollision.X != -1 || tileCollision.Y != -1)
{
Vector2 collisionDepth = CollisionRectangle.DepthIntersection(
new Rectangle(
tileCollision.X * World.tileEngine.TileWidth,
tileCollision.Y * World.tileEngine.TileHeight,
World.tileEngine.TileWidth,
World.tileEngine.TileHeight
)
);
Position.Y += collisionDepth.Y;
if (collisionDepth.Y < 0)
onGround = true;
}
Position.X += Velocity.X;
tileCollision = GetTileCollision();
if (tileCollision.X != -1 || tileCollision.Y != -1)
{
Vector2 collisionDepth = CollisionRectangle.DepthIntersection(
new Rectangle(
tileCollision.X * World.tileEngine.TileWidth,
tileCollision.Y * World.tileEngine.TileHeight,
World.tileEngine.TileWidth,
World.tileEngine.TileHeight
)
);
Position.X += collisionDepth.X;
}
}
Vector2 GetTileCollision()
{
int topLeftTileX = (int)(CollisionRectangle.TopLeft.X / World.tileEngine.TileWidth);
int topLeftTileY = (int)(CollisionRectangle.TopLeft.Y / World.tileEngine.TileHeight);
int BottomRightTileX = (int)(CollisionRectangle.DownRight.X / World.tileEngine.TileWidth);
int BottomRightTileY = (int)(CollisionRectangle.DownRight.Y / World.tileEngine.TileHeight);
if (CollisionRectangle.DownRight.Y % World.tileEngine.TileHeight == 0)
BottomRightTileY -= 1;
if (CollisionRectangle.DownRight.X % World.tileEngine.TileWidth == 0)
BottomRightTileX -= 1;
for (int i = topLeftTileX; i <= BottomRightTileX; i++)
{
for (int j = topLeftTileY; j <= BottomRightTileY; j++)
{
if (World.tileEngine.TileIsSolid(i, j))
{
return new Vector2(i,j);
}
}
}
return new Vector2(-1,-1);
}