经过上一节,我们已经完成了整个游戏的逻辑,那么本章节我们来给2048添加游戏计分,增加游戏结束画面。我们还没有学习到怎么保存用户数据,历史最高分数就先不做了。
这章完成之后,我们在加点声音,然后移植Android就哦了
1.增加游戏分数
我们整个游戏算是完成了,那么我们今天来完善一下。首先我们增加一个用于累加分数的变量,然后再构造函数中初始化
HelloWorld::HelloWorld()
:m_StartX(0)
,m_StartY(0)
,m_RangeX(0)
,m_RangeY(0)
,m_TotalScore(0)
{
}
在什么时候分数才累加呢??当然,在数字有叠加的时候,那么??
else if (m_squarearray[x][aftery]->getNumber()==m_squarearray[x][y]->getNumber())
{
bool isAdd=false;
for (int temp = aftery+1; temp < y; temp++)
{
if (m_squarearray[x][temp]->getNumber()!=0)
{
isAdd=true;
break;
}
}
if (isAdd)
{
continue;
}
m_squarearray[x][y]->setNumber(m_squarearray[x][y]->getNumber()*2);
m_squarearray[x][aftery]->setNumber(0);
m_TotalScore+=m_squarearray[x][y]->getNumber()*2;//累加分数
break;
}
分数加完之后的显示吧??
bool HelloWorld::init()
{
//
// 1. super init first
if ( !CCLayer::init() )
{
return false;
}
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
initMatrix(visibleSize);
//搞点背景
CCLayerColor* layerColorBG= CCLayerColor::create(ccc4(180,170,160,255));
this->addChild(layerColorBG,0);
//增加分数
CCLayerColor* ScorelayerColorBG= CCLayerColor::create(ccc4(255,245,238,255),150,50);
ScorelayerColorBG->ignoreAnchorPointForPosition(false);
ScorelayerColorBG->setAnchorPoint(ccp(0.5,0.5));
ScorelayerColorBG->setPosition(ccp(visibleSize.width/2,visibleSize.height-50));
this->addChild(ScorelayerColorBG,1,1);
CCLabelTTF* pScoreTTF= CCLabelTTF::create(CCString::createWithFormat("Score:%i",m_TotalScore)->getCString(),"arial.ttf",20);
pScoreTTF->setColor(ccc3(255,0,0));
pScoreTTF->setPosition(ccp(ScorelayerColorBG->getContentSize().width/2,ScorelayerColorBG->getContentSize().height/2));
ScorelayerColorBG->addChild(pScoreTTF,0,1);
return true;
}
if (isTouch)
{
autoSquare();
//改变分数
CCLabelTTF* pScoreTTF= (CCLabelTTF*) this->getChildByTag(1)->getChildByTag(1);
pScoreTTF->setString(CCString::createWithFormat("Score:%i",m_TotalScore)->getCString());
}
OK,测试,刚增加分数的代码写错了,应该位置要调换一下
m_TotalScore+=m_squarearray[x][y]->getNumber()*2;
m_squarearray[x][y]->setNumber(m_squarearray[x][y]->getNumber()*2);
m_squarearray[x][aftery]->setNumber(0);
搞定!
2.增加游戏结束画面
void HelloWorld::doGameOver()
{
bool isOver=true;
for (int x = 0; x < 4; x++)
{
if (!isOver)
{
break;
}
for (int y = 0; y < 4; y++)
{
if (m_squarearray[x][y]->getNumber()==0)
{
isOver=false;
}
else if(x!=0&&m_squarearray[x][y]->getNumber()==m_squarearray[x-1][y]->getNumber())
{
isOver=false;
}
else if(x!=3&&m_squarearray[x][y]->getNumber()==m_squarearray[x+1][y]->getNumber())
{
isOver=false;
}
else if(y!=3&&m_squarearray[x][y]->getNumber()==m_squarearray[x][y+1]->getNumber())
{
isOver=false;
}
else if(y!=0&&m_squarearray[x][y]->getNumber()==m_squarearray[x][y-1]->getNumber())
{
isOver=false;
}
if (!isOver)
{
break;
}
}
}
if (isOver)
{
//游戏结束
CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1, HelloWorld::scene()));
}
}
这是判断游戏是否结束的代码,
原理是什么呢?
其实就是判断当前数字方块是不是0,如果是0,果断没有结束,所有False,然后退出循环
或者,在判断相邻的上下左右是不是有数字和它相等,如果有,游戏还能继续
然后再ccTouchEnd调用
if (isTouch)
{
autoSquare();
//改变分数
CCLabelTTF* pScoreTTF= (CCLabelTTF*) this->getChildByTag(1)->getChildByTag(1);
pScoreTTF->setString(CCString::createWithFormat("Score:%i",m_TotalScore)->getCString());
//判断游戏是否结束
doGameOver();
}
那么,怎么模拟游戏结束呢??
初始化矩阵的时候,给附上值就行了
SquareSprite* pSquareSprite=SquareSprite::createSquareSprite(2*(x+1)*(y+1),pointx,pointy,SquareSize,SquareSize);
当然,值要不相邻哦
现在,随便向哪滑动下试试,什么效果??
下班哒!后面移植,什么什么细节的就不写了
这里附上源码和APK
源码:打包了,代码,资源,和移植Android的整个项目,所以有点大
http://download.csdn.net/detail/q269399361/7561847
apk:
http://download.csdn.net/detail/q269399361/7561859