//矩阵的初始化 void PlayLayer::initMatrix() {//row 是行 ,col 是列 for (int row = 0; row < m_height; row++) { for (int col = 0; col < m_width; col++) { createAndDropSushi(row, col); } } }
void PlayLayer::fillVacancies() { Size size = CCDirector::getInstance()->getWinSize(); // Chỗ này nhìn có vẻ phức tạp nhưng chẳng có gì đâu, chỉ là khai báo con trỏ, cấp phát bộ nhớ cho nó thôi, dùng như mảng 1 chiều int *colEmptyInfo = (int *)malloc(sizeof(int) * m_width); memset((void *)colEmptyInfo, 0, sizeof(int) * m_width); // set giá trị là 0 hết // Rơi Sushi đang có xuống khoảng trống SushiSprite *sushi = NULL; // Tạo 1 con trỏ Sushi = Null, // Duyệt ma trận. Lưu ý ở đây 1 chút, chúng ta thường duyệt mảng 2 chiều theo thứ tự hàng, rồi đến cột, nhưng ở đây, hơi ngược 1 tý là cột rồi đến hàng. Và lưu ý rằng Cột 0, và Hàng 0 nằm ở vị trí bên Dưới phía Trái nhé. khi tạo ma trận ta cho viên Sushi 0,0 rơi xuống trước tiên mà for (int col = 0; col < m_width; col++) { // Duyệt theo cột, từ trái sang phải int removedSushiOfCol = 0; // Duyệt theo hàng, từ dưới lên trên for (int row = 0; row < m_height; row++) { sushi = m_matrix[row * m_width + col]; // Sushi tại vị trí hàng, cột if (NULL == sushi) { // Nếu rỗng removedSushiOfCol++; // Đếm số Sushi đã bị "ăn" } else { // Nếu ko rỗng if (removedSushiOfCol > 0) { // Nếu bên dưới nó có ô trống = số Sushi bị ăn // Làm rơi xuống int newRow = row - removedSushiOfCol; //Vị trí hàng mới ( giảm xuống ) // Trong ma trận ta bỏ sushi ở hàng row, và chuyển nó xuống dưới qua removedSushiOfCol ô rỗng m_matrix[newRow * m_width + col] = sushi; m_matrix[row * m_width + col] = NULL; //Di chuyển Point startPosition = sushi->getPosition(); Point endPosition = positionOfItem(newRow, col); float speed = (startPosition.y - endPosition.y) / size.height; // Tốc độ sushi->stopAllActions(); // Dừng mọi chuyển động trước đó của Sushi sushi->runAction(MoveTo::create(speed, endPosition)); // Di chuyển = rơi xuống // set hàng mới cho Sushi tại vị trí mới này sushi->setRow(newRow); } } } // Mảng lưu trữ số lượng Sushi bị ăn tại vị trí Cột xác định colEmptyInfo[col] = removedSushiOfCol; } // 2. Tạo mới và làm rơi các Sushi xuống khoảng trống , lấp đầy ma trận for (int col = 0; col < m_width; col++) { // Duyệt cột từ trái sang phải // Duyệt hàng, chỉ xét từ vị trí rỗng trở lên for (int row = m_height - colEmptyInfo[col]; row < m_height; row++) { createAndDropSushi(row, col); // Tạo Sushi và rơi xuống vị trí Row, Col } } m_movingVertical = true; m_isAnimationing = true; free(colEmptyInfo); // Giải phóng con trỏ }
void PlayLayer::initMatrix() { // Duyệt các phần tử ma trận 2 chiều for (int row = 0; row < m_height; row++) { for (int col = 0; col < m_width; col++) { createAndDropSushi(row, col); // Tạo và làm rơi Sushi xuống vị trí hàng + cột } } }
void PlayLayer::fillVacancies() { Size size = CCDirector::getInstance()->getWinSize(); int *colEmptyInfo = (int *)malloc(sizeof(int) * m_width); memset((void *)colEmptyInfo, 0, sizeof(int) * m_width); // 1. drop exist sushi SushiSprite *sushi = NULL; for (int col = 0; col < m_width; col++) { int removedSushiOfCol = 0; // from buttom to top for (int row = 0; row < m_height; row++) { sushi = m_matrix[row * m_width + col]; if (NULL == sushi) { removedSushiOfCol++; } else { if (removedSushiOfCol > 0) { // evey item have its own drop distance int newRow = row - removedSushiOfCol; // switch in matrix m_matrix[newRow * m_width + col] = sushi; m_matrix[row * m_width + col] = NULL; // move to new position Point startPosition = sushi->getPosition(); Point endPosition = positionOfItem(newRow, col); float speed = (startPosition.y - endPosition.y) / size.height; sushi->stopAllActions();// must stop pre drop action sushi->runAction(CCMoveTo::create(speed, endPosition)); // set the new row to item sushi->setRow(newRow); } } } // record empty info colEmptyInfo[col] = removedSushiOfCol; } // 2. create new item and drop down. for (int col = 0; col < m_width; col++) { for (int row = m_height - colEmptyInfo[col]; row < m_height; row++) { createAndDropSushi(row, col); } } free(colEmptyInfo); }