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

经过上一节,我们已经完成了整个游戏的逻辑,那么本章节我们来给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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值