Пример #1
0
    public static CutResult CutBrick(Brick brickToCut, Brick brick, BrickAxis axis, float threshold)
    {
        if (axis == BrickAxis.X)
        {
            Vector2 brickToCut_A = brickToCut.GetPointByNumber(1);
            Vector2 brickToCut_B = brickToCut.GetPointByNumber(4);

            Vector2 brick_A = brick.GetPointByNumber(1);
            Vector2 brick_B = brick.GetPointByNumber(4);

            if (brickToCut_B.x < brick_A.x || brickToCut_A.x > brick_B.x)
            {
                // Player missed!
                return(CutResult.Fail(axis));
            }
            if (brickToCut_B.x < brick_B.x)
            {
                if (brick_B.x - brickToCut_B.x <= threshold)
                {
                    return(CutResult.Success(axis));
                }
                else
                {
                    float newScaleX = (brickToCut_B.x - brick_A.x);
                    float newPosX   = brickToCut_B.x - newScaleX / 2;

                    Vector3 brickScale = brickToCut.transform.localScale;
                    brickToCut.transform.localScale = new Vector3(newScaleX, brickScale.y, brickScale.z);

                    Vector3 brickPos = brickToCut.transform.position;
                    brickToCut.transform.position = new Vector3(newPosX, brickPos.y, brickPos.z);

                    Vector3 pieceScale = new Vector3(brick_A.x - brickToCut_A.x, brickScale.y, brickScale.z);
                    Vector3 piecePos   = new Vector3(brickToCut_A.x + pieceScale.x / 2, brickPos.y, brickPos.z);
                    return(CutResult.Partial(piecePos, pieceScale, axis));
                }
            }
            if (brickToCut_A.x > brick_A.x)
            {
                if (brickToCut_A.x - brick_A.x <= threshold)
                {
                    return(CutResult.Success(axis));
                }
                else
                {
                    float newScaleX = (brick_B.x - brickToCut_A.x);
                    float newPosX   = brickToCut_A.x + newScaleX / 2;

                    Vector3 brickScale = brickToCut.transform.localScale;
                    brickToCut.transform.localScale = new Vector3(newScaleX, brickScale.y, brickScale.z);

                    Vector3 brickPos = brickToCut.transform.position;
                    brickToCut.transform.position = new Vector3(newPosX, brickPos.y, brickPos.z);

                    Vector3 pieceScale = new Vector3(brickToCut_A.x - brick_A.x, brickScale.y, brickScale.z);
                    Vector3 piecePos   = new Vector3(brick_B.x + pieceScale.x / 2, brickPos.y, brickPos.z);
                    return(CutResult.Partial(piecePos, pieceScale, axis));
                }
            }
        }
        if (axis == BrickAxis.Z)
        {
            Vector2 brickToCut_A = brickToCut.GetPointByNumber(3);
            Vector2 brickToCut_B = brickToCut.GetPointByNumber(4);

            Vector2 brick_A = brick.GetPointByNumber(3);
            Vector2 brick_B = brick.GetPointByNumber(4);

            if (brickToCut_B.y > brick_A.y || brickToCut_A.y < brick_B.y)
            {
                // Player missed
                return(CutResult.Fail(axis));
            }
            if (brickToCut_B.y > brick_B.y)
            {
                if (brickToCut_B.y - brick_B.y <= threshold)
                {
                    return(CutResult.Success(axis));
                }
                else
                {
                    float newScaleZ = (brick_A.y - brickToCut_B.y);
                    float newPosZ   = brickToCut_B.y + newScaleZ / 2;

                    Vector3 brickScale = brickToCut.transform.localScale;
                    brickToCut.transform.localScale = new Vector3(brickScale.x, brickScale.y, newScaleZ);

                    Vector3 brickPos = brickToCut.transform.position;
                    brickToCut.transform.position = new Vector3(brickPos.x, brickPos.y, newPosZ);

                    Vector3 pieceScale = new Vector3(brickScale.x, brickScale.y, brickToCut_A.y - brick_A.y);
                    Vector3 piecePos   = new Vector3(brickPos.x, brickPos.y, brick_A.y + pieceScale.z / 2);
                    return(CutResult.Partial(piecePos, pieceScale, axis));
                }
            }
            if (brickToCut_A.y < brick_A.y)
            {
                if (brick_A.y - brickToCut_A.y <= threshold)
                {
                    return(CutResult.Success(axis));
                }
                else
                {
                    float newScaleZ = (brickToCut_A.y - brick_B.y);
                    float newPosZ   = brickToCut_A.y - newScaleZ / 2;

                    Vector3 brickScale = brickToCut.transform.localScale;
                    brickToCut.transform.localScale = new Vector3(brickScale.x, brickScale.y, newScaleZ);

                    Vector3 brickPos = brickToCut.transform.position;
                    brickToCut.transform.position = new Vector3(brickPos.x, brickPos.y, newPosZ);

                    Vector3 pieceScale = new Vector3(brickScale.x, brickScale.y, brick_B.y - brickToCut_B.y);
                    Vector3 piecePos   = new Vector3(brickPos.x, brickPos.y, brick_B.y - pieceScale.z / 2);
                    return(CutResult.Partial(piecePos, pieceScale, axis));
                }
            }
        }
        return(CutResult.Fail(axis));
    }