public virtual void Move() { var bbO = BoundingBox.Union(BoundingBox.Offset(Motion)); List <AxisAlignedBB> list = Game.Instance.Map.GetCollidingBoxes(bbO); var mOrig = Motion; for (int i = 0; i < list.Count; i++) { var blockBb = list[i]; Motion.Y = blockBb.CalculateYOffset(BoundingBox, Motion.Y); } BoundingBox = BoundingBox.Offset(Motion * Vector2.UnitY); for (int i = 0; i < list.Count; i++) { var blockBb = list[i]; Motion.X = blockBb.CalculateXOffset(BoundingBox, Motion.X); } BoundingBox = BoundingBox.Offset(Motion * Vector2.UnitX); SetPositionToBb(); var stoppedX = Math.Abs(mOrig.X - Motion.X) > 0.00001f; var stoppedY = Math.Abs(mOrig.Y - Motion.Y) > 0.00001f; if (stoppedX) { Motion.X = 0; } if (stoppedY) { Motion.Y = 0; } }
public List <AxisAlignedBB> GetCollidingBoxes(AxisAlignedBB box) { var bb = box.Union(box); return(_collisionBoxes.Where(cb => cb.IntersectsWith(bb)).ToList()); }