private void SwitchFaces(RubikFace from, RubikFaceType to, int indexTo) { from.Index = indexTo; from.Type = to; _faces[to][indexTo] = from; }
// 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); }
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; }
public RubikFace GetFaceWithType(RubikFaceType type) { foreach (var rubikFace in _faces) { if (rubikFace.Type == type) { return(rubikFace); } } return(null); }
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; } }
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; } }
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); }
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(); } }