/// <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++; } } } }
/// <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; } }
/// <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); }