小菜来继续小游戏俄罗斯方块啦!
有什么更好的做法,请大家给点意见,小菜会认真去思考学习
此集实现的是方块图像的下降以及下降后消行(左右移动在第三集)。
首先创建在之前创建的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;
}
}
这样就实现了下落消行下移的本集功能了。