public void HandlePlayer(Player p1, Wall w1) { if (p1 != null && w1 != null) { Rectangle p1Rect = p1.CollisionRectangle; Rectangle w1Rect = w1.CollisionRectangle; Vector2 p1Pos = p1.Position; Vector2 p2Pos = w1.Position; Vector2 penetrationDepth = RectangleExtensions.GetIntersectionDepth(p1Rect, w1Rect); penetrationDepth.X = Math.Abs(penetrationDepth.X); penetrationDepth.Y = Math.Abs(penetrationDepth.Y); Vector2 p1MovementDirection, p1Vel; p1MovementDirection = p1Vel = p1.Velocity; p1MovementDirection.X /= (p1MovementDirection.X != 0 ? Math.Abs(p1MovementDirection.X) : 1); p1MovementDirection.Y /= (p1MovementDirection.Y != 0 ? Math.Abs(p1MovementDirection.Y) : 1); Vector2 p2MovementDirection, p2Vel; p2MovementDirection = p2Vel = new Vector2(0, 0); p2MovementDirection.X /= (p2MovementDirection.X != 0 ? Math.Abs(p2MovementDirection.X) : 1); p2MovementDirection.Y /= (p2MovementDirection.Y != 0 ? Math.Abs(p2MovementDirection.Y) : 1); if (penetrationDepth.X < penetrationDepth.Y || (p1MovementDirection.Y == 0 && p2MovementDirection.Y == 0)) { float valToMove = penetrationDepth.X; if (p1MovementDirection.X != 0 && p2MovementDirection.X != 0) { valToMove = (float)Math.Ceiling(valToMove / 2); } p1Pos.X += valToMove * p1MovementDirection.X * -1; p2Pos.X += valToMove * p2MovementDirection.X * -1; p1Vel.X = 0; p2Vel.X = 0; } else if (penetrationDepth.X >= penetrationDepth.Y || (p1MovementDirection.X == 0 && p2MovementDirection.X == 0)) { float valToMove = penetrationDepth.Y; if (p1MovementDirection.Y != 0 && p2MovementDirection.Y != 0) { valToMove = (float)Math.Ceiling(valToMove / 2); } p1Pos.Y += valToMove * p1MovementDirection.Y * -1; p2Pos.Y += valToMove * p2MovementDirection.Y * -1; p1Vel.Y = 0; p2Vel.Y = 0; } p1.KillPlayer(); p1.Velocity = new Vector2(0, 0); } }
public void HandlePlayer(Player p1, Wall w1) { if (p1 != null && w1 != null) { Rectangle p1Rect = p1.CollisionRectangle; Rectangle w1Rect = w1.CollisionRectangle; Vector2 p1Pos = p1.Position; Vector2 p2Pos = w1.Position; Vector2 penetrationDepth = RectangleExtensions.GetIntersectionDepth(p1Rect, w1Rect); penetrationDepth.X = Math.Abs(penetrationDepth.X); penetrationDepth.Y = Math.Abs(penetrationDepth.Y); Vector2 p1MovementDirection, p1Vel; p1MovementDirection = p1Vel = p1.Velocity; p1MovementDirection.X /= (p1MovementDirection.X != 0 ? Math.Abs(p1MovementDirection.X) : 1); p1MovementDirection.Y /= (p1MovementDirection.Y != 0 ? Math.Abs(p1MovementDirection.Y) : 1); Vector2 p2MovementDirection, p2Vel; p2MovementDirection = p2Vel = new Vector2(0,0); p2MovementDirection.X /= (p2MovementDirection.X != 0 ? Math.Abs(p2MovementDirection.X) : 1); p2MovementDirection.Y /= (p2MovementDirection.Y != 0 ? Math.Abs(p2MovementDirection.Y) : 1); if (penetrationDepth.X < penetrationDepth.Y || (p1MovementDirection.Y == 0 && p2MovementDirection.Y == 0)) { float valToMove = penetrationDepth.X; if (p1MovementDirection.X != 0 && p2MovementDirection.X != 0) valToMove = (float)Math.Ceiling(valToMove / 2); p1Pos.X += valToMove * p1MovementDirection.X * -1; p2Pos.X += valToMove * p2MovementDirection.X * -1; p1Vel.X = 0; p2Vel.X = 0; } else if (penetrationDepth.X >= penetrationDepth.Y || (p1MovementDirection.X == 0 && p2MovementDirection.X == 0)) { float valToMove = penetrationDepth.Y; if (p1MovementDirection.Y != 0 && p2MovementDirection.Y != 0) valToMove = (float)Math.Ceiling(valToMove / 2); p1Pos.Y += valToMove * p1MovementDirection.Y * -1; p2Pos.Y += valToMove * p2MovementDirection.Y * -1; p1Vel.Y = 0; p2Vel.Y = 0; } p1.KillPlayer(); p1.Velocity=new Vector2(0,0); } }