// Judge the actual operate step IEnumerator DoJudge(OperatePiece piece, Vector3 pos) { // 判断是否操作魔方 Vector2 startpos = Vector2.zero; Vector2 curpos = Vector2.zero; if (Input.touchCount > 0) { startpos = Input.GetTouch (0).position; curpos = Input.GetTouch (0).position; while (!rotatejudged && Input.touchCount.Equals (1)) { curpos = Input.GetTouch (0).position; if (Vector2.Distance (curpos, startpos) >= 10f) { rotatejudged = true; } yield return null; } } if (rotatejudged) { rotating = true; // 记录转动的角度 float rollangle = 0f; Vector2 lastmousepos = Vector2.zero; if (Input.touchCount > 0) { lastmousepos = Input.GetTouch (0).position; } Vector2 offset = Vector2.zero; float stepangle = 0f; Vector3 direction = Vector3.up; int suit = 0; string CS = ""; switch (piece) { case OperatePiece.Left: if (Mathf.Abs (curpos.y - startpos.y) >= Mathf.Abs (curpos.x - startpos.x) * 1.4f) { //Slide up and down (alike x axis) if (pos.z < -0.5f) { GetOperateSuit (OperateSuit.Right); CS += "R"; } else if (pos.z < 0.5f) { GetOperateSuit (OperateSuit.MiddleZ); CS += "MZ"; } else { GetOperateSuit (OperateSuit.Left); CS += "L"; } direction = Vector3.back; suit = 1; } else { //Slide left and right (alike y axis) if (pos.y < -0.5f) { GetOperateSuit (OperateSuit.Down); CS += "D"; } else if (pos.y < 0.5f) { GetOperateSuit (OperateSuit.MiddleY); CS += "MY"; } else { GetOperateSuit (OperateSuit.Up); CS += "U"; } direction = Vector3.down; suit = 2; } break; case OperatePiece.Right: if (Mathf.Abs (curpos.y - startpos.y) >= Mathf.Abs (curpos.x - startpos.x) * 1.4f) { //Slide up and down (alike z axis) if (pos.x < -0.5f) { GetOperateSuit (OperateSuit.Front); CS += "F"; } else if (pos.x < 0.5f) { GetOperateSuit (OperateSuit.MiddleX); CS += "MX"; } else { GetOperateSuit (OperateSuit.Back); CS += "B"; } direction = Vector3.right; suit = 1; } else { //Slide left and right (alike y axis) if (pos.y < -0.5f) { GetOperateSuit (OperateSuit.Down); CS += "D"; } else if (pos.y < 0.5f) { GetOperateSuit (OperateSuit.MiddleY); CS += "MY"; } else { GetOperateSuit (OperateSuit.Up); CS += "U"; } direction = Vector3.down; suit = 2; } break; case OperatePiece.Top: if ((curpos.y - startpos.y) * (curpos.x - startpos.x) >= 0f) { //Slide alike x axis if (pos.z < -0.5f) { GetOperateSuit (OperateSuit.Right); CS += "R"; } else if (pos.z < 0.5f) { GetOperateSuit (OperateSuit.MiddleZ); CS += "MZ"; } else { GetOperateSuit (OperateSuit.Left); CS += "L"; } direction = Vector3.back; suit = 2; } else { //Slide alike z axis if (pos.x < -0.5f) { GetOperateSuit (OperateSuit.Front); CS += "F"; } else if (pos.x < 0.5f) { GetOperateSuit (OperateSuit.MiddleX); CS += "MX"; } else { GetOperateSuit (OperateSuit.Back); CS += "B"; } direction = Vector3.left; suit = 3; } break; } while (Input.touchCount > 0 && Input.GetTouch (0).phase != TouchPhase.Ended) { offset = new Vector2 (Input.GetTouch (0).position.x - lastmousepos.x, Input.GetTouch (0).position.y - lastmousepos.y); // 根据位置和滑动的方向来对魔方对应的层进行操作 if (suit.Equals (1)) { stepangle = offset.y * rlength; } else if (suit.Equals (2)) { stepangle = (offset.x * 0.86f + offset.y * 0.25f) * rlength; } else if (suit.Equals (3)) { stepangle = (offset.x * 0.86f - offset.y * 0.25f) * rlength; } rollangle += stepangle; foreach (SingleCube b in operatelist) { b.transform.RotateAround (Vector3.zero, direction, stepangle); } lastmousepos = Input.GetTouch (0).position; yield return null; } float targetangle = 0f; int manstep = 0; if (rollangle > 0) { manstep = (int)((rollangle + 45f) / 90f); } else if (rollangle < 0) { manstep = (int)((rollangle - 45f) / 90f); } targetangle = manstep * 90f; manstep %= 4; manstep = manstep < 0 ? manstep + 4 : manstep; if (!manstep.Equals (0)) { // 由于朝向问题,所以对立面的公式是不同的。 if (CS.Equals ("U") || CS.Equals ("L") || CS.Equals ("F")) { if (manstep == 2) { CS += "2"; } else if (manstep == 1) { CS += "'"; } } else if (CS.Equals ("D") || CS.Equals ("R") || CS.Equals ("B")) { if (manstep == 2) { CS += "2"; } else if (manstep == 3) { CS += "'"; } } RecordUserOperate (CS); } float offsetangle = targetangle - rollangle; float speed = 90f / singleanitime; if (offsetangle < 0) { speed *= -1f; } bool finished = false; float curoffsetangle = 0f; float lastoffsetangle = 0f; float truthoffsetangle = 0f; while (!finished) { float o = speed * Time.deltaTime; curoffsetangle += o; if (Mathf.Abs (curoffsetangle) > Mathf.Abs (offsetangle)) { curoffsetangle = offsetangle; finished = true; } truthoffsetangle = curoffsetangle - lastoffsetangle; foreach (SingleCube b in operatelist) { b.transform.RotateAround (Vector3.zero, direction, truthoffsetangle); } lastoffsetangle = curoffsetangle; yield return null; } foreach (SingleCube b in operatelist) { b.AdjustPos (); } foreach (CubeFace f in cubefaces) { f.UpdateFaceStyle (); } CheckAcomplished (); rotating = false; } rotatejudged = false; }
public void ManualOperate(OperatePiece piece, Vector3 pos, GameObject singleboxobj) { // curobj = singleboxobj; if (formularing || rotating || rotatejudged || flipjudged || flipping) { return; } StartCoroutine (DoJudge (piece, pos)); }
IEnumerator DoJudge(OperatePiece piece, Vector3 pos) { rotating = true; Vector2 startpos = Input.mousePosition; Vector2 curpos = Input.mousePosition; judged = false; while (Input.GetMouseButton (0) && !judged) { curpos = Input.mousePosition; if (Vector2.Distance (curpos, startpos) >= 10f) { judged = true; //print ("judged"); } yield return null; } // 记录转动的角度 rollangle = 0f; Vector2 lastmousepos = Input.mousePosition; Vector2 offset = Vector2.zero; float stepangle = 0f; Vector3 direction = Vector3.up; int suit = 0; switch (piece) { case OperatePiece.Left: if (Mathf.Abs (curpos.y - startpos.y) >= Mathf.Abs (curpos.x - startpos.x) * 1.4f) { //Slide up and down (alike x axis) if (pos.z < -0.5f) { GetOperateSuit (OperateSuit.Right); } else if (pos.z < 0.5f) { GetOperateSuit (OperateSuit.MiddleZ); } else { GetOperateSuit (OperateSuit.Left); } direction = Vector3.back; suit = 1; } else { //Slide left and right (alike y axis) if (pos.y < -0.5f) { GetOperateSuit (OperateSuit.Down); } else if (pos.y < 0.5f) { GetOperateSuit (OperateSuit.MiddleY); } else { GetOperateSuit (OperateSuit.Up); } direction = Vector3.down; suit = 2; } break; case OperatePiece.Right: if (Mathf.Abs (curpos.y - startpos.y) >= Mathf.Abs (curpos.x - startpos.x) * 1.4f) { //Slide up and down (alike z axis) if (pos.x < -0.5f) { GetOperateSuit (OperateSuit.Front); } else if (pos.x < 0.5f) { GetOperateSuit (OperateSuit.MiddleX); } else { GetOperateSuit (OperateSuit.Back); } direction = Vector3.right; suit = 1; } else { //Slide left and right (alike y axis) if (pos.y < -0.5f) { GetOperateSuit (OperateSuit.Down); } else if (pos.y < 0.5f) { GetOperateSuit (OperateSuit.MiddleY); } else { GetOperateSuit (OperateSuit.Up); } direction = Vector3.down; suit = 2; } break; case OperatePiece.Top: if ((curpos.y - startpos.y) * (curpos.x - startpos.x) >= 0f) { //Slide alike x axis if (pos.z < -0.5f) { GetOperateSuit (OperateSuit.Right); } else if (pos.z < 0.5f) { GetOperateSuit (OperateSuit.MiddleZ); } else { GetOperateSuit (OperateSuit.Left); } direction = Vector3.back; suit = 2; } else { //Slide alike z axis if (pos.x < -0.5f) { GetOperateSuit (OperateSuit.Front); } else if (pos.x < 0.5f) { GetOperateSuit (OperateSuit.MiddleX); } else { GetOperateSuit (OperateSuit.Back); } direction = Vector3.left; suit = 3; } break; } while (Input.GetMouseButton (0)) { offset = new Vector2 (Input.mousePosition.x - lastmousepos.x, Input.mousePosition.y - lastmousepos.y); if (suit.Equals (1)) { stepangle = offset.y * rlength; } else if (suit.Equals (2)) { stepangle = (offset.x * 0.86f + offset.y * 0.25f) * rlength; } else if (suit.Equals (3)) { stepangle = (offset.x * 0.86f - offset.y * 0.25f) * rlength; } rollangle += stepangle; foreach (SingleBox b in operatelist) { b.transform.RotateAround (Vector3.zero, direction, stepangle); } lastmousepos = Input.mousePosition; yield return null; } float targetangle = 0f; if (rollangle > 0) { targetangle = ((int)((rollangle + 45f) / 90f)) * 90f; } else if (rollangle < 0) { targetangle = ((int)((rollangle - 45f) / 90f)) * 90f; } float offsetangle = targetangle - rollangle; //print ("<|||||>" + offsetangle + "<|||||>" + targetangle + "<|||||>" + rollangle); float speed = 90f / singleanitime; // bool toupper = true; if (offsetangle < 0) { // toupper = false; speed *= -1f; } bool finished = false; float curoffsetangle = 0f; float lastoffsetangle = 0f; float truthoffsetangle = 0f; while (!finished) { float o = speed * Time.deltaTime; curoffsetangle += o; if (Mathf.Abs (curoffsetangle) > Mathf.Abs (offsetangle)) { curoffsetangle = offsetangle; finished = true; //print ("Finished!!!!!!!"); } truthoffsetangle = curoffsetangle - lastoffsetangle; foreach (SingleBox b in operatelist) { b.transform.RotateAround (Vector3.zero, direction, truthoffsetangle); } lastoffsetangle = curoffsetangle; yield return null; } foreach (SingleBox b in operatelist) { b.AdjustPos (); } rotating = false; }
public void ManualOperate(OperatePiece piece, Vector3 pos, GameObject singleboxobj) { // curobj = singleboxobj; StartCoroutine (DoJudge (piece, pos)); }
IEnumerator DoJudge(OperatePiece piece, Vector3 pos) { rotating = true; Vector2 startpos = Input.mousePosition; Vector2 curpos = Input.mousePosition; judged = false; while (Input.GetMouseButton(0) && !judged) { curpos = Input.mousePosition; if (Vector2.Distance(curpos, startpos) >= 10f) { judged = true; //print ("judged"); } yield return(null); } // 记录转动的角度 rollangle = 0f; Vector2 lastmousepos = Input.mousePosition; Vector2 offset = Vector2.zero; float stepangle = 0f; Vector3 direction = Vector3.up; int suit = 0; switch (piece) { case OperatePiece.Left: if (Mathf.Abs(curpos.y - startpos.y) >= Mathf.Abs(curpos.x - startpos.x) * 1.4f) { //Slide up and down (alike x axis) if (pos.z < -0.5f) { GetOperateSuit(OperateSuit.Right); } else if (pos.z < 0.5f) { GetOperateSuit(OperateSuit.MiddleZ); } else { GetOperateSuit(OperateSuit.Left); } direction = Vector3.back; suit = 1; } else { //Slide left and right (alike y axis) if (pos.y < -0.5f) { GetOperateSuit(OperateSuit.Down); } else if (pos.y < 0.5f) { GetOperateSuit(OperateSuit.MiddleY); } else { GetOperateSuit(OperateSuit.Up); } direction = Vector3.down; suit = 2; } break; case OperatePiece.Right: if (Mathf.Abs(curpos.y - startpos.y) >= Mathf.Abs(curpos.x - startpos.x) * 1.4f) { //Slide up and down (alike z axis) if (pos.x < -0.5f) { GetOperateSuit(OperateSuit.Front); } else if (pos.x < 0.5f) { GetOperateSuit(OperateSuit.MiddleX); } else { GetOperateSuit(OperateSuit.Back); } direction = Vector3.right; suit = 1; } else { //Slide left and right (alike y axis) if (pos.y < -0.5f) { GetOperateSuit(OperateSuit.Down); } else if (pos.y < 0.5f) { GetOperateSuit(OperateSuit.MiddleY); } else { GetOperateSuit(OperateSuit.Up); } direction = Vector3.down; suit = 2; } break; case OperatePiece.Top: if ((curpos.y - startpos.y) * (curpos.x - startpos.x) >= 0f) { //Slide alike x axis if (pos.z < -0.5f) { GetOperateSuit(OperateSuit.Right); } else if (pos.z < 0.5f) { GetOperateSuit(OperateSuit.MiddleZ); } else { GetOperateSuit(OperateSuit.Left); } direction = Vector3.back; suit = 2; } else { //Slide alike z axis if (pos.x < -0.5f) { GetOperateSuit(OperateSuit.Front); } else if (pos.x < 0.5f) { GetOperateSuit(OperateSuit.MiddleX); } else { GetOperateSuit(OperateSuit.Back); } direction = Vector3.left; suit = 3; } break; } while (Input.GetMouseButton(0)) { offset = new Vector2(Input.mousePosition.x - lastmousepos.x, Input.mousePosition.y - lastmousepos.y); if (suit.Equals(1)) { stepangle = offset.y * rlength; } else if (suit.Equals(2)) { stepangle = (offset.x * 0.86f + offset.y * 0.25f) * rlength; } else if (suit.Equals(3)) { stepangle = (offset.x * 0.86f - offset.y * 0.25f) * rlength; } rollangle += stepangle; foreach (SingleBox b in operatelist) { b.transform.RotateAround(Vector3.zero, direction, stepangle); } lastmousepos = Input.mousePosition; yield return(null); } float targetangle = 0f; if (rollangle > 0) { targetangle = ((int)((rollangle + 45f) / 90f)) * 90f; } else if (rollangle < 0) { targetangle = ((int)((rollangle - 45f) / 90f)) * 90f; } float offsetangle = targetangle - rollangle; //print ("<|||||>" + offsetangle + "<|||||>" + targetangle + "<|||||>" + rollangle); float speed = 90f / singleanitime; // bool toupper = true; if (offsetangle < 0) { // toupper = false; speed *= -1f; } bool finished = false; float curoffsetangle = 0f; float lastoffsetangle = 0f; float truthoffsetangle = 0f; while (!finished) { float o = speed * Time.deltaTime; curoffsetangle += o; if (Mathf.Abs(curoffsetangle) > Mathf.Abs(offsetangle)) { curoffsetangle = offsetangle; finished = true; //print ("Finished!!!!!!!"); } truthoffsetangle = curoffsetangle - lastoffsetangle; foreach (SingleBox b in operatelist) { b.transform.RotateAround(Vector3.zero, direction, truthoffsetangle); } lastoffsetangle = curoffsetangle; yield return(null); } foreach (SingleBox b in operatelist) { b.AdjustPos(); } rotating = false; }
public void ManualOperate(OperatePiece piece, Vector3 pos, GameObject singleboxobj) { // curobj = singleboxobj; StartCoroutine(DoJudge(piece, pos)); }