//Clears the anti-duplicate buffer
collisionRecord.Clear();
//pick a thing
foreach (GameObject entity in entities)
{
//pick another thing
foreach (GameObject subject in entities)
{
//check to make sure both things aren't the same thing
if (!ReferenceEquals(entity, subject))
{
//check to see if thing2 is in semi-near proximity to thing1
if (entity.WideProximityArea.Intersects(subject.CollisionRectangle) ||
entity.WideProximityArea.Contains(subject.CollisionRectangle))
{
//check to see if thing2 and thing1 are colliding.
if (entity.CollisionRectangle.Intersects(subject.CollisionRectangle) ||
entity.CollisionRectangle.Contains(subject.CollisionRectangle) ||
subject.CollisionRectangle.Contains(entity.CollisionRectangle))
{
//check if we've already resolved their collision or not.
if (!collisionRecord.ContainsKey(entity.GetHashCode()))
{
//more duplicate resolution checking.
if (!collisionRecord.ContainsKey(subject.GetHashCode()))
{
//if thing1 is traveling right...
if (entity.Velocity.X > 0)
{
//if it isn't too far to the right...
if (subject.CollisionRectangle.Contains(new Microsoft.Xna.Framework.Rectangle(entity.CollisionRectangle.Right, entity.CollisionRectangle.Y, 1, entity.CollisionRectangle.Height)) ||
subject.CollisionRectangle.Intersects(new Microsoft.Xna.Framework.Rectangle(entity.CollisionRectangle.Right, entity.CollisionRectangle.Y, 1, entity.CollisionRectangle.Height)))
{
//Find how deep thing1 is intersecting thing2's collision box;
float offset = entity.CollisionRectangle.Right - subject.CollisionRectangle.Left;
//Move both things in opposite directions half the length of the intersection, pushing thing1 to the left, and thing2 to the right.
entity.Velocities.Add(new Vector2(-((offset * (float)gameTime.ElapsedGameTime.TotalMilliseconds)), 0));
subject.Velocities.Add(new Vector2(((offset * (float)gameTime.ElapsedGameTime.TotalMilliseconds)), 0));
}
}
//if thing1 is traveling left...
if (entity.Velocity.X < 0)
{
//if thing1 isn't too far left...
if (entity.CollisionRectangle.Contains(new Microsoft.Xna.Framework.Rectangle(subject.CollisionRectangle.Right, subject.CollisionRectangle.Y, 1, subject.CollisionRectangle.Height)) ||
entity.CollisionRectangle.Intersects(new Microsoft.Xna.Framework.Rectangle(subject.CollisionRectangle.Right, subject.CollisionRectangle.Y, 1, subject.CollisionRectangle.Height)))
{
//Find how deep thing1 is intersecting thing2's collision box;
float offset = subject.CollisionRectangle.Right - entity.CollisionRectangle.Left;
//Move both things in opposite directions half the length of the intersection, pushing thing1 to the right, and thing2 to the left.
entity.Velocities.Add(new Vector2(((offset * (float)gameTime.ElapsedGameTime.TotalMilliseconds)), 0));
subject.Velocities.Add(new Vector2(-((offset * (float)gameTime.ElapsedGameTime.TotalMilliseconds)), 0));
}
}
//Make record that thing1 and thing2 have interacted and the collision has been solved, so that if thing2 is picked next in the foreach loop, it isn't checked against thing1 a second time before the next update.
collisionRecord.Add(entity.GetHashCode(), subject.GetHashCode());
}
}
}
}
}
}
}
}
edit: sorry about the blob of code, it doesn't format very well in the forum. Anyways, any thoughts are appreciated.
This post has been edited by TheBroodian: 26 September 2012 - 02:22 PM

New Topic/Question
Reply


MultiQuote


|