private void Collision(Dynamic o1, GameObject o2)
{
Rectangle bb1 = o1.GetBoundingBox();
Rectangle bb2 = o2.GetBoundingBox();
if (bb1.Intersects(bb2))
{
//Calculate how far you would need to move
//in each direction to get out
int left = Math.Abs(bb1.Right - bb2.Left);
int top = Math.Abs(bb1.Bottom - bb2.Top);
int right = Math.Abs(bb1.Left - bb2.Right);
int bot = Math.Abs(bb1.Top - bb2.Bottom);
if (top < bot)
{
if (left < right)
{
//Send collision message
o1.OnCollision(o2, top < left ? Direction.S : Direction.E);
if (o2 is Dynamic)
{
//Send collision message
Dynamic do2 = (Dynamic)o2;
do2.OnCollision(o1, top < left ? Direction.N : Direction.W);
}
if (!(o2 is HitBox))
{
if (top < left)
{
o1.SetPos(new Vector2(o1.Pos.X, o1.Pos.Y - top));
//do2.SetPos(new Vector2(do2.Pos.X, do2.Pos.Y + top / 2.0f));
}
else
{
o1.SetPos(new Vector2(o1.Pos.X - left, o1.Pos.Y));
//do2.SetPos(new Vector2(do2.Pos.X + left / 2.0f, do2.Pos.Y));
}
}
}
else
{
o1.OnCollision(o2, top < right ? Direction.S : Direction.W);
if (o2 is Dynamic)
{
Dynamic do2 = (Dynamic)o2;
do2.OnCollision(o1, top < right ? Direction.N : Direction.E);
}
if (!(o2 is HitBox))
{
if (top < right)
{
o1.SetPos(new Vector2(o1.Pos.X, o1.Pos.Y - top));
//do2.SetPos(new Vector2(do2.Pos.X, do2.Pos.Y + top / 2.0f));
}
else
{
o1.SetPos(new Vector2(o1.Pos.X + right, o1.Pos.Y));
//do2.SetPos(new Vector2(do2.Pos.X - right / 2.0f, do2.Pos.Y));
}
}
}
}
else
{
if (left < right)
{
o1.OnCollision(o2, bot < left ? Direction.N : Direction.E);
if (o2 is Dynamic)
{
Dynamic do2 = (Dynamic)o2;
do2.OnCollision(o1, bot < left ? Direction.S : Direction.W);
}
if (!(o2 is HitBox))
{
if (bot < left)
{
o1.SetPos(new Vector2(o1.Pos.X, o1.Pos.Y + bot));
//do2.SetPos(new Vector2(do2.Pos.X, do2.Pos.Y - bot / 2.0f));
}
else
{
o1.SetPos(new Vector2(o1.Pos.X - left, o1.Pos.Y));
//do2.SetPos(new Vector2(do2.Pos.X + left / 2.0f, do2.Pos.Y));
}
}
}
else
{
o1.OnCollision(o2, bot < right ? Direction.N : Direction.W);
if (o2 is Dynamic)
{
Dynamic do2 = (Dynamic)o2;
do2.OnCollision(o1, bot < right ? Direction.S : Direction.E);
}
if (!(o2 is HitBox))
{
if (bot < right)
{
o1.SetPos(new Vector2(o1.Pos.X, o1.Pos.Y + bot));
//do2.SetPos(new Vector2(do2.Pos.X, do2.Pos.Y - bot / 2.0f));
}
else
{
o1.SetPos(new Vector2(o1.Pos.X + right, o1.Pos.Y));
//do2.SetPos(new Vector2(do2.Pos.X - right / 2.0f, do2.Pos.Y));
}
}
}
}
/*
if (left > 0 && left < (bb1.Width + bb2.Width) && top > 0 && top < (bb1.Height + bb2.Height))
{
bool l = left < (bb1.Width + bb2.Width) / 2;
bool t = top < (bb1.Height + bb2.Height) / 2;
int xDist = l ? left : (bb1.Width + bb2.Width) - left;
int yDist = t ? top : (bb1.Height + bb2.Height) - top;
if (xDist > yDist)
{
o1.OnCollision(o2, t ? Direction.N : Direction.S);
}
else
{
o1.OnCollision(o2, l ? Direction.W : Direction.E);
}
}
*/
}
}