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);
            }
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
 void ICollisionResponder <TFirst, TSecond> .RespondToCollision(TFirst obj, TSecond collidable, CollisionInfo collisionInfo)
 {
     Action(obj, collidable, collisionInfo);
 }
Exemple #4
0
        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);
        }