您的位置:首页 > 移动开发 > Cocos引擎

小小菜之Cocos2d-x游戏开发旅程——项目实例:2048(4)

2015-10-17 16:39 495 查看
4.元素块的消除

前面已经讲了元素块的移动,那么移动完之后就需要消除,让元素块的数字翻倍,这才是游戏的玩法

既然有消除,那么一个方块肯定不能消除,所以我们更新一下产生元素块的方法,让它每移动一次产生一个新块,而且不能产生在已有块区域

void Game::addNewTiled()  //添加新块
{
srand((unsigned)time(NULL));
//判断是否还有空白区域
if (allTiled.size() == 16) {
//死亡判定
return;
}
//获得剩下的空白区域
long temp = 16 - allTiled.size();
int num = rand()%temp;
int row , col;
int count = 0;//计算空白区域
int i ;
for (i = 0; i < 16; i++) {
row = i/4;
col = i%4;
if (map[row][col] == 0) {
count++;
if (count > num) {
break;
}
}
}
row = i/4;
col = i%4;
auto newTiled = Tiled::createTiled(row, col);
newTiled->setAnchorPoint(Vec2(0.5 , 0.5));
this->getChildByTag(TAG_LAYER_BG)->addChild(newTiled);
allTiled.pushBack(newTiled);
map[row][col] = allTiled.getIndex(newTiled) + 1;
}


ok,之后那么,首先在Tiled类中先写一个让数字翻倍的方法

void Tiled::doubleNum()   //消除数字并翻倍
{
this->number = this->number * 2;

auto label = (Label*)this->getChildByTag(TAG_TILED_BG)->getChildByTag(TAG_TILED_NUM);
auto layer_c = this->getChildByTag(TAG_TILED_BG);
label->setString(StringUtils::format("%d" , this->number));
}


然后,我们在移动时添加对消除的判断,若不能移动则判断是否能消除。

if(map[row+1][nowcol] > 0)
{
auto upTiled = allTiled.at(map[row+1][nowcol] - 1);
auto nextTiled = allTiled.at(map[row][nowcol] - 1);

if (upTiled->number == nextTiled->number && nextTiled->number != 4096)
{

//让上边块加倍,原来块删除
int index = map[row + 1][nowcol];
upTiled->removeFromParent();
allTiled.erase(map[row + 1][nowcol] - 1);
map[row + 1][nowcol] = 0;
nextTiled->doubleNum();
for (int r = 0; r < 4; r++)
{
for (int c = 0; c < 4; c++)
{
if (map[r][c] > index)
{
map[r][c]--;
}
}
}
}
}


未完待续。。。

————9秒学院学习日志
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: