Ejemplo n.º 1
0
    /// <summary>
    /// The most important part of the algorithm, according to the slice that is rotating, the axis i'm rotating around and the rotation
    /// direction:
    /// 1- determine the face of the cube
    /// 2- get the tiles on that face and add them to a list
    /// 3- sort that list by the x, y or z position in ascending or descending order, according to the rotation axis and rotation direction
    /// TODO: Replace the bubble sort with a faster sorting algorithm
    /// </summary>
    /// <param name="face"></param>
    /// <param name="axis"></param>
    /// <param name="dir"></param>
    /// <returns></returns>
    public List <GameObject> GetFaceTiles(RubikCubeFaces.CubeFace face, AXIS axis, float dir)
    {
        List <GameObject> res = new List <GameObject>();

        switch (face)
        {
        case RubikCubeFaces.CubeFace.Front:
        {
            var fronts = RubikGenerator.Instance.GetSlice().GetComponentsInChildren <MarkAsFrontFace>();

            for (int i = 0; i < fronts.Length; i++)
            {
                if (fronts[i])
                {
                    res.Add(fronts[i].gameObject);
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Back:
        {
            var backs = RubikGenerator.Instance.GetSlice().GetComponentsInChildren <MarkAsBackFace>();

            for (int i = 0; i < backs.Length; i++)
            {
                if (backs[i])
                {
                    res.Add(backs[i].gameObject);
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Right:
        {
            var rights = RubikGenerator.Instance.GetSlice().GetComponentsInChildren <MarkAsRightFace>();

            for (int i = 0; i < rights.Length; i++)
            {
                if (rights[i])
                {
                    res.Add(rights[i].gameObject);
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Left:
        {
            var lefts = RubikGenerator.Instance.GetSlice().GetComponentsInChildren <MarkAsLeftFace>();

            for (int i = 0; i < lefts.Length; i++)
            {
                if (lefts[i])
                {
                    res.Add(lefts[i].gameObject);
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Up:
        {
            var ups = RubikGenerator.Instance.GetSlice().GetComponentsInChildren <MarkAsUpFace>();

            for (int i = 0; i < ups.Length; i++)
            {
                if (ups[i])
                {
                    res.Add(ups[i].gameObject);
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Down:
        {
            var downs = RubikGenerator.Instance.GetSlice().GetComponentsInChildren <MarkAsDownFace>();

            for (int i = 0; i < downs.Length; i++)
            {
                if (downs[i])
                {
                    res.Add(downs[i].gameObject);
                }
            }
        }
        break;

        default:
            break;
        }

        // Bubble sorting tiles
        // A really crappy way of doing it
        // TODO: Optimize this part
        switch (face)
        {
        case RubikCubeFaces.CubeFace.Front:
        {
            for (int i = 0; i < res.Count - 1; i++)
            {
                for (int j = 0; j < res.Count - i - 1; j++)
                {
                    switch (axis)
                    {
                    case AXIS.X:
                    {
                        if (dir < 0)
                        {
                            if (res[j].transform.position.y > res[j + 1].transform.position.y)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                        else
                        {
                            if (res[j].transform.position.y < res[j + 1].transform.position.y)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                    }
                    break;

                    case AXIS.Y:
                    {
                        if (dir > 0)
                        {
                            if (res[j].transform.position.x > res[j + 1].transform.position.x)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                        else
                        {
                            if (res[j].transform.position.x < res[j + 1].transform.position.x)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                    }
                    break;

                    default:
                        break;
                    }
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Back:
        {
            for (int i = 0; i < res.Count - 1; i++)
            {
                for (int j = 0; j < res.Count - i - 1; j++)
                {
                    switch (axis)
                    {
                    case AXIS.X:
                    {
                        if (dir > 0)
                        {
                            if (res[j].transform.position.y > res[j + 1].transform.position.y)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                        else
                        {
                            if (res[j].transform.position.y < res[j + 1].transform.position.y)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                    }
                    break;

                    case AXIS.Y:
                    {
                        if (dir < 0)
                        {
                            if (res[j].transform.position.x > res[j + 1].transform.position.x)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                        else
                        {
                            if (res[j].transform.position.x < res[j + 1].transform.position.x)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                    }
                    break;

                    default:
                        break;
                    }
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Right:
        {
            for (int i = 0; i < res.Count - 1; i++)
            {
                for (int j = 0; j < res.Count - i - 1; j++)
                {
                    switch (axis)
                    {
                    case AXIS.Y:
                    {
                        if (dir > 0)
                        {
                            if (res[j].transform.position.z > res[j + 1].transform.position.z)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                        else
                        {
                            if (res[j].transform.position.z < res[j + 1].transform.position.z)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                    }
                    break;

                    case AXIS.Z:
                    {
                        if (dir < 0)
                        {
                            if (res[j].transform.position.y > res[j + 1].transform.position.y)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                        else
                        {
                            if (res[j].transform.position.y < res[j + 1].transform.position.y)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                    }
                    break;

                    default:
                        break;
                    }
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Left:
        {
            for (int i = 0; i < res.Count - 1; i++)
            {
                for (int j = 0; j < res.Count - i - 1; j++)
                {
                    switch (axis)
                    {
                    case AXIS.Y:
                    {
                        if (dir < 0)
                        {
                            if (res[j].transform.position.z > res[j + 1].transform.position.z)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                        else
                        {
                            if (res[j].transform.position.z < res[j + 1].transform.position.z)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                    }
                    break;

                    case AXIS.Z:
                    {
                        if (dir > 0)
                        {
                            if (res[j].transform.position.y > res[j + 1].transform.position.y)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                        else
                        {
                            if (res[j].transform.position.y < res[j + 1].transform.position.y)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                    }
                    break;

                    default:
                        break;
                    }
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Up:
        {
            for (int i = 0; i < res.Count - 1; i++)
            {
                for (int j = 0; j < res.Count - i - 1; j++)
                {
                    switch (axis)
                    {
                    case AXIS.X:
                    {
                        if (dir < 0)
                        {
                            if (res[j].transform.position.z > res[j + 1].transform.position.z)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                        else
                        {
                            if (res[j].transform.position.z < res[j + 1].transform.position.z)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                    }
                    break;

                    case AXIS.Z:
                    {
                        if (dir > 0)
                        {
                            if (res[j].transform.position.x > res[j + 1].transform.position.x)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                        else
                        {
                            if (res[j].transform.position.x < res[j + 1].transform.position.x)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                    }
                    break;

                    default:
                        break;
                    }
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Down:
        {
            for (int i = 0; i < res.Count - 1; i++)
            {
                for (int j = 0; j < res.Count - i - 1; j++)
                {
                    switch (axis)
                    {
                    case AXIS.X:
                    {
                        if (dir > 0)
                        {
                            if (res[j].transform.position.z > res[j + 1].transform.position.z)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                        else
                        {
                            if (res[j].transform.position.z < res[j + 1].transform.position.z)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                    }
                    break;

                    case AXIS.Z:
                    {
                        if (dir < 0)
                        {
                            if (res[j].transform.position.x > res[j + 1].transform.position.x)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                        else
                        {
                            if (res[j].transform.position.x < res[j + 1].transform.position.x)
                            {
                                var tmp = res[j];
                                res[j]     = res[j + 1];
                                res[j + 1] = tmp;
                            }
                        }
                    }
                    break;

                    default:
                        break;
                    }
                }
            }
        }
        break;

        default:
            break;
        }

        return(res);
    }
Ejemplo n.º 2
0
    /// <summary>
    /// Given a certain slice face get the desired face tiles (i.e: get the up tiles of the front face)
    /// </summary>
    /// <param name="face"></param>
    /// <param name="wantedFace"></param>
    /// <returns></returns>
    public List <GameObject> GetFaceTiles(List <GameObject> face, RubikCubeFaces.CubeFace wantedFace)
    {
        List <GameObject> res = new List <GameObject>();

        switch (wantedFace)
        {
        case RubikCubeFaces.CubeFace.Front:
        {
            for (int i = 0; i < face.Count; i++)
            {
                var marker = face[i].transform.parent.parent.GetComponentInChildren <MarkAsFrontFace>();
                if (marker)
                {
                    res.Add(face[i].transform.parent.parent.GetComponentInChildren <MarkAsFrontFace>().gameObject);
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Back:
        {
            for (int i = 0; i < face.Count; i++)
            {
                var marker = face[i].transform.parent.parent.GetComponentInChildren <MarkAsBackFace>();
                if (marker)
                {
                    res.Add(face[i].transform.parent.parent.GetComponentInChildren <MarkAsBackFace>().gameObject);
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Right:
        {
            for (int i = 0; i < face.Count; i++)
            {
                var marker = face[i].transform.parent.parent.GetComponentInChildren <MarkAsRightFace>();
                if (marker)
                {
                    res.Add(face[i].transform.parent.parent.GetComponentInChildren <MarkAsRightFace>().gameObject);
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Left:
        {
            for (int i = 0; i < face.Count; i++)
            {
                var marker = face[i].transform.parent.parent.GetComponentInChildren <MarkAsLeftFace>();
                if (marker)
                {
                    res.Add(face[i].transform.parent.parent.GetComponentInChildren <MarkAsLeftFace>().gameObject);
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Up:
        {
            for (int i = 0; i < face.Count; i++)
            {
                var marker = face[i].transform.parent.parent.GetComponentInChildren <MarkAsUpFace>();
                if (marker)
                {
                    res.Add(face[i].transform.parent.parent.GetComponentInChildren <MarkAsUpFace>().gameObject);
                }
            }
        }
        break;

        case RubikCubeFaces.CubeFace.Down:
        {
            for (int i = 0; i < face.Count; i++)
            {
                var marker = face[i].transform.parent.parent.GetComponentInChildren <MarkAsDownFace>();
                if (marker)
                {
                    res.Add(face[i].transform.parent.parent.GetComponentInChildren <MarkAsDownFace>().gameObject);
                }
            }
        }
        break;

        default:
            break;
        }

        return(res);
    }