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

到目前为止,这个游戏没有任何提示,也没有制定任何游戏规则,这样就没法玩了。下面来制定游戏输赢的规则:放走任何一个敌人就算输,打死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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值