Ejemplo n.º 1
0
    /// <summary>
    /// ドロップを詰める
    /// </summary>
    public void CloseDrop()
    {
        MDDropBlock emptyBlock = null;
        MDDrop      drop       = null;

        // 奥からチェック
        for (int i = m_Lines.Count - 1; i >= 0; i--)
        {
            foreach (MDDropBlock block in m_Lines[i])
            {
                if (block.ReservedDrop != null || (block.AttachedDrop != null && block.AttachedDrop.CurrentState != MDDrop.State.Vanish))
                {
                    // 上方向の空ブロック取得
                    emptyBlock = block.GetFarthestEmptyBlock(PlayAreaBlock.Dir.Up);

                    // 空ブロックを予約
                    if (emptyBlock != null)
                    {
                        // アタッチされてたドロップ
                        if (block.AttachedDrop != null)
                        {
                            drop = block.AttachedDrop;
                            block.Detach();
                            emptyBlock.Reserve(drop);

                            drop.IsValidVanish = true;

                            // 上詰め開始
                            drop.BeginClose();
                        }
                        // 予約されてたドロップ
                        else
                        {
                            drop = block.ReservedDrop;
                            block.CancelReserve();
                            emptyBlock.Reserve(drop);
                        }
                    }
                }
            }
        }
    }
Ejemplo n.º 2
0
    /// <summary>
    /// ドロップをプッシュ
    /// </summary>
    public void PushDrop(int row)
    {
        if (row < 0 || row >= Width || !IsValidPush())
        {
            return;
        }

        // 最下段のドロップがあるブロックの下のブロックを取得
        MDDropBlock block = GetMostUnderFullBlock(row, false);

        block = block == null ? m_Lines[m_Lines.Count - 1][row] : block.GetLink(PlayAreaBlock.Dir.Down) as MDDropBlock;

        for (int i = 0; i < m_PulledDrop.Count; i++)
        {
            // ターゲットブロックが無ければ空のラインを追加
            if (block == null)
            {
                AddEmptyLine(true);
                block = m_Lines[0][row];
            }

            // 消滅可能
            m_PulledDrop[i].IsValidVanish = true;
            // プッシュ登録
            m_PulledDrop[i].IsPushed = true;
            // 即座に消えるプッシュ
            m_PulledDrop[i].IsMatchPushed = m_PulledDrop.Count >= MDGame.Config.MinVanishMatchCount;

            // 予約
            block.Reserve(m_PulledDrop[i]);

            // プッシュ
            m_PushingDrops.Add(m_PulledDrop[i]);
            m_PulledDrop[i].BeginPush(Game.Player.transform.position + Vector3.down * i * BlockSize);

            block = block.GetLink(PlayAreaBlock.Dir.Down) as MDDropBlock;
        }
        m_PulledDrop.Clear();
    }