Exemple #1
0
        private void SwitchFaces(RubikFace from, RubikFaceType to, int indexTo)
        {
            from.Index = indexTo;
            from.Type  = to;

            _faces[to][indexTo] = from;
        }
Exemple #2
0
        // WIN ]

        public void Rotate(RubikFaceType type, bool clockwise, Action callback = null)
        {
            switch (type)
            {
            case RubikFaceType.Front:
                StartCoroutine(RotateFront(clockwise, callback));
                break;

            case RubikFaceType.Top:
                StartCoroutine(RotateTop(clockwise, callback));
                break;

            case RubikFaceType.Left:
                StartCoroutine(RotateLeft(clockwise, callback));
                break;

            case RubikFaceType.Right:
                StartCoroutine(RotateRight(clockwise, callback));
                break;

            case RubikFaceType.Bottom:
                StartCoroutine(RotateBottom(clockwise, callback));
                break;

            case RubikFaceType.Back:
                StartCoroutine(RotateBack(clockwise, callback));
                break;

            default:
                throw new ArgumentOutOfRangeException("type", type, null);
            }
            _audioSource.PlayOneShot(OnMoveSound);
        }
Exemple #3
0
        private void SwitchFaces(RubikFaceType from, int indexFrom, RubikFaceType to, int indexTo)
        {
            var faceFrom = _faces[from][indexFrom];

            faceFrom.Index = indexTo;
            faceFrom.Type  = to;

            _faces[to][indexTo] = faceFrom;
        }
Exemple #4
0
        public RubikFace GetFaceWithType(RubikFaceType type)
        {
            foreach (var rubikFace in _faces)
            {
                if (rubikFace.Type == type)
                {
                    return(rubikFace);
                }
            }

            return(null);
        }
Exemple #5
0
        private void ActivateFaceSelection()
        {
            DeactivateAllFaceSelections();

            if (_currentRubikFace == null)
            {
                return;
            }

            switch (_currentRubikFace.Type)
            {
            case RubikFaceType.Top:
                TopFaceSelection.SetActive(true);
                break;

            case RubikFaceType.Left:
                LeftFaceSelection.SetActive(true);
                break;

            case RubikFaceType.Front:
                FrontFaceSelection.SetActive(true);
                break;

            case RubikFaceType.Right:
                RightFaceSelection.SetActive(true);
                break;

            case RubikFaceType.Bottom:
                BottomFaceSelection.SetActive(true);
                break;

            case RubikFaceType.Back:
                BackFaceSelection.SetActive(true);
                break;

            case RubikFaceType.None:
                return;

            default:
                throw new ArgumentOutOfRangeException();
            }

            if (_currentRubikFace.Type != _previousSelectedFace)
            {
                _audioSource.PlayOneShot(OnSelectionSound);
                _previousSelectedFace = _currentRubikFace.Type;
            }
        }
Exemple #6
0
        private void DetectNearestFace()
        {
            _faceDistances[0] = (Vector3.Distance(Camera.main.transform.position, FrontFace.transform.position));
            _faceDistances[1] = (Vector3.Distance(Camera.main.transform.position, BackFace.transform.position));
            _faceDistances[2] = (Vector3.Distance(Camera.main.transform.position, LeftFace.transform.position));
            _faceDistances[3] = (Vector3.Distance(Camera.main.transform.position, RightFace.transform.position));
            _faceDistances[4] = (Vector3.Distance(Camera.main.transform.position, TopFace.transform.position));
            _faceDistances[5] = (Vector3.Distance(Camera.main.transform.position, BottomFace.transform.position));

            int   index       = 0;
            float tempNearest = _faceDistances[0];

            for (int i = 1; i < 6; i++)
            {
                if (_faceDistances[i] < tempNearest)
                {
                    tempNearest = _faceDistances[i];
                    index       = i;
                }
            }

            switch (index)
            {
            case 0:
                _nearestFace = RubikFaceType.Front;
                break;

            case 1:
                _nearestFace = RubikFaceType.Back;
                break;

            case 2:
                _nearestFace = RubikFaceType.Left;
                break;

            case 3:
                _nearestFace = RubikFaceType.Right;
                break;

            case 4:
                _nearestFace = RubikFaceType.Top;
                break;

            case 5:
                _nearestFace = RubikFaceType.Bottom;
                break;
            }
        }
Exemple #7
0
        private RubikSubcube[] RotateFace(RubikSubcube[] face, RubikFaceType type, bool clockwise)
        {
            var newFace = new RubikSubcube[9];

            if (clockwise)
            {
                newFace[0] = face[2];
                newFace[1] = face[5];
                newFace[2] = face[8];
                newFace[3] = face[1];
                newFace[4] = face[4];
                newFace[5] = face[7];
                newFace[6] = face[0];
                newFace[7] = face[3];
                newFace[8] = face[6];

                var faces    = _faces[type];
                var newFaces = new List <RubikFace>(9)
                {
                    faces[2],
                    faces[5],
                    faces[8],
                    faces[1],
                    faces[4],
                    faces[7],
                    faces[0],
                    faces[3],
                    faces[6]
                };

                for (int i = 0; i < 9; i++)
                {
                    newFaces[i].Index = i;
                    newFaces[i].Type  = type;
                }

                _faces[type] = newFaces;
            }
            else
            {
                newFace[0] = face[6];
                newFace[1] = face[3];
                newFace[2] = face[0];
                newFace[3] = face[7];
                newFace[4] = face[4];
                newFace[5] = face[1];
                newFace[6] = face[8];
                newFace[7] = face[5];
                newFace[8] = face[2];

                var faces    = _faces[type];
                var newFaces = new List <RubikFace>(9)
                {
                    faces[6],
                    faces[3],
                    faces[0],
                    faces[7],
                    faces[4],
                    faces[1],
                    faces[8],
                    faces[5],
                    faces[2]
                };

                for (int i = 0; i < 9; i++)
                {
                    newFaces[i].Index = i;
                }

                _faces[type] = newFaces;
            }

            return(newFace);
        }
Exemple #8
0
        protected void LateUpdate()
        {
            if (!CanMove)
            {
                return;
            }
            if (EnableSwiping)
            {
                DeactivateAllFaceSelections();
            }

            DetectNearestFace();
            CheckBackFaceVisibility();

            if (EnableSwiping)
            {
                DetectSelectedCube();

                if (_currentRubikFace != null)
                {
                    var position = Input.mousePosition;
                    var distance = Vector3.Distance(_initialPoint, position);

                    if (distance >= MovesActivationThreshold)
                    {
                        var directionX = position.x - _initialPoint.x;
                        var directionY = position.y - _initialPoint.y;

                        var cubeSelectedMove = Cube.GetStartingFaceData(_currentRubikFace);

                        bool isHorizontal = Mathf.Abs(directionX) > Mathf.Abs(directionY);
                        if (_nearestFace == RubikFaceType.Right || _nearestFace == RubikFaceType.Left)
                        {
                            if (_currentRubikFace.Type == RubikFaceType.Top ||
                                _currentRubikFace.Type == RubikFaceType.Bottom)
                            {
                                isHorizontal = !isHorizontal;
                            }
                        }

                        RubikFaceType selectedFace = RubikFaceType.None;
                        bool          clockwise;

                        if (isHorizontal)
                        {
                            clockwise = (directionX >= 0);
                            bool isPositive = directionY >= 0;
                            if (isPositive)
                            {
                                selectedFace = cubeSelectedMove.HorizontalMove;
                            }
                            else
                            {
                                selectedFace = cubeSelectedMove.HorizontalMove;
                            }

                            if (cubeSelectedMove.InvertHorizontalMove)
                            {
                                clockwise = !clockwise;
                            }
                        }
                        else
                        {
                            clockwise = (directionY >= 0);
                            bool isPositive = directionX >= 0;
                            if (isPositive)
                            {
                                selectedFace = cubeSelectedMove.VerticalMove;
                            }
                            else
                            {
                                selectedFace = cubeSelectedMove.VerticalMove;
                            }

                            if (cubeSelectedMove.InvertVerticalMove)
                            {
                                clockwise = !clockwise;
                            }
                        }

                        /*if (selectedFace == RubikFaceType.Top || selectedFace == RubikFaceType.Bottom)
                         * {
                         *  if (_isBackFaceVisible)
                         *      clockwise = !clockwise;
                         * }*/

                        Debug.Log("Face: " + selectedFace + " - " + clockwise);
                        Cube.Rotate(selectedFace, clockwise);

                        _currentRubikFace = null;
                    }
                }

                ClearSelectedCube();
            }
            else
            {
                DetectSelectedCubeOnMouseUp();
                ActivateFaceSelection();
            }
        }