cocos2d-x入门(6)-添加输赢提示

来源:互联网 发布:神仙珊瑚 知乎 编辑:程序博客网 时间:2024/04/30 22:20
到目前为止,这个游戏没有任何提示,也没有制定任何游戏规则,这样就没法玩了。下面来制定游戏输赢的规则:放走任何一个敌人就算输,打死n个敌人算赢(n自己可以调),并且提示玩家最终的游戏结果。
添加两个文件: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

原创粉丝点击