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

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

2014-10-01 19:41 429 查看
如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。

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

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

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还是下一关,那不就是显而易见的事吗,判断当前获得分数是否大于通关分数就可以了。

其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐