/// <summary>
    /// 位置と角度の調整
    /// </summary>
    /// <param name="Stage"></param>
    /// <param name="UseMino"></param>
    /// <param name="UseMinoGhost"></param>
    void Placement_Adjustment(int[,] Stage, GameObject MINOs, GameObject GHOSTMINOs, Mino_Controller.MINOs_Array Mino)
    {
        //親子関係を切る
        MINOs.transform.DetachChildren();
        GHOSTMINOs.transform.DetachChildren();
        //ゴーストをミノの位置と合わせる
        GHOSTMINOs.transform.position = MINOs.transform.position;
        int Checked = 0;

        //回転したミノとゴーストの位置&角度を調整
        for (int i = 0; i < Stage.GetLength(0); i++)
        {
            for (int j = 0; j < Stage.GetLength(1); j++)
            {
                if (Stage[i, j] == ARRAY_MINO)
                {
                    Mino.UseMino[Checked].transform.position      = new Vector3(j, -i, 0);
                    Mino.UseMino[Checked].transform.rotation      = Quaternion.Euler(0, 0, 0);
                    Mino.UseMino[Checked].transform.parent        = MINOs.transform;
                    Mino.UseMinoGhost[Checked].transform.position = new Vector3(j, -i, 0);
                    Mino.UseMinoGhost[Checked].transform.rotation = Quaternion.Euler(0, 0, 0);
                    Mino.UseMinoGhost[Checked].transform.parent   = GHOSTMINOs.transform;
                    Checked++;
                }
            }
        }
    }
Beispiel #2
0
    /// <summary>
    /// ミノを生成する処理
    /// </summary>
    /// <param name="Mino"></param>
    /// <param name="MINOs"></param>
    /// <param name="GHOSTMINOs"></param>
    /// <param name="NowColorObj"></param>
    /// <returns></returns>
    public Mino_Controller.MINOs_Array MinoCreate(Mino_Controller.MINOs_Array Mino, GameObject MINOs, GameObject GHOSTMINOs, GameObject NowColorObj)
    {
        //親子関係の初期化
        MINOs.transform.DetachChildren();
        GHOSTMINOs.transform.DetachChildren();
        //ミノとゴーストを初期位置に設定
        MINOs.transform.position      = new Vector3(POS_X, POS_Y, 0);
        GHOSTMINOs.transform.position = new Vector3(POS_X, POS_Y, 0);
        MINOs.transform.rotation      = Quaternion.identity;
        GHOSTMINOs.transform.rotation = Quaternion.identity;

        int CheckedMino = 0;

        //ミノとゴーストの形を作る
        for (int i = 0; i < Mino.NowMino.GetLength(0); i++)
        {
            for (int j = 0; j < Mino.NowMino.GetLength(1); j++)
            {
                if (Mino.NowMino[i, j] == ARRAY_MINO)
                {
                    //ミノ(ゲームオブジェクト)のゴーストの設定
                    Mino.UseMinoGhost[CheckedMino].SetActive(true);
                    Mino.UseMinoGhost[CheckedMino].transform.position = new Vector3(MINO_POSITION * (j + POS_ADD), -MINO_POSITION * i, 0);
                    Mino.UseMinoGhost[CheckedMino].transform.parent   = GHOSTMINOs.transform;
                    Mino.UseMinoGhost[CheckedMino].name = NowColorObj.name;
                    Mino.UseMinoGhost[CheckedMino].GetComponent <SpriteRenderer>().sprite = NowColorObj.GetComponent <SpriteRenderer>().sprite;
                    Mino.UseMinoGhost[CheckedMino].GetComponent <SpriteRenderer>().color  = new Color(1, 1, 1, ALFA);

                    //ミノ(ゲームオブジェクト)の設定
                    Mino.UseMino[CheckedMino]      = Instantiate(NowColorObj, transform.position, Quaternion.identity, MINOs.transform);
                    Mino.UseMino[CheckedMino].name = NowColorObj.name;
                    Mino.UseMino[CheckedMino].transform.position = new Vector3(MINO_POSITION * (j + POS_ADD), -MINO_POSITION * i, 0);

                    CheckedMino++;
                }
                if (CheckedMino == MAX_MINO)
                {
                    break;
                }
            }
            if (CheckedMino == MAX_MINO)
            {
                break;
            }
        }
        return(Mino);
    }
    /// <summary>
    /// ミノの回転を戻すために使うもの
    /// </summary>
    /// <param name="Mino"></param>
    /// <param name="MINOs"></param>
    /// <param name="Lrotation"></param>
    /// <param name="Rrotation"></param>
    public void Rotation_Return(ref Mino_Controller.MINOs_Array Mino, GameObject MINOs, ref bool Lrotation, ref bool Rrotation)
    {
        Array.Clear(NowArray, 0, NowArray.Length);

        if (Rrotation && Mino.MinoType != MINO_O)
        {
            //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];
                }
            }
            //配列コピー
            Array.Copy(NowArray, 0, Mino.NowMino, 0, Mino.NowMino.Length);

            //ミノのゲームオブジェクト右回転
            MINOs.transform.eulerAngles += new Vector3(0, 0, -ANGEL);
            Rrotation = false;
        }
        if (Lrotation && Mino.MinoType != MINO_O)
        {
            //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];
                }
            }
            //配列コピー
            Array.Copy(NowArray, 0, Mino.NowMino, 0, Mino.NowMino.Length);

            //ミノのゲームオブジェクト右回転
            MINOs.transform.eulerAngles += new Vector3(0, 0, ANGEL);
            Lrotation = false;
        }
    }
Beispiel #4
0
    /// <summary>
    /// 生成するミノを選択する処理
    /// </summary>
    /// <param name="Mino"></param>
    /// <param name="ColorBlock"></param>
    /// <param name="NowColorObj"></param>
    /// <param name="DebugMino"></param>
    public Mino_Controller.MINOs_Array MinoSelect(Mino_Controller.MINOs_Array Mino, ref GameObject[] ColorBlock, ref GameObject NowColorObj, bool DebugMino)
    {
        ////ポインタが配列上7に来たら配列ポインタを先頭に戻す
        if (m_MinoNumber == NUBER_UPPER)
        {
            m_MinoNumber = 0;
        }

        //加算
        if (m_MinoNumber != NUBER_UPPER)
        {
            if (!DebugMino)
            {
                Mino.MinoType = MinosNuberList[m_MinoNumber];
            }
            m_MinoNumber++;
        }
        //ミノの色に合わせたゲームオブジェクトを入れる
        NowColorObj = ColorBlock[Mino.MinoType];
        //配列のコピー
        Mino_ArrayCopy(ref Mino.NowMino, Mino.MinoType);
        return(Mino);
    }
              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);
        }
    }
    public void Mino_hold(ref Mino_Controller.MINOs_Array Mino, GameObject MINOs, GameObject GHOSTMINOs, ref bool MinoholdOnce)
    {
        //HoldMinosを最大サイズへ
        HoldMinos.transform.localScale = new Vector3(MAXIMUM_SCALE, MAXIMUM_SCALE, 0);
        //MINOsをHoldMinoの位置まで持ってくる
        MINOs.transform.position = HoldMinos.transform.position;
        HoldMinos.transform.DetachChildren();
        MINOs.transform.DetachChildren();

        //初回ホールド時の処理
        if (m_Holdkeep == false)
        {
            //ミノのタイプを保存
            Mino_BeforeType = Mino.MinoType;
            //配列コピー
            Array.Copy(Mino.NowMino, 0, HoldMino_Array, 0, Mino.NowMino.Length);
            HoldMino_Sprite = GHOSTMINOs.transform.GetChild(0).GetComponent <SpriteRenderer>().sprite;

            //ホールドしたミノを持つ、MINOsからゲームオブジェクトをもらってくる
            for (int i = 0; i < HoldMino_Obj.Length; i++)
            {
                Mino.UseMino[i].transform.parent = HoldMinos.transform;
                HoldMino_Obj[i] = HoldMinos.transform.GetChild(i).gameObject;
                GHOSTMINOs.transform.GetChild(i).gameObject.SetActive(false);
            }

            //HoldMinosを縮小させる
            HoldMinos.transform.localScale = new Vector3(MINIMUM_SCALE, MINIMUM_SCALE, 0);
            m_Holdkeep = true;
            GM.state   = Game_Manager.State.CREATE_MINO;
            return;
        }
        else if (m_Holdkeep == true && MinoholdOnce == true) //二回目以上のホールド処理
        {
            MinoholdOnce = false;

            //ミノのタイプを入れ替える
            int tmp = Mino_BeforeType;
            Mino_BeforeType = Mino.MinoType;
            Mino.MinoType   = tmp;

            int[,] tmp_Array = new int[Mino.NowMino.GetLength(0), Mino.NowMino.GetLength(1)];
            Array.Copy(HoldMino_Array, 0, tmp_Array, 0, HoldMino_Array.Length);
            //ホールドしたミノを保存領域の配列にコピー
            Array.Copy(Mino.NowMino, 0, HoldMino_Array, 0, Mino.NowMino.Length);
            //ホールドしてあったミノを NowMino配列へコピー
            Array.Copy(tmp_Array, 0, Mino.NowMino, 0, tmp_Array.Length);

            //ホールドしたミノ(GameObject)をMINOsからもらってくる
            for (int i = 0; i < HoldMino_Obj.Length; i++)
            {
                Mino.UseMino[i].transform.parent = HoldMinos.transform;
            }
            //ホールドしてあったミノ(GameObject)をMINOsへ渡す
            for (int i = 0; i < HoldMino_Obj.Length; i++)
            {
                Mino.UseMino[i] = HoldMino_Obj[i];
                Mino.UseMino[i].transform.parent = MINOs.transform;
                HoldMino_Obj[i] = HoldMinos.transform.GetChild(i).gameObject;
            }
            HoldMino_Sprite = MINOs.transform.GetChild(0).GetComponent <SpriteRenderer>().sprite;
            int CheckedMino = 0;
            //位置調整
            for (int i = 0; i < Mino.NowMino.GetLength(0); i++)
            {
                for (int j = 0; j < Mino.NowMino.GetLength(1); j++)
                {
                    if (Mino.NowMino[i, j] == ARRAY_MINO)
                    {
                        //GHOSTMINOsのスプライトをホールドしてあったミノのスプライトに変える
                        GHOSTMINOs.transform.GetChild(CheckedMino).GetComponent <SpriteRenderer>().sprite = HoldMino_Sprite;
                        GHOSTMINOs.transform.GetChild(CheckedMino).name = HoldMino_Sprite.name;
                        //GHOSTMINOsの子のゲームオブジェクトをホールドしてあったミノの形に変形させる
                        GHOSTMINOs.transform.GetChild(CheckedMino).localPosition = new Vector3(j - POS_ADJUSTMENT, -i + POS_ADJUSTMENT, 0);

                        CheckedMino++;
                    }
                    if (CheckedMino == MINO_MAX)
                    {
                        break;
                    }
                }
                if (CheckedMino == MINO_MAX)
                {
                    break;
                }
            }
            //HoldMinosを縮小させる
            HoldMinos.transform.localScale = new Vector3(MINIMUM_SCALE, MINIMUM_SCALE, 0);
            //初期位置にセット
            MINOs.transform.position      = new Vector3(POS_X, POS_Y, 0);
            GHOSTMINOs.transform.position = new Vector3(POS_X, POS_Y, 0);
        }
    }
    /// <summary>
    /// ミノを盤面にセットし、処理が滞りなく終わったかどうかをbool型の値を返す
    /// </summary>
    public bool SetCheak(ref int[,] Stage, Mino_Controller.MINOs_Array Mino, int Yheight, int XSidePos, GameObject[,] SetMinoPos)
    {
        if (GM.state != Game_Manager.State.ARRAYSET_MINO)
        {
            return(false);
        }

        int ArrayY      = 0;
        int ArrayX      = 0;
        int CheckedMino = 0;

        //Stage配列内のミノ位置を初期化
        for (int i = 0; i < Stage.GetLength(0); i++)
        {
            for (int j = 0; j < Stage.GetLength(1); j++)
            {
                if (Stage[i, j] == ARRAY_MINO)
                {
                    Stage[i, j] = ARRAY_NONE;
                }
            }
        }
        //Stage配列内にセット
        for (int i = Yheight; i < Stage.GetLength(0); i++)
        {
            for (int j = XSidePos; j < Mino.NowMino.GetLength(0) + XSidePos; j++)
            {
                //ミノを見つけたらStage配列にセットする
                if (Mino.NowMino[ArrayY, ArrayX] == ARRAY_MINO)
                {
                    if (Stage[i, j] != ARRAY_NONE)
                    {
                        GM.state = Game_Manager.State.GAMEOVER;
                        return(false);
                    }

                    Stage[i, j]      = ARRAY_SETMINO;
                    SetMinoPos[i, j] = Mino.UseMino[CheckedMino];

                    CheckedMino++;
                }
                //異常がなかったら処理を終了させる
                if (CheckedMino == MINO_MAXSIZE)
                {
                    return(true);
                }

                ArrayX++;
                //Stage配列とNowMino配列の位置を合わせる処理
                if (ArrayX >= Mino.NowMino.GetLength(1))
                {
                    ArrayY++;
                    ArrayX = 0;

                    //NowMino配列の上限
                    if (ArrayY >= Mino.NowMino.GetLength(0))
                    {
                        return(false);
                    }
                    break;
                }
            }
        }
        return(false);
    }