cocos2d-x入门(6)-添加输赢提示
来源:互联网 发布:神仙珊瑚 知乎 编辑:程序博客网 时间:2024/04/30 22:20
到目前为止,这个游戏没有任何提示,也没有制定任何游戏规则,这样就没法玩了。下面来制定游戏输赢的规则:放走任何一个敌人就算输,打死n个敌人算赢(n自己可以调),并且提示玩家最终的游戏结果。
添加两个文件:GameOverScene.cpp 和GameOverScene.h。
GameOverScene.h
在GameScene.cpp的update方法中添加检测消灭敌人数量和切换场景的代码,修改后的代码如下:
添加两个文件:GameOverScene.cpp 和GameOverScene.h。
GameOverScene.h
#ifndef GAME_OVER_SCENE_H#define GAME_OVER_SCENE_H #include "cocos2d.h" class GameOverLayer:public cocos2d::CCLayerColor{public: GameOverLayer():_label(NULL) {}; virtual ~GameOverLayer(); bool init(); void gameOverDone(); LAYER_NODE_FUNC(GameOverLayer); //定义一个只读属性Label,在类定义中可以使用this->getLabel来访问 CC_SYNTHESIZE_READONLY(cocos2d::CCLabelTTF*,_label,Label); }; class GameOverScene:public cocos2d::CCScene{public: GameOverScene():_layer(NULL) {}; virtual ~GameOverScene(); bool init(); SCENE_NODE_FUNC(GameOverScene); CC_SYNTHESIZE_READONLY(GameOverLayer*,_layer,Layer); }; #endif
CC_SYNTHESIZE_READONLY(varType, varName, funName)声明一个成员变量以及getfunName函数,没有set函数。getfunName已经实现,其实现就是返回这个值。
GameOverScene.cpp
#include "GameScene.h"#include "GameOverScene.h" using namespace cocos2d; bool GameOverScene::init(){ if(CCScene::init()) { this->_layer = GameOverLayer::node(); this->_layer->retain(); //this->_layer->setIsRelativeAnchorPoint(true); this->addChild(_layer); return true; } else { return false; }} GameOverScene::~GameOverScene(){ if(this->_layer) { this->_layer->release(); this->_layer = NULL; }} bool GameOverLayer::init(){ if(CCLayerColor::initWithColor(ccc4(255,255,255,255))) { CCSize winSize = CCDirector::sharedDirector()->getWinSize(); this->_label = CCLabelTTF::labelWithString("","Artial",32); this->_label->retain(); this->_label->setColor(ccc3(0,0,0)); this->_label->setPosition(ccp(winSize.width/2,winSize.height/2)); this->addChild(this->_label); this->runAction(CCSequence::actions(CCDelayTime::actionWithDuration(3), CCCallFunc::actionWithTarget(this, callfunc_selector(GameOverLayer::gameOverDone)),NULL)); return true; } else { return false; }} void GameOverLayer::gameOverDone(){ CCDirector::sharedDirector()->replaceScene(SimpleGame::scene());} GameOverLayer::~GameOverLayer(){ if(this->_label) { this->_label->release(); this->_label = NULL; }}
这个类实现很简单,就是在游戏结束场景层中添加一个文字标签提示。
现在需要在GameScene.h中给SimpleGame添加一个成员变量enemyDestoryed,表示有多少敌人被消灭了。在GameScene.cpp的init中添加:
enemyDestoryed = 0;
在GameScene.cpp的update方法中添加检测消灭敌人数量和切换场景的代码,修改后的代码如下:
void SimpleGame::update(ccTime dt){ CCMutableArray<CCSprite *>::CCMutableArrayIterator it,jt; CCMutableArray<CCSprite *> *projectileToDelete = new CCMutableArray<CCSprite *>; //遍历所有子弹,然后根据子弹遍历所有敌人,检查子弹跟敌人是否发生碰撞 for(jt = projectiles->begin(); jt != projectiles->end(); jt ++) { CCSprite *projectile = *jt; CCRect projectileRect = CCRectMake(projectile->getPosition().x - projectile->getContentSize().width/2, projectile->getPosition().y - projectile->getContentSize().height/2, projectile->getContentSize().width, projectile->getContentSize().height); CCMutableArray<CCSprite *> *enemyToDelete = new CCMutableArray<CCSprite *>; for(it = enemies->begin(); it != enemies->end(); it ++) { CCSprite *enemy = *it; CCRect enemyRect = CCRectMake(enemy->getPosition().x - enemy->getContentSize().width/2, enemy->getPosition().y - enemy->getContentSize().height/2, enemy->getContentSize().width, enemy->getContentSize().height); //如果碰撞,则把被击中的敌人放进要删除的列表中 if(CCRect::CCRectIntersectsRect(projectileRect,enemyRect)) { enemyToDelete->addObject(enemy); } } for(it = enemyToDelete->begin(); it != enemyToDelete->end(); it ++) { CCSprite *enemy = *it; enemies->removeObject(enemy); this->removeChild(enemy,true); this->enemyDestoryed ++; if(this->enemyDestoryed > 3) { GameOverScene *gameOverScene = GameOverScene::node(); gameOverScene->getLayer()->getLabel()->setString("You Win"); CCDirector::sharedDirector()->replaceScene(gameOverScene); } } //无论该子弹击中多少敌人,都只添加一次 if(enemyToDelete->count() > 0) { projectileToDelete->addObject(projectile); } enemyToDelete->release(); } for(jt = projectileToDelete->begin(); jt != projectileToDelete->end(); jt ++) { CCSprite *projectile = *jt; projectiles->removeObject(projectile); this->removeChild(projectile,true); } projectileToDelete->release(); }修改spriteMoveFinished函数,添加输了的提示代码。
void SimpleGame::spriteMoveFinished(CCNode *sender){ CCSprite *sprite = (CCSprite *)sender; this->removeChild(sprite,true); if(sprite->getTag() == 1) { enemies->removeObject(sprite); GameOverScene *gameOverScene = GameOverScene::node(); gameOverScene->getLayer()->getLabel()->setString("You Lose!!!"); CCDirector::sharedDirector()->replaceScene(gameOverScene); } else if(sprite->getTag() == 2) { projectiles->removeObject(sprite); }}
记得包含头文件GameOverScene.h。
ok,编译运行项目,该demo在win32平台的开发已经完成。效果如下图:
转载请注明来自:Alex Zhou,本文链接:http://codingnow.cn/cocos2d-x/700.html
- cocos2d-x入门(6)-添加输赢提示
- cocos2d-x入门(5)-添加背景音乐和攻击音效
- cocos2d-x入门(5)-添加背景音乐和攻击音效
- Cocos2d-x 添加广告
- cocos2d-x添加分享
- Cocos2d-x 添加字体库
- cocos2d-x 添加 广告
- Cocos2d-x添加音效
- cocos2d-x入门篇
- cocos2d-x box2d 入门
- cocos2d-x入门介绍
- Cocos2d-X 基础入门
- cocos2d-x入门基础知识
- Cocos2D-x 入门(1)
- cocos2d-x 3.9入门
- cocos2d-x入门
- cocos2d-x入门知识点
- cocos2d-x lua 注释提示
- Quartz的任务的临时启动和暂停和恢复
- [原+译]VisionMobile:情景智能:你的手机能了解你多少?
- 求一元二次方程的根
- 求一元二次方程的根
- cocos2d-x入门(5)-添加背景音乐和攻击音效
- cocos2d-x入门(6)-添加输赢提示
- asp.net定时执行程序
- 第9周任务2-个人所得税计算器
- Android 读取联系人(详细)
- 返回指针值的 函数
- 网络安全体系结构&安全服务&安全机制
- mysql增加列修改列名列属性以及删除列
- 关于免安装版mysql不能开启 错误1607
- MyEclipse优化