示例#1
0
    private Tetrimino CreateTetrimino()
    {
        var idx       = UnityEngine.Random.Range(0, Data.TetriminoPrefab.Length);
        var tetrimino = GameObject.Instantiate(Data.TetriminoPrefab[idx]).GetComponent <Tetrimino>();

        // Tetriminoのイベント登録
        tetrimino.OnLand = (blocks) =>
        {
            // 親子関係の解消
            foreach (var block in blocks)
            {
                block.transform.parent = null;
            }

            // テトリミノの削除
            Destroy(tetrimino.gameObject);

            // 次のテトリミノの操作へ移る
            Next();
        };

        tetrimino.OnRotateChecked = (positions) =>
        {
            var store = StoreManager.Instance.BoardStore;

            foreach (var position in positions)
            {
                if (position.x < 0 || position.x >= Data.Columns)
                {
                    return(false);
                }
                if (position.y < 0 || position.y >= Data.Rows)
                {
                    return(false);
                }

                var flag = TetrisBitBoard.GetPositionFlag(store.BitBoard, position);

                if (flag == 1)
                {
                    return(false);
                }
            }

            return(true);
        };

        return(tetrimino);
    }
示例#2
0
    private void Next()
    {
        var bitboard  = StoreManager.Instance.BoardStore.BitBoard;
        var typeboard = StoreManager.Instance.BoardStore.TypeBoard;

        // 置かれたBlockのビットを立てる
        foreach (var block in current.Blocks)
        {
            TetrisBitBoard.SetPositionFlag(ref bitboard, block);
            TetrisBitBoard.SetTypeFlag(ref typeboard, block);

            // 置いたブロックを保存
            blocks[block.Position.y * Data.Columns + block.Position.x] = block;
        }

        var removeRow = TetrisBitBoard.CheckLine(bitboard, typeboard);

        // Lineの更新
        UpdateScoreAndLine(removeRow.Count);

        // ブロックの状態を更新
        UpdateView(removeRow);

        // ゲームが終了したか判定
        if (IsFinished(bitboard))
        {
            current = next = null;

            OnFinished();
            return;
        }

        // 現在,次のテトリミノの更新
        current = next;
        next    = CreateTetrimino();

        // 現在の状態を保存
        TetrisBitBoard.SaveCurrentData(current, next, bitboard, typeboard);

        // 次の操作へ
        current.Launch();
        next.Standby();
    }