Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
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);
        }
    }
Exemplo n.º 3
0
    // ユーザの操作を受け付ける。
    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;
                    }
                }
            }
        }
    }