public bool MoveAndCollide(Vector2 direction, out Overlap overlap) { bool result = false; overlap = new Overlap(); direction = Vector2.Round(direction); if (direction == Vector2.Zero) { return(result); } if (Layout.Current.Grid.IsCollidingAtOffset(this, direction.X, 0f, out var overlapX)) { direction.X += overlapX.Depth.X; overlap = overlapX; result = true; } else if (Layout.Current.Grid.IsCollidingAtOffset(this, 0f, direction.Y, out var overlapY)) { direction.Y += overlapY.Depth.Y; overlap = overlapY; result = true; } BodyInfo.Position += direction; Layout.Current.Grid.Update(this); return(result); }
public bool IsOverlapping(Sprite sprite, out Overlap overlap) { overlap = new Overlap(); var overlappedObject = QueryBounds(sprite.BodyInfo.Bounds).FirstOrDefault(other => other != sprite); if (overlappedObject != null) { overlap.Depth = GetIntersectionDepth(sprite.BodyInfo.Bounds, overlappedObject.BodyInfo.Bounds); overlap.Other = overlappedObject; return(true); } return(false); }
public bool IsCollidingAtOffset(Sprite sprite, float xOffset, float yOffset, out Overlap overlap) { overlap = new Overlap(); var offsetBounds = sprite.BodyInfo.Bounds; offsetBounds.Offset(xOffset, yOffset); var overlappedObject = QueryBounds(offsetBounds).FirstOrDefault(other => other != sprite && other.BodyInfo.IsSolid); if (overlappedObject != null) { overlap.Depth = GetIntersectionDepth(offsetBounds, overlappedObject.BodyInfo.Bounds); overlap.Other = overlappedObject; return(true); } return(false); }