利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。

不过问题又来了,游戏总要结束,那怎么判断游戏是否结束或者游戏进入下一关呢

我们在删除删除队列的时候(见上一节),不妨加入一个函数,来确定删除完以后,这个游戏是否还能够进行下去

bool StarMatrix::isEnded(){
	bool bRet = true;
	for(int i=0;i<ROW_NUM;i++){
		for(int j=0;j<COL_NUM;j++){
			if(stars[i][j] == nullptr)
				continue;
			int curColor = stars[i][j]->getColor();
			//上
			if(i-1>=0 && stars[i-1][j]!=nullptr && stars[i-1][j]->getColor() ==  curColor)
				return false;
			//下
			if(i+1<ROW_NUM && stars[i+1][j]!=nullptr && stars[i+1][j]->getColor() == curColor)
				return false;
			//左
			if(j-1>=0 && stars[i][j-1]!=nullptr && stars[i][j-1]->getColor() == curColor)
				return false;
			//右
			if(j+1<COL_NUM && stars[i][j+1]!=nullptr && stars[i][j+1]->getColor() == curColor)
				return false;
		}
	}
	return bRet;
}

判断是否结束的思路很简单,对于StarMatrix里面的二维Star*数组的每一个星星,如果上下左右都没有与之相同颜色,就判定为游戏结束。开始把剩下的两两互不相连的星星消去。


那么如何判断是GameOver还是进入下一关呢。。这里补充点之前忘记讲的东西:数据管理


我们新建一个类来统一管理整个游戏的数据,包括当前获得分数,当前关卡,通关分数,历史最高分等,这样统一管理的好处是能过保证全局的统一

由于这个管理数据类贯穿整个游戏,所以每个人有不同的实现方法,每个人的游戏数据管理类也可能不一样,所以这里直接贴出源码

GameData.h

#ifndef _GAMEDATA_H_
#define _GAMEDATA_H_

class GAMEDATA{
public:
	static GAMEDATA* getInstance();
	/*当前等级*/
	void setCurLevel(int level);
	inline int getCurLevel(){return cur_level;}
	/*下一等级*/
	inline int getNextLevel(){return next_level;}
	/*最高分*/
	inline void setHistoryscore(int score){history_score = score;}
	inline int getHistoryscore(){return history_score;}
	/*当前分数*/
	inline void setCurscore(int score){cur_score = score;}
	inline int getCurscore(){return cur_score;}
	/*通关分数*/
	inline int getNextscore(){return next_score;}
	inline int getscoreByLevel(int level);

	/*奖励分数*/
	int getJiangli(int size);

	void saveHighestscore();
private:
	GAMEDATA();
	void init();
private:
	static GAMEDATA* _instance;
	int cur_level;
	int next_level;
	int history_score;
	int cur_score;
	int next_score;
	friend class MenuLayer;
};
#endif

GameData.cpp
#include "GameData.h"
#include "cocos2d.h"
using namespace cocos2d;
GAMEDATA* GAMEDATA::_instance = 0;
GAMEDATA::GAMEDATA(){
	this->init();
}
GAMEDATA* GAMEDATA::getInstance(){
	if(_instance == 0){
		_instance = new GAMEDATA();
	}
	return _instance;
}

void GAMEDATA::init(){
    setCurLevel(0);
	setCurscore(0);
	setHistoryscore(UserDefault::getInstance()->getIntegerForKey("highestscore",0));
}

void GAMEDATA::setCurLevel(int level){
	if(level < 0){
		return;
	}
	cur_level = level;
	next_level = level + 1;
	next_score = getscoreByLevel(next_level);
}

int GAMEDATA::getscoreByLevel(int level){
	int score = 0;
	if (level == 1)
	{
		score = 1000;
	}
	else if (level == 2)
	{
		score = 3000;
	}
	else if ( (level >=3) && (level <= 10) )
	{
		score = 3000 + 3000 * (level - 2);
	}
	else
	{
		score = 27000 + 4000 * (level - 10);
	}
	return score;
}

int GAMEDATA::getJiangli(int size){
	static const int jiangli[10][2] =
	{
		{0,2000},{1,1980},{2,1920},{3,1820},{4,1680},{5,1500},{6,1280},{7,1020},{8,720},{9,380}
	};
	if(size>9 || size<0){
		return 0;
	}
	return jiangli[size][1];
}


void GAMEDATA::saveHighestscore(){
	UserDefault::getInstance()->setIntegerForKey("highestscore",getHistoryscore());
}

那么游戏里面一切与分数,数据有关的都能够调用这个类来获得,至于判断是GameOver还是下一关,那不就是显而易见的事吗,判断当前获得分数是否大于通关分数就可以了。

其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...