小菜来继续小游戏俄罗斯方块啦!
有什么更好的做法,请大家给点意见,小菜会认真去思考学习
此集实现的是方块图像的下降以及下降后消行(左右移动在第三集)。
首先创建在之前创建的BlockManager中
头文件中定义
private: cocos2d::CCArray *_newBlock; //上集就需要定义的 cocos2d::CCArray *_saveBlock; cocos2d::CCArray *_isenough;
bool BlockManager::init() { bool bRect=false; do { CC_BREAK_IF(!CCLayer::init()); //初始化第一个图像
_newBlock=type(picture3); //下降定时器 this->schedule(schedule_selector(BlockManager::DownUpdate),1.0f); //判断消行以及重排定时器 this->schedule(schedule_selector(BlockManager::update)); this->setTouchEnabled(true); bRect=true; } while (0); return bRect; }在DownUpdate函数中写
void BlockManager::DownUpdate( float t ) { int minblock=12; int outline=0; bool move=true; for (int j=0;j<_newBlock->count();j++) { Block *block1=(Block *)_newBlock->objectAtIndex(j); for (int k=0;k<_saveBlock->count();k++) { Block *block2=(Block *)_saveBlock->objectAtIndex(k); //下面是否有砖块 if (block1->col==block2->col&&block1->row-1==block2->row) { move=false; break; } } if (minblock>block1->row) { //得出最下面的砖块的行数 minblock=block1->row; } } for (int i=0;i<_newBlock->count();i++) { Block *block=(Block *)_newBlock->objectAtIndex(i); //最小的行数不为0而且下面没有砖块 if (move&&minblock!=0) { --block->row; }else{ _saveBlock->addObject(block); //当所有砖块都存入_saveBlock后 if (i==_newBlock->count()-1) { //随即产生砖块 Picture picture=Picture(rand()%7); _newBlock->removeAllObjects(); _newBlock=type(picture); break; } } } //如果超过界限为游戏结束 for(int i=0;i<_saveBlock->count();i++) { Block *block=(Block*)_saveBlock->objectAtIndex(i); if (outline<block->row) { outline=block->row; } if (outline>11)//及高度大于十二格的时候 { _saveBlock->removeAllObjects(); } } }Update函数
void BlockManager::update( float date ) { int overrow=-1;
//将十二行数每一个与固定在下面_saveBlock数组计数如果没一行有十二个数的话就删除 for (int j=0;j<12;j++) { for (int i=0;i<_saveBlock->count();i++) { Block* block=(Block *)_saveBlock->objectAtIndex(i); if (block->row==j) {
_isenough->addObject(block); } //是否满一行,消除 if (_isenough->count()>11) { _saveBlock->removeObjectsInArray(_isenough); overrow=block->row; break; } } _isenough->removeAllObjects(); } //消行上面的方块全部下移 if (overrow!=-1) { //消行后,要将上面的砖块往下移动 for (int i=0;i<_saveBlock->count();i++) { Block* block=(Block *)_saveBlock->objectAtIndex(i); if(block->row>overrow){ block->row--; } } overrow=-1; } }这样就实现了下落消行下移的本集功能了。