Ejemplo n.º 1
0
        /// <summary>
        /// Detects and resolves collisions between the Player and the glidingPlatform nearest him.
        /// </summary>
        public void HandleGlidingPlatformCollisions()
        {
            // Did I just collide with a gliding platform?
            foreach (GlidingPlatform platform in Level.playerPlatforms)
            // To know this we have to check the list of platforms in
            // the camera's visible range
            // which we collected from the level calss
            {
                // We check if the player's feet intersect with the platform's surface.
                if (platform.Surface.Intersects(Feet))
                {
                    OnPlatform(platform); // If so, then this is the platform we want to save.
                }
            }

            // If I own a platform
            if (isOnPlatform == true)
            {
                // reset isOnPlatform for the purposes of evaluating it again.
                isOnPlatform = false;

                // Do they intersect?
                if (Feet.Intersects(platform.Surface))
                {
                    isOnPlatform = true;
                    //Yes they intersect. By how deep?
                    Vector2 depth = RectangleExtensions.GetIntersectionDepth(Feet, platform.Surface);

                    // Is it more than zero?
                    if (depth != Vector2.Zero)
                    {
                        // Yes they intersect and it is more than zero depth!
                        // Find out by how much.
                        float absDepthX = Math.Abs(depth.X);
                        float absDepthY = Math.Abs(depth.Y);

                        // Act as if we are on the ground if we were previously on the a platform.
                        if (previousBottom >= platform.Surface.Top)
                        {
                            isOnGround = true;
                        }

                        if (isOnPlatform)
                        {
                            // Resolve the collision along the Y axis.
                            Position = new Vector2(Position.X /*+ platform.Position.X*/, Position.Y - Math.Abs(depth.Y));
                        }
                    }
                }
            }

            // Check if the player's Y has moved through a platform's surface.
            foreach (GlidingPlatform platform in level.playerPlatforms)
            {
                if ((position.Y > platform.Surface.Top - 12) && (position.Y < platform.Surface.Top + 12) &&
                    (position.X > platform.Surface.Left - BoundingRectangle.Width / 2) &&
                    (position.X < platform.Surface.Right + BoundingRectangle.Width / 2) &&
                    (velocity.Y > 0)) // if the velocity is negative the player is jumping up.
                // If the player is jumping up, we don't want him to stick, only when moving down.

                // The speed the player moves with a MaxFallSpeed of 600.0f is 12 pixels per second.
                // If we don't check this condition, the player can jump right past the surface of the platform,
                // and the game will never know to make the player stick!
                {
                    OnPlatform(platform);
                    position.Y = platform.Surface.Top;
                }
            }

            previousBottom = BoundingRectangle.Bottom;
        }