void PlayLayer::swapSushi() { //log("swapSushi"); m_isAnimationing = true; m_isTouchEnable = false; if (!m_srcSushi || !m_destSushi) { m_movingVertical = true; return; } Point posOfSrc = m_srcSushi->getPosition(); Point posOfDest = m_destSushi->getPosition(); float time = 0.2; // 1.交换 m_srcSushi 与 m_destSushi 在寿司矩阵的行列号, 和 m_srcSushi 与 m_destSushi 本身内容 m_matrix[m_srcSushi->getRow()*m_width + m_srcSushi->getCol()] = m_destSushi; m_matrix[m_destSushi->getRow()*m_width + m_destSushi->getCol()] = m_srcSushi; int tmpRow = m_srcSushi->getRow(); int tmpCol = m_srcSushi->getCol(); m_srcSushi->setRow(m_destSushi->getRow()); m_srcSushi->setCol(m_destSushi->getCol()); m_destSushi->setRow(tmpRow); m_destSushi->setCol(tmpCol); // 2.检测交换后的 m_srcSushi 与 m_destSushi 在横纵方向上是否满足消除条件 std::list<SushiSprite*> ColChainListOfFirst; getColChain(m_srcSushi, ColChainListOfFirst); std::list<SushiSprite*> RowChainListOfFirst; getRowChain(m_srcSushi, RowChainListOfFirst); std::list<SushiSprite*> ColChainListOfSecond; getColChain(m_destSushi, ColChainListOfSecond); std::list<SushiSprite*> RowChainListOfSecond; getRowChain(m_destSushi, RowChainListOfSecond); if ( ColChainListOfFirst.size() >= 3 || RowChainListOfFirst.size() >= 3 || ColChainListOfSecond.size() >= 3 || RowChainListOfSecond.size() >= 3 ) { m_srcSushi->runAction(MoveTo::create(time, posOfDest)); m_destSushi->runAction(MoveTo::create(time, posOfSrc)); return; } m_matrix[m_srcSushi->getRow() * m_width + m_srcSushi->getCol()] = m_destSushi; m_matrix[m_destSushi->getRow() * m_width + m_destSushi->getCol()] = m_srcSushi; tmpRow = m_srcSushi->getRow(); tmpCol = m_srcSushi->getCol(); m_srcSushi->setRow(m_destSushi->getRow()); m_srcSushi->setCol(m_destSushi->getCol()); m_destSushi->setRow(tmpRow); m_destSushi->setCol(tmpCol); m_srcSushi->runAction(Sequence::create( MoveTo::create(time, posOfDest), MoveTo::create(time, posOfSrc), NULL)); m_destSushi->runAction(Sequence::create( MoveTo::create(time, posOfSrc), MoveTo::create(time, posOfDest), NULL)); }
void PlayLayer::swapSushi() { m_isAnimationing = true; // cho phép Animation m_isTouchEnable = false; // Dừng Touch if (!m_srcSushi || !m_destSushi) { // Ko tồn tại 1 trong 2 Sushi để đảo nhau m_movingVertical = true; return; } // Lấy tọa độ Point của 2 loại Sushi được đảo Point posOfSrc = m_srcSushi->getPosition(); Point posOfDest = m_destSushi->getPosition(); float time = 0.2; // 1.Hoán vị hàng, cột 2 Sushi trong ma trận, tham số quan trọng nhất là Row và Col của Sushi m_matrix[m_srcSushi->getRow() * m_width + m_srcSushi->getCol()] = m_destSushi; m_matrix[m_destSushi->getRow() * m_width + m_destSushi->getCol()] = m_srcSushi; int tmpRow = m_srcSushi->getRow(); int tmpCol = m_srcSushi->getCol(); m_srcSushi->setRow(m_destSushi->getRow()); m_srcSushi->setCol(m_destSushi->getCol()); m_destSushi->setRow(tmpRow); m_destSushi->setCol(tmpCol); // 2.Kiểm tra xem có dãy >= 3 Sushi giống nhau được tạo ra bởi 2 Sushi sau hoán đổi này ko std::list<SushiSprite *> colChainListOfFirst; getColChain(m_srcSushi, colChainListOfFirst); std::list<SushiSprite *> rowChainListOfFirst; getRowChain(m_srcSushi, rowChainListOfFirst); std::list<SushiSprite *> colChainListOfSecond; getColChain(m_destSushi, colChainListOfSecond); std::list<SushiSprite *> rowChainListOfSecond; getRowChain(m_destSushi, rowChainListOfSecond); if (colChainListOfFirst.size() >= 3 || rowChainListOfFirst.size() >= 3 || colChainListOfSecond.size() >= 3 || rowChainListOfSecond.size() >= 3) { // Animation đảo vị trí cho nhau m_srcSushi->runAction(MoveTo::create(time, posOfDest)); m_destSushi->runAction(MoveTo::create(time, posOfSrc)); return; } // 3.Không tạo được chuỗi, Đảo trở lại vị trí cũ m_matrix[m_srcSushi->getRow() * m_width + m_srcSushi->getCol()] = m_destSushi; m_matrix[m_destSushi->getRow() * m_width + m_destSushi->getCol()] = m_srcSushi; tmpRow = m_srcSushi->getRow(); tmpCol = m_srcSushi->getCol(); m_srcSushi->setRow(m_destSushi->getRow()); m_srcSushi->setCol(m_destSushi->getCol()); m_destSushi->setRow(tmpRow); m_destSushi->setCol(tmpCol); // Di chuyển 2 bước, đảo vị trí, rồi trở lại vị trí cũ m_srcSushi->runAction(Sequence::create( MoveTo::create(time, posOfDest), MoveTo::create(time, posOfSrc), NULL)); m_destSushi->runAction(Sequence::create( MoveTo::create(time, posOfSrc), MoveTo::create(time, posOfDest), NULL)); }
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(); }
void BallMap::checkAndRemoveChain() { BallSprite *ball; // 1. reset ingnore flag for (int i = 0; i < m_size.height * m_size.width; i++) { ball = m_matrix[i]; if (!ball) { continue; } ball->setIgnoreCheck(false); } // 2. check chain std::list<BallSprite *> longerList; for (int i = 0; i < m_size.height * m_size.width; i++) { ball = m_matrix[i]; if (!ball) { continue; } if (ball->getIsNeedRemove()) { continue;// 已标记过的跳过检查 } if (ball->getIgnoreCheck()) { // continue;// 新变化的特殊寿司,不消除 } // start count chain std::list<BallSprite *> colChainList; getColChain(ball, colChainList); if (colChainList.size() >= 3) { longerList.merge(colChainList); } std::list<BallSprite *> rowChainList; getRowChain(ball, rowChainList); if (rowChainList.size() >= 3) { longerList.merge(rowChainList); } if (longerList.size() < 3) { m_isNeedCheckSelf = false; TwoBallPos towBall = this->selfCheckHaveMore(); if (isPointEqual(towBall.srcPos, towBall.destPos)) { this->removeAllBall(true); } continue;// 小于3个不消除 } std::list<BallSprite *>::iterator itList; // longerList.sort(); //sort the list // longerList.erase( unique( longerList.begin(), longerList.end() ), longerList.end());//Remove duplicate list values for (itList = longerList.begin(); itList != longerList.end(); itList++) { ball = dynamic_cast<BallSprite*>(*itList); if (!ball) { continue; } markRemove(ball); } // 如何是自由掉落产生的4消, 取最后一个变化为特殊寿司 if (longerList.size() > 3) { ball->setIgnoreCheck(true); ball->setIsNeedRemove(false); ball->setDisplayMode(DISPLAY_MODE_FOUR); } } if (longerList.size() >= 3) { m_readyRemoveList = longerList; } // 3.消除标记了的寿司 removeBall(); }
void GameLayer::checkAndRemoveChain() { Monster *monster; // 1. reset ingnore flag for (int i = 0; i < m_height * m_width; i++) { monster = m_matrix[i]; if (!monster) { continue; } monster->setIgnoreCheck(false); } // 2. check chain for (int i = 0; i < m_height * m_width; i++) { monster = m_matrix[i]; if (!monster) { continue; } if (monster->getIsNeedRemove()) { continue;// 已标记过的跳过检查 } if (monster->getIgnoreCheck()) { continue;// 新变化的特殊monster,不消除 } // start count chain std::list<Monster *> colChainList; getColChain(monster, colChainList); std::list<Monster *> rowChainList; getRowChain(monster, rowChainList); std::list<Monster *> &longerList = colChainList.size() > rowChainList.size() ? colChainList : rowChainList; if (longerList.size() < 3) { continue;// 小于3个不消除 } countRemoveMonster = longerList.size(); std::list<Monster *>::iterator itList; bool isSetedIgnoreCheck = false; for (itList = longerList.begin(); itList != longerList.end(); itList++) { monster = (Monster *)*itList; if (!monster) { continue; } if (longerList.size() > 3) { if (monster == m_srcMonster || monster == m_destMonster) { isSetedIgnoreCheck = true; monster->setIgnoreCheck(true); //4消特殊元素先关闭 monster->setIsNeedRemove(true); //monster->setDisplayMode(m_movingVertical ? DISPLAY_MODE_VERTICAL : DISPLAY_MODE_HORIZONTAL); continue; } } markRemove(monster); } // 如何是自由掉落产生的4消, 取最后一个变化为特殊怪物 if (!isSetedIgnoreCheck && longerList.size() > 3) { monster->setIgnoreCheck(true); //4消特殊元素先关闭 monster->setIsNeedRemove(true); //monster->setDisplayMode(m_movingVertical ? DISPLAY_MODE_VERTICAL : DISPLAY_MODE_HORIZONTAL); } } // 3.消除标记了的怪物 removeMonster(); // 4.计算消除的分数 //计算消除得分 calculateScore(countRemoveMonster); }
void GameLayer::swapMonster() { m_isAnimationing = true; m_isTouchEnable = false; if (!m_srcMonster || !m_destMonster) { m_movingVertical = true; return; } Point posOfSrc = m_srcMonster->getPosition(); Point posOfDest = m_destMonster->getPosition(); float time = 0.2; // 1.swap in matrix m_matrix[m_srcMonster->getRow() * m_width + m_srcMonster->getCol()] = m_destMonster; m_matrix[m_destMonster->getRow() * m_width + m_destMonster->getCol()] = m_srcMonster; int tmpRow = m_srcMonster->getRow(); int tmpCol = m_srcMonster->getCol(); m_srcMonster->setRow(m_destMonster->getRow()); m_srcMonster->setCol(m_destMonster->getCol()); m_destMonster->setRow(tmpRow); m_destMonster->setCol(tmpCol); // 2.check for remove able std::list<Monster *> colChainListOfFirst; getColChain(m_srcMonster, colChainListOfFirst); std::list<Monster *> rowChainListOfFirst; getRowChain(m_srcMonster, rowChainListOfFirst); std::list<Monster *> colChainListOfSecond; getColChain(m_destMonster, colChainListOfSecond); std::list<Monster *> rowChainListOfSecond; getRowChain(m_destMonster, rowChainListOfSecond); if (colChainListOfFirst.size() >= 3 || rowChainListOfFirst.size() >= 3 || colChainListOfSecond.size() >= 3 || rowChainListOfSecond.size() >= 3) { // just swap m_srcMonster->runAction(MoveTo::create(time, posOfDest)); m_destMonster->runAction(MoveTo::create(time, posOfSrc)); return; } // 3.no chain, swap back m_matrix[m_srcMonster->getRow() * m_width + m_srcMonster->getCol()] = m_destMonster; m_matrix[m_destMonster->getRow() * m_width + m_destMonster->getCol()] = m_srcMonster; tmpRow = m_srcMonster->getRow(); tmpCol = m_srcMonster->getCol(); m_srcMonster->setRow(m_destMonster->getRow()); m_srcMonster->setCol(m_destMonster->getCol()); m_destMonster->setRow(tmpRow); m_destMonster->setCol(tmpCol); m_srcMonster->runAction(Sequence::create( MoveTo::create(time, posOfDest), MoveTo::create(time, posOfSrc), NULL)); m_destMonster->runAction(Sequence::create( MoveTo::create(time, posOfSrc), MoveTo::create(time, posOfDest), NULL)); }