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