protected bool CheckForCollisions(TFirst Object, TSecond collidable, bool collidedAlready) { var originalInfo = new CollisionInfo { OriginalPosition = Object.Position.Copy(), OriginalVelocity = Object.Motion.CurrentMotionPerSecond }; if (Object.IsRemoved || collidable.IsRemoved) { return(false); } //get position after motion is adjusted but before collision is corrected var testPosition = Object.Motion.FrameStartPosition.Copy().Translate(Object.Motion.FrameVelocity); if (collidable.DetectCollision(testPosition, false)) { foreach (var responder in Responders) { responder.RespondToCollision(Object, collidable, originalInfo); } if (!collidedAlready) { foreach (var responder in OneTimeResponders) { responder.RespondToCollision(Object, collidable, originalInfo); } } return(true); } else { return(false); } }
protected virtual void BeforePositionCorrected(TFirst moveableObject, TSecond collidable, CollisionInfo collisionInfo, Rectangle tryPosition) { if (tryPosition.Center.X != moveableObject.Position.Center.X) { moveableObject.Motion.Stop(Axis.X); } if (tryPosition.Center.Y < moveableObject.Position.Center.Y && moveableObject.Motion.CurrentMotionPerSecond.Y > 0) { moveableObject.Motion.Stop(Axis.Y); } if (tryPosition.Center.Y > moveableObject.Position.Center.Y && moveableObject.Motion.CurrentMotionPerSecond.Y < 0) { moveableObject.Motion.Stop(Axis.Y); } }
void ICollisionResponder <TFirst, TSecond> .RespondToCollision(TFirst obj, TSecond collidable, CollisionInfo collisionInfo) { Action(obj, collidable, collisionInfo); }
void ICollisionResponder <TFirst, TSecond> .RespondToCollision(TFirst moveableObject, TSecond collidable, CollisionInfo collisionInfo) { var movingCollidable = collidable as IMovingCollidable; var tryPosition = new Rectangle(); tryPosition.Set(moveableObject.Position); bool collideX, collideY; tryPosition.Set(moveableObject.Position); tryPosition.SetLeft(moveableObject.Motion.FrameStartPosition.Left); if (movingCollidable != null) { collideX = !movingCollidable.DetectFrameStartCollision(tryPosition); } else { collideX = !collidable.DetectCollision(tryPosition, true); } tryPosition.Set(moveableObject.Position); tryPosition.SetTop(moveableObject.Motion.FrameStartPosition.Top); if (movingCollidable != null) { collideY = !movingCollidable.DetectFrameStartCollision(tryPosition); } else { collideY = !collidable.DetectCollision(tryPosition, true); } tryPosition.Set(moveableObject.Position); if (collideY && !collideX) { TryCorrectPosition(tryPosition, moveableObject, collidable, movingCollidable, correctX: false, correctY: true); } if (collideX && !collideY) { TryCorrectPosition(tryPosition, moveableObject, collidable, movingCollidable, correctX: true, correctY: false); } if (collidable.DetectCollision(tryPosition, false)) { TryCorrectPosition(tryPosition, moveableObject, collidable, movingCollidable, correctX: false, correctY: true); if (collidable.DetectCollision(tryPosition, false)) { TryCorrectPosition(tryPosition, moveableObject, collidable, movingCollidable, true, true); } } if (collidable.DetectCollision(tryPosition, false)) { TryCorrectPosition(tryPosition, moveableObject, collidable, movingCollidable, true, true, true); } BeforePositionCorrected(moveableObject, collidable, collisionInfo, tryPosition); if (tryPosition.Center.Y < moveableObject.Position.Center.Y - 18) { GlobalDebugHelper.NoOp(); } moveableObject.Position.Set(tryPosition); }