Ejemplo n.º 1
0
    // 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;
    }
Ejemplo n.º 2
0
 public void ManualOperate(OperatePiece piece, Vector3 pos, GameObject singleboxobj)
 {
     //		curobj = singleboxobj;
     if (formularing || rotating || rotatejudged || flipjudged || flipping) {
         return;
     }
     StartCoroutine (DoJudge (piece, pos));
 }
Ejemplo n.º 3
0
    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;
    }
Ejemplo n.º 4
0
 public void ManualOperate(OperatePiece piece, Vector3 pos, GameObject singleboxobj)
 {
     //		curobj = singleboxobj;
     StartCoroutine (DoJudge (piece, pos));
 }
Ejemplo n.º 5
0
    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;
    }
Ejemplo n.º 6
0
    public void ManualOperate(OperatePiece piece, Vector3 pos, GameObject singleboxobj)
    {
//		curobj = singleboxobj;
        StartCoroutine(DoJudge(piece, pos));
    }