Esempio n. 1
0
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));

}
Esempio n. 2
0
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));
}
Esempio n. 3
0
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();
}
Esempio n. 4
0
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();
}
Esempio n. 5
0
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);
}
Esempio n. 6
0
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));
}