Exemplo n.º 1
0
    private List <int> MinosNuberList = new List <int>(); //ミノの出てくる順番を決めるリスト

    private void Awake()
    {
        //Listの初期設定
        for (int i = 0; i < NUBER_UPPER; i++)
        {
            MinosNuberList.Insert(i, i);
        }
        //Listのランダム化
        MinosNuberList = MinosNuberList.OrderBy(i => Guid.NewGuid()).ToList();

        //オリジナルミノを作ってないならこの後の処理へはいけない設定
        if (!OriginalCreate_Manager.getCreateBool())
        {
            return;
        }
        //オリジナルミノの配列を受け取る
        Mino_Original = OriginalCreate_Manager.getCreateArray();
        string MINO_OriginalType = OriginalCreate_Manager.getArrayType();

        //MINO_OriginalTypeの値に従って、ミノの配列を置き換える
        switch (MINO_OriginalType)
        {
        case "MINO_I":
            Array.Copy(Mino_Original, 0, Mino_I, 0, Mino_Original.Length);
            break;

        case "MINO_O":
            Array.Copy(Mino_Original, 0, Mino_O, 0, Mino_Original.Length);
            break;

        case "MINO_S":
            Array.Copy(Mino_Original, 0, Mino_S, 0, Mino_Original.Length);
            break;

        case "MINO_Z":
            Array.Copy(Mino_Original, 0, Mino_Z, 0, Mino_Original.Length);
            break;

        case "MINO_J":
            Array.Copy(Mino_Original, 0, Mino_J, 0, Mino_Original.Length);
            break;

        case "MINO_L":
            Array.Copy(Mino_Original, 0, Mino_L, 0, Mino_Original.Length);
            break;

        case "MINO_T":
            Array.Copy(Mino_Original, 0, Mino_T, 0, Mino_Original.Length);
            break;

        default:
            break;
        }
    }
              MOVE_THREE        = 3;               //ミノ3つ分の移動量

    /// <summary>
    /// ミノの回転処理
    /// </summary>
    public void Minos_Rotate(ref int[,] Stage, ref int Yheight, ref int XSidePos, Mino_Controller.MINOs_Array Mino, GameObject MINOs, GameObject GHOSTMINOs,
                             ref bool Lrotation, ref bool Rrotation)
    {
        if (Mino.MinoType == MINO_O && !OriginalCreate_Manager.getCreateBool())
        {
            return;
        }

        int Checked     = 0;
        int MINOsAngles = Mathf.FloorToInt(MINOs.transform.localEulerAngles.z);

        //ミノの角度の調整
        if (Rrotation)
        {
            switch (MINOsAngles)
            {
            case 0:
                MINOsAngles = ANGLE_B;
                break;

            case 90:
                MINOsAngles = ANGLE_A;
                break;

            case 180:
                MINOsAngles = ANGLE_D;
                break;

            case 270:
                MINOsAngles = ANGLE_C;
                break;
            }
        }
        if (Lrotation)
        {
            switch (MINOsAngles)
            {
            case 0:
                MINOsAngles = ANGLE_D;
                break;

            case 90:
                MINOsAngles = ANGLE_C;
                break;

            case 180:
                MINOsAngles = ANGLE_B;
                break;

            case 270:
                MINOsAngles = ANGLE_A;
                break;
            }
        }

        //配列のクローン配列を作成
        Array.Copy(Stage, 0, StageClone, 0, Stage.Length);
        var Objclone      = new GameObject[MINOARRAY_MAXSIZE, MINOARRAY_MAXSIZE];
        var GhostObjclone = new GameObject[MINOARRAY_MAXSIZE, MINOARRAY_MAXSIZE];

        //右回転
        if (Rrotation)
        {
            //NowArray配列(NowMinoのクローン配列)に右回転させたNowMino配列を入れる
            for (int i = 0; i < Mino.NowMino.GetLength(0); i++)
            {
                for (int j = 0; j < Mino.NowMino.GetLength(1); j++)
                {
                    NowArray[j, Mino.NowMino.GetLength(1) - 1 - i] = Mino.NowMino[i, j];
                }
            }
            //Iミノの位置調節
            if (Mino.MinoType == MINO_I && !OriginalCreate_Manager.getCreateBool())
            {
                if (MINOsAngles == ANGLE_B)
                {
                    XSidePos--;
                }
                if (MINOsAngles == ANGLE_D)
                {
                    XSidePos++;
                }
            }

            Checked = 0;
            //ゲームオブジェクトの位置調節
            for (int i = 0; i < NowArray.GetLength(0); i++)
            {
                for (int j = 0; j < NowArray.GetLength(1); j++)
                {
                    if (NowArray[i, j] == ARRAY_MINO)
                    {
                        Objclone[i, j]      = Mino.UseMino[Checked];
                        GhostObjclone[i, j] = Mino.UseMinoGhost[Checked];
                        Checked++;
                    }
                }
            }
            //回転後に壁やミノに埋まってないかチェックする
            Check_Rotation(Yheight, XSidePos, ref Rrotation);
            if (!Rrotation && !OriginalCreate_Manager.getCreateBool())
            {
                Rrotation = true;
                SuperRotationSystemCheck(MINOs, Mino.MinoType, ref Yheight, ref XSidePos, ref Lrotation, ref Rrotation);
            }

            //チェック後回転が出来なかったら終わり
            if (!Rrotation)
            {
                return;
            }

            //配列コピー
            Array.Copy(StageClone, 0, Stage, 0, StageClone.Length);
            Array.Copy(NowArray, 0, Mino.NowMino, 0, Mino.NowMino.Length);

            //ミノのゲームオブジェクト右回転
            MINOs.transform.eulerAngles      += new Vector3(0, 0, -ANGEL);
            GHOSTMINOs.transform.eulerAngles += new Vector3(0, 0, -ANGEL);
            Rrotation = false;
            //回転後のミノ(ゲームオブジェクト)の位置と角度の調節
            Placement_Adjustment(Stage, MINOs, GHOSTMINOs, Mino);
        }
        //左回転
        if (Lrotation)
        {
            //NowArray配列(NowMinoのクローン配列)に左回転させたNowMino配列を入れる
            for (int i = 0; i < Mino.NowMino.GetLength(0); i++)
            {
                for (int j = 0; j < Mino.NowMino.GetLength(1); j++)
                {
                    NowArray[j, i] = Mino.NowMino[i, Mino.NowMino.GetLength(1) - 1 - j];
                }
            }
            //Iミノの位置調節
            if (Mino.MinoType == MINO_I && !OriginalCreate_Manager.getCreateBool())
            {
                if (MINOsAngles == ANGLE_A)
                {
                    XSidePos++;
                }
                if (MINOsAngles == ANGLE_C)
                {
                    XSidePos--;
                }
            }

            Checked = 0;
            //ゲームオブジェクトの位置調節
            for (int i = 0; i < NowArray.GetLength(0); i++)
            {
                for (int j = 0; j < NowArray.GetLength(1); j++)
                {
                    if (NowArray[i, j] == ARRAY_MINO)
                    {
                        Objclone[i, j]      = Mino.UseMino[Checked];
                        GhostObjclone[i, j] = Mino.UseMinoGhost[Checked];
                        Checked++;
                    }
                }
            }

            //回転後に壁やミノに埋まってないかチェックする
            Check_Rotation(Yheight, XSidePos, ref Lrotation);
            if (!Lrotation && !OriginalCreate_Manager.getCreateBool())
            {
                Lrotation = true;
                SuperRotationSystemCheck(MINOs, Mino.MinoType, ref Yheight, ref XSidePos, ref Lrotation, ref Rrotation);
            }

            //チェック後回転が出来なかったら終わり
            if (!Lrotation)
            {
                return;
            }

            //配列コピー
            Array.Copy(StageClone, 0, Stage, 0, StageClone.Length);
            Array.Copy(NowArray, 0, Mino.NowMino, 0, Mino.NowMino.Length);

            //ミノのゲームオブジェクト左回転
            MINOs.transform.eulerAngles      += new Vector3(0, 0, ANGEL);
            GHOSTMINOs.transform.eulerAngles += new Vector3(0, 0, ANGEL);
            Lrotation = false;
            //回転後のミノ(ゲームオブジェクト)の位置と角度の調節
            Placement_Adjustment(Stage, MINOs, GHOSTMINOs, Mino);
        }
    }