Cocos2dx制作2048(4.增加计分)

来源:互联网 发布:什么是数据割接 编辑:程序博客网 时间:2024/05/22 04:47

经过上一节,我们已经完成了整个游戏的逻辑,那么本章节我们来给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 firstif ( !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
0 0
原创粉丝点击