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

版权声明:本文为iteye_17686原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iteye_17686/article/details/82437970

智能推荐

【Spark 内核】 Spark 内核解析-下

Spark内核泛指Spark的核心运行机制,包括Spark核心组件的运行机制、Spark任务调度机制、Spark内存管理机制、Spark核心功能的运行原理等,熟练掌握Spark内核原理,能够帮助我们更好地完成Spark代码设计,并能够帮助我们准确锁定项目运行过程中出现的问题的症结所在。 Spark Shuffle 解析 Shuffle 的核心要点 ShuffleMapStage与ResultSta...

Reflect反射的基础知识

写个父类: 写个子类: 利用反射获得该子类中的属性,方法,构造,父类及接口: 运行结果:...

spring cloud netflix (07) 服务的消费者(feign)

前言 完整知识点:spring cloud netflix 系列技术栈 Feign (同步通信 HTTP通信) feign是基于接口完成服务与服务之间的通信的 搭建Feign服务 项目结构 项目搭建 pom.xml application类 application.yml 使用feign完成服务与服务之间的通信 feign是基于接口完成服务与服务之间的通信的...

AtCoder Beginner Contest 174 E.Logs

AtCoder Beginner Contest 174 E.Logs 题目链接 到最后才发现是二分,菜菜的我/(ㄒoㄒ)/~~ 我们直接二分 [1,max{a[i]}][1,max\lbrace a[i]\rbrace][1,max{a[i]}] 即可,对每一个 midmidmid,每个数 a[i]a[i]a[i] 只需要切 a[i]−1mid\frac{a[i]-1}{mid}mi...

小程序基础与实战案例

小程序开发工具与基础 小程序开发准备: 申请小程序账号( appid ) 下载并安装微信开发者工具 具体步骤如下: 先进入 微信公众平台 ,下拉页面,把鼠标悬浮在小程序图标上 然后点击 小程序开发文档 照着里面给的步骤,就可以申请到小程序账号了。 然后就可以下载 开发者工具 了 下载完打开后的界面就是这个样子 下面让我们来新建一个小程序开发项目: 在AppID输入自己刚刚注册的AppID就可以,或...

猜你喜欢

VMware centOS7 下通过minikube部署Kubernetes

1、环境准备: VMware CentOS-7-x86_64 CPU:2*2core 内存:8G 宿主机和虚拟机需网络互通,虚拟机外网访问正常 Centos发行版版本查看:cat /etc/centos-release root用户操作 2、禁用swap分区 Kubernetes 1.8开始要求关闭系统的Swap,可暂时关闭或永久禁用, 使用 $ free -m 确认swap是否为开启状态 $ s...

逻辑回归与scikit-learn

欢迎关注本人的微信公众号AI_Engine LogisticRegression 算法原理 一句话概括:逻辑回归假设数据服从伯努利分布,通过极大化似然函数(损失函数)的方法,运用梯度下降或其他优化算法来求解参数,来达到将数据二分类的目的。 定义:逻辑回归(Logistic Regression)是一种用于解决二分类(0 or 1)问题的机器学习方法,用于估计某种事物的可能性(不是概率)。比如某用户...

指针OR数组?用他们来表达字符串又有何不同?

cocowy的编程之旅 在学习C语言的过程中我们经常可以看到或者听到这样一句话:数组其实等价于指针,例如: 在这里可以轻松的看出输出后他们的值相等,其实在计算机内存里面,p为本地变量,有着他自己的作用域。而指针变量q保存着这个数组的首地址,通过*号指向这个地址保存的变量值。 然而我们再看一个例子: 这个时候计算机报错,这是为什么呢? 其实原因很简单,指针说指向的这个字符串的地址是位于计算机代码段地...

广度搜索

广度搜索的基本使用方法 广度搜索不同于深度搜索,是一种一步一步进行的过程,每一个点只记录一遍。需要用到队列记录每一步可以走到的位置,找到目标位置输出步数即可。 用到的知识:结构体、队列 如图 首先我们需要定义一个结构体来存储每个遍历到的点和步数 广搜不会用到递归,所以可以直接在主函数里写,这里需要定义一个结构体队列 初始化队列并将起始点入列 遍历 完整代码...

NIO Socket 编程实现tcp通信入门(二)

1、NIO简介 NIO面向通道和缓冲区进行工作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。可以双向传输数据,是同步非阻塞式IO。NIO还引入了选择器机制,从而实现了一个选择器监听多个底层通道,减少了线程并发数。用NIO实现socket的Tcp通信需要掌握下面三个知识点: Buffer 缓冲区 Channel 通道 Selector 选择器   2、java.nio.Buff...