void PlayLayer::checkAndRemoveChain() { //log("checkAndRemoveChain"); SushiSprite *sushi = m_srcSushi; if (!sushi) { return; } std::list<SushiSprite*> sameList; FloodSeedFill(sushi->getRow(),sushi->getCol(),sushi); for (int i = 0; i < m_width*m_height; i++) { if (m_matrix[i]->getIgnoreCheck()) { sameList.push_back(m_matrix[i]); } } m_srcSushi = nullptr;//不然有上个源结点的bug 可以弄个新的功能 if (sameList.size()>2) { removeSushi(sameList); } return; /* // start count chain std::list<SushiSprite *> colChainList; getColChain(sushi, colChainList); std::list<SushiSprite *> rowChainList; getRowChain(sushi, rowChainList); std::list<SushiSprite *> &longerList = colChainList.size() > rowChainList.size() ? colChainList : rowChainList; if (longerList.size() == 3) { removeSushi(longerList); return; } if (longerList.size() > 3) { //TODO: make a special sushi can clean a line, and remove others removeSushi(longerList); return; }*/ }
void PlayLayer::checkAndRemoveChain() { SushiSprite *sushi; // Thiết lập cờ IgnoreCheck = false for (int i = 0; i < m_height * m_width; i++) { sushi = m_matrix[i]; if (!sushi) { continue; } sushi->setIgnoreCheck(false); } // 2. Kiểm lại for (int i = 0; i < m_height * m_width; i++) { sushi = m_matrix[i]; if (!sushi) { continue; } if (sushi->getIsNeedRemove()) { continue; // Bỏ qua Sushi đã gắn cờ "cần loại bỏ" } if (sushi->getIgnoreCheck()) { continue; // Bỏ qua Sushi đã gắn cờ "bỏ qua kiểm tra" } // Đếm cuỗi std::list<SushiSprite *> colChainList; getColChain(sushi, colChainList); std::list<SushiSprite *> rowChainList; getRowChain(sushi, rowChainList); std::list<SushiSprite *> &longerList = colChainList.size() > rowChainList.size() ? colChainList : rowChainList; if (longerList.size() < 3) { continue;// Bỏ qua } std::list<SushiSprite *>::iterator itList; bool isSetedIgnoreCheck = false; for (itList = longerList.begin(); itList != longerList.end(); itList++) { sushi = (SushiSprite *)*itList; if (!sushi) { continue; } if (longerList.size() > 3) { // Sushi đặc biệt khi chuỗi có 4 hoặc 5 Sushi if (sushi == m_srcSushi || sushi == m_destSushi) { isSetedIgnoreCheck = true; sushi->setIgnoreCheck(true); sushi->setIsNeedRemove(false); // Tùy theo hướng di chuyển mà tạo ra loại Sushi sọc dọc hay ngang sushi->setDisplayMode(m_movingVertical ? DISPLAY_MODE_VERTICAL : DISPLAY_MODE_HORIZONTAL); continue; } } markRemove(sushi); // Đánh dấu cần loại bỏ sushi } // Chuỗi đặc biệt, khi Sushi rơi, sinh ra tự nhiên if (!isSetedIgnoreCheck && longerList.size() > 3) { sushi->setIgnoreCheck(true); sushi->setIsNeedRemove(false); sushi->setDisplayMode(m_movingVertical ? DISPLAY_MODE_VERTICAL : DISPLAY_MODE_HORIZONTAL); } } // 3.Loại bỏ removeSushi(); }