public void updateGhost() { for (int i = dropClone.gameObject.transform.childCount - 1; i >= 0; i--) { Destroy(dropClone.gameObject.transform.GetChild(i).gameObject); } GameObject ghost = Instantiate(this.gameObject, this.gameObject.transform.position, this.gameObject.transform.rotation, dropClone.transform); MinoController m = ghost.GetComponent <MinoController> (); Destroy(m); while (this.gameObject.transform.GetComponentInParent <Mino_Board> ().isCurrentSpaceOK(ghost)) { ghost.gameObject.transform.position += new Vector3(0, -1, 0); } ghost.gameObject.transform.position += new Vector3(0, 1, 0); }
public void displayNextMino() { for (int i = 0; i < this.gameObject.transform.childCount; i++) { GameObject child = this.gameObject.transform.GetChild(i).gameObject; if (child.transform.childCount > 0) { // print ("CC: " + child.transform.childCount); for (int j = child.transform.childCount - 1; j >= 0; j--) { Destroy(child.transform.GetChild(j).gameObject); } } } for (int i = 0; i < this.gameObject.transform.childCount; i++) { GameObject child = this.gameObject.transform.GetChild(i).gameObject; GameObject selectMino = minos [nextMinoes [i + 1]]; selectMino = Instantiate(selectMino, child.transform.position, Quaternion.identity, child.transform); MinoController m = selectMino.GetComponent <MinoController> (); Destroy(m); } }
// ユーザの操作を受け付ける。 private void UserInput() { int pushTime; // 左キー pushTime = this.keyDirector.GetKeyPushTime(KeyCode.LeftArrow); // 3フレーム単位で受け付ける。 if (pushTime % 3 == 1) { bool isMovable = true; foreach (GameObject block in mino) { // 移動後の座標 int blockX = block.GetComponent <MinoController>().blockX - 1; int blockY = block.GetComponent <MinoController>().blockY; if (blockX < 0 || field[blockX, blockY] != null) { isMovable = false; break; } } // 移動可能であれば左へ1マス移動する。 if (isMovable) { this.Move(-1, 0); } } // 右キー pushTime = this.keyDirector.GetKeyPushTime(KeyCode.RightArrow); if (pushTime % 3 == 1) { bool isMovable = true; foreach (GameObject block in mino) { int blockX = block.GetComponent <MinoController>().blockX + 1; int blockY = block.GetComponent <MinoController>().blockY; if (blockX > MAX_BLOCK_X - 1 || field[blockX, blockY] != null) { isMovable = false; break; } } if (isMovable) { this.Move(1, 0); } } // 下キー pushTime = this.keyDirector.GetKeyPushTime(KeyCode.DownArrow); if (pushTime % 3 == 1) { // 接地判定 bool isMovable = true; foreach (GameObject block in mino) { int blockX = block.GetComponent <MinoController>().blockX; int blockY = block.GetComponent <MinoController>().blockY + 1; // 接地した場合 if (blockY > MAX_BLOCK_Y - 1 || field[blockX, blockY] != null) { isMovable = false; this.Landing(); break; } } if (isMovable) { this.Move(0, 1); } // 落下までの時間を設定する。 this.SetFallCount(); this.score += 10; } // 上キー (ハードドロップ) if (Input.GetKeyDown(KeyCode.UpArrow)) { // 接地判定 bool isMovable = true; int moveValue = 0; while (isMovable) { foreach (GameObject block in mino) { int blockX = block.GetComponent <MinoController>().blockX; int blockY = block.GetComponent <MinoController>().blockY + 1 + moveValue; // 接地した場合 if (blockY > MAX_BLOCK_Y - 1 || field[blockX, blockY] != null) { isMovable = false; break; } } moveValue++; } this.Move(0, moveValue - 1); this.Landing(); // 落下までの時間を設定する。 this.SetFallCount(); this.score += 100; } // Zキー (ホールド) if (Input.GetKeyDown(KeyCode.Z)) { // ホールドができる状態であれば if (canHold) { List <GameObject> newMino; // 初めてホールドする場合 if (!holdDirector.HasHold()) { // ネクストを次のミノとする。 // 新しいミノを生成する。 newMino = this.nextMinoDirector.GetNextMino(); } else { int holdMinoKind = holdDirector.GetMinoKind(); // ホールド中のミノを次のミノとする。 newMino = minoPrefub.GetComponent <MinoPrefub>().CreateMino(holdMinoKind, true); } // ミノをホールドする。 holdDirector.DoHold(mino); // 新しいミノを設定する。 mino = newMino; // ホールドを不可とする。 this.canHold = false; } // 落下までの時間を設定する。 this.SetFallCount(); } // Xキー (左回転) if (Input.GetKeyDown(KeyCode.X)) { // Oミノのみ回転させない。 if (mino[0].GetComponent <MinoController>().minoKind != 1) { bool isMovable = true; List <Vector2Int> rotatedPos = new List <Vector2Int>(); foreach (GameObject block in mino) { MinoController mc = block.GetComponent <MinoController>(); // 回転軸の座標 int axisX = mc.blockX - mc.offsetBlockX; int axisY = mc.blockY - mc.offsetBlockY; // 回転後のoffet座標 (X <- -Y, Y <- X) int rotatedX = axisX - mc.offsetBlockY; int rotatedY = axisY + mc.offsetBlockX; // 衝突判定 if (rotatedX < 0 || rotatedX > MAX_BLOCK_X - 1 || rotatedY < 0 || rotatedY > MAX_BLOCK_Y - 1) { isMovable = false; break; } if (field[rotatedX, rotatedY] != null) { isMovable = false; break; } } // 衝突チェック if (isMovable) { foreach (GameObject block in mino) { MinoController mc = block.GetComponent <MinoController>(); // 回転軸の座標 int axisX = mc.blockX - mc.offsetBlockX; int axisY = mc.blockY - mc.offsetBlockY; int rotatedOffsetX = -mc.offsetBlockY; int rotatedOffsetY = +mc.offsetBlockX; // 回転後の座標 mc.blockX = axisX - mc.offsetBlockY; mc.blockY = axisY + mc.offsetBlockX; // 回転後のoffet座標 (X <- -Y, Y <- X) mc.offsetBlockX = rotatedOffsetX; mc.offsetBlockY = rotatedOffsetY; } } } } // Cキー (右回転) else if (Input.GetKeyDown(KeyCode.C)) { // Oミノのみ回転させない。 if (mino[0].GetComponent <MinoController>().minoKind != 1) { bool isMovable = true; List <Vector2Int> rotatedPos = new List <Vector2Int>(); foreach (GameObject block in mino) { MinoController mc = block.GetComponent <MinoController>(); // 回転軸の座標 int axisX = mc.blockX - mc.offsetBlockX; int axisY = mc.blockY - mc.offsetBlockY; // 回転後のoffet座標 (X <- -Y, Y <- X) int rotatedX = axisX + mc.offsetBlockY; int rotatedY = axisY - mc.offsetBlockX; // 衝突判定 if (rotatedX < 0 || rotatedX > MAX_BLOCK_X - 1 || rotatedY < 0 || rotatedY > MAX_BLOCK_Y - 1) { isMovable = false; break; } if (field[rotatedX, rotatedY] != null) { isMovable = false; break; } } // 衝突チェック if (isMovable) { foreach (GameObject block in mino) { MinoController mc = block.GetComponent <MinoController>(); // 回転軸の座標 int axisX = mc.blockX - mc.offsetBlockX; int axisY = mc.blockY - mc.offsetBlockY; int rotatedOffsetX = mc.offsetBlockY; int rotatedOffsetY = -mc.offsetBlockX; // 回転後の座標 mc.blockX = axisX + mc.offsetBlockY; mc.blockY = axisY - mc.offsetBlockX; // 回転後のoffet座標 (X <- -Y, Y <- X) mc.offsetBlockX = rotatedOffsetX; mc.offsetBlockY = rotatedOffsetY; } } } } }