利用cocos2dx 3.2开发消灭星星(八)游戏的结束判断与数据控制
2014-10-01 19:41
429 查看
如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。
不过问题又来了,游戏总要结束,那怎么判断游戏是否结束或者游戏进入下一关呢
我们在删除待删除队列的时候(见上一节),不妨加入一个函数,来确定删除完以后,这个游戏是否还能够进行下去
判断是否结束的思路很简单,对于StarMatrix里面的二维Star*数组的每一个星星,如果上下左右都没有与之相同颜色,就判定为游戏结束。开始把剩下的两两互不相连的星星消去。
那么如何判断是GameOver还是进入下一关呢。。这里补充点之前忘记讲的东西:数据管理
我们新建一个类来统一管理整个游戏的数据,包括当前获得分数,当前关卡,通关分数,历史最高分等,这样统一管理的好处是能过保证全局的统一
由于这个管理数据类贯穿整个游戏,所以每个人有不同的实现方法,每个人的游戏数据管理类也可能不一样,所以这里直接贴出源码
GameData.h
GameData.cpp
那么游戏里面一切与分数,数据有关的都能够调用这个类来获得,至于判断是GameOver还是下一关,那不就是显而易见的事吗,判断当前获得分数是否大于通关分数就可以了。
其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。
不过问题又来了,游戏总要结束,那怎么判断游戏是否结束或者游戏进入下一关呢
我们在删除待删除队列的时候(见上一节),不妨加入一个函数,来确定删除完以后,这个游戏是否还能够进行下去
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还是下一关,那不就是显而易见的事吗,判断当前获得分数是否大于通关分数就可以了。
其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。
相关文章推荐
- 利用cocos2dx 3.2开发消灭星星(四)游戏主场景
- 利用cocos2dx 3.2开发消灭星星(九)为游戏添加一些特效
- 利用cocos2dx 3.2开发消灭星星(十)为游戏添加音效(项目源码分享)
- 利用cocos2dx 3.2开发消灭星星(六)如何在cocos2dx中显示中文
- 利用cocos2dx 3.2开发消灭星星(二)菜单(附素材)
- 利用cocos2dx 3.2开发消灭星星(五)update与触摸事件
- 利用cocos2dx 3.2开发消灭星星(七)关于星星的算法
- 利用cocos2dx 3.2开发消灭星星(三)常用的飘字效果
- 利用cocos2dx 3.2开发消灭星星(一)基本介绍
- 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!
- 【cocos2dx 3.2】Flappy Bird开发超详细讲解(五)游戏的总逻辑控制
- 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据&CCMutableDictionary使用与注意!
- 【iOS-cocos2d-X 游戏开发之九】Cocos2dx利用CCSAXParser解析xml数据 推荐
- Cocos2d-x 3.2 大富翁游戏项目开发-第二十七部分 技能提升和游戏结束判断
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- 【Cocos2dx游戏开发】CCNotificationCenter传递消息和数据
- Cocos2dx3.2学习准备(二):游戏开发中的一些基本概念
- 【COCOS2DX-游戏开发之三三】TMX边界控制与小窗口内预览TMX
- 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译并通过Jni调用Android的Java层代码(cocos2dx里访问调用Android函数)!
- 【Android游戏开发十八】解放手指,利用传感器开发游戏!(本文讲解在SurfaceView中用重力传感器控制圆球的各方向移动)