private Tuple <Vector2, bool> CollisionByVectorSubstraction(SpriteBase collisioner, SpriteBase collisioned) { var x1 = collisioner.Position.X; var y1 = collisioner.Position.Y; var w1 = collisioner.CyclicalFrameSize.X; var h1 = collisioner.CyclicalFrameSize.Y; var x2 = collisioned.Position.X; var y2 = collisioned.Position.Y; var w2 = collisioned.Size.X; var h2 = collisioned.Size.Y; if ((y1 <= y2 && y1 + h1 > y2) || (y1 >= y2 && y1 <= y2 + h2) || (y1 >= y2 && y1 >= y2 + h2)) { if (x1 > x2 && x1 + w1 < x2 + w2) { return(new Tuple <Vector2, bool>(new Vector2(0, -collisioner.Speed.Y), true)); } double dx = x1 <= x2 && x1 + w1 > x2 ? Math.Abs(x1 + w1 - x2) : x1 > x2 && x1 < x2 + w2 ? Math.Abs(x1 - x2 + w2) : 0; if (dx.Equals(0)) { return(_tupleZero); } double dy = y1 >= y2?Math.Abs(y1 - y2) : Math.Abs(y1 - y2 + h2); return(dx >= dy ? new Tuple <Vector2, bool>(new Vector2(-collisioner.Speed.X, 0), false) : new Tuple <Vector2, bool>(new Vector2(0, -collisioner.Speed.Y), true)); } return(_tupleZero); }
private Tuple <Vector2, bool> CollisionByMinimumDistanceOfGreatestVector( SpriteBase collisioner, SpriteBase collisioned) { var x1 = (int)collisioner.Position.X; var y1 = (int)collisioner.Position.Y; var w1 = (int)collisioner.CyclicalFrameSize.X; var h1 = (int)collisioner.CyclicalFrameSize.Y; var x2 = (int)collisioned.Position.X; var y2 = (int)collisioned.Position.Y; var w2 = (int)collisioned.Size.X; var h2 = (int)collisioned.Size.Y; var collisionVector = GetGreatestVector(collisioned, x1, w1, y1, h1, x2, y2); if (!collisionVector.Equals(Vector2.Zero)) { var componentX = Math.Abs(collisionVector.X); var componentY = Math.Abs(collisionVector.Y); if (componentX < componentY) { return(new Tuple <Vector2, bool>(-new Vector2(componentX, 0), false)); } else if (componentX.Equals(componentY)) { return(new Tuple <Vector2, bool>(-new Vector2(componentX, componentY), false)); } else { return(new Tuple <Vector2, bool>(-new Vector2(0, componentY), true)); } } return(new Tuple <Vector2, bool>(Vector2.Zero, false)); }
public bool InCollision(SpriteBase spriteBase) { return(RectangleCollision.Intersects(spriteBase.RectangleCollision)); }
private Vector2 GetGreatestVector(SpriteBase collisioned, int x1, int w1, int y1, int h1, int x2, int y2) { var vector = new Tuple <Vector2, double>(Vector2.Zero, 0); for (int i = 0; i < 4; i++) { var x1PlusW1 = x1 + w1; var y1PlusH1 = y1 + h1; switch (i) { case 0: { if (collisioned.RectangleCollision.Contains(x1, y1)) { var candidate = GetVectorFromPointToPoint(x1, y1, x2, y2); if (candidate.Item2 > vector.Item2) { vector.Item1 = candidate.Item1; } } break; } case 1: { if (collisioned.RectangleCollision.Contains(x1PlusW1, y1)) { var candidate = GetVectorFromPointToPoint(x1PlusW1, y1, x2, y2); if (candidate.Item2 > vector.Item2) { vector.Item1 = candidate.Item1; } } break; } case 2: { if (collisioned.RectangleCollision.Contains(x1, y1PlusH1)) { var candidate = GetVectorFromPointToPoint(x1, y1PlusH1, x2, y2); if (candidate.Item2 > vector.Item2) { vector.Item1 = candidate.Item1; } } break; } case 3: { if (collisioned.RectangleCollision.Contains(x1PlusW1, y1PlusH1)) { var candidate = GetVectorFromPointToPoint(x1PlusW1, y1PlusH1, x2, y2); if (candidate.Item2 > vector.Item2) { vector.Item1 = candidate.Item1; } } break; } } } return(vector.Item1); }
private Tuple <Vector2, bool> Collision(SpriteBase collisioner, SpriteBase collisioned) { return(collisionMethod.Invoke(collisioner, collisioned)); }
private Tuple <Vector2, bool> HandleCollision(SpriteBase spriteUser, SpriteBase sprite) { return(Collision(spriteUser, sprite)); }