示例#1
0
        private bool TryLedgeJump(int ledgeDirection)
        {
            Rectangle2F entityBox = player.Physics.PositionedCollisionBox;

            entityBox.Point += Directions.ToVector(ledgeDirection) * 1.0f;

            // Check if there any obstructions in front of the player.
            foreach (Tile tile in player.RoomControl.TileManager.GetTilesTouching(entityBox))
            {
                if ((!tile.IsLedge || tile.LedgeDirection != ledgeDirection) &&
                    tile.IsSolid && tile.CollisionModel != null)
                {
                    // Check collisions with the tile's collision box.
                    // Account for any safe edge-clipping.
                    foreach (Rectangle2F box in tile.CollisionModel.Boxes)
                    {
                        Rectangle2F solidBox = box;
                        solidBox.Point += tile.Position;

                        if (entityBox.Intersects(solidBox) &&
                            !player.Physics.IsSafeClippingInDirection(solidBox, (ledgeDirection + 1) % 4) &&
                            !player.Physics.IsSafeClippingInDirection(solidBox, (ledgeDirection + 2) % 4) &&
                            !player.Physics.IsSafeClippingInDirection(solidBox, (ledgeDirection + 3) % 4) &&
                            !player.Physics.CanDodgeCollision(solidBox, ledgeDirection))
                        {
                            return(false);
                        }
                    }
                }
            }

            // No obstructions: begin ledge jump!
            player.LedgeJumpState.LedgeJumpDirection = ledgeDirection;
            player.BeginState(player.LedgeJumpState);
            return(true);
        }