重新开始游戏、暂停游戏、关闭游戏是绝对是游戏的基础,虽然代码不多,不过这要利用到Cocos2dx导演类、场景类完成,事先如果不对其进行了解,绝对是很难做出来。

下面用一个小例子说明如何利用导演类、场景类完成重新开始游戏、暂停游戏、关闭游戏功能,

这个被改写的HelloWorld场景,一开始就声明一个在屏幕中央开始5s内上升100px的按钮精灵,

可以看到,点击左上角的Refresh!按钮,这个场景的所有动作会重新开始,也就是,将HelloWorld场景销毁,重新执行HelloWorld场景的init()函数,相当于“重新开始游戏”。

点击右上角的Pause!按钮会保存当前HelloWorld场景的所有操作,来到一个新的Pause场景,点击其中的Back!按钮,会重新返回HelloWorld场景,按钮精灵会继续执行在屏幕中央开始5s内上升100px的动作,而不是重新开始,相当于"暂停游戏"。

"关闭游戏"在官方的Helloworld已经有,不过涉及这里的相关的知识,也在这里说说。

工程的文件结构如下:

“暂停游戏”必须新建一个带“返回”按钮场景,不新建这个暂停场景,是做不出来,虽然新建场景是一件复杂的事情,但你不这样做,是搞不出来的。

关于场景的概念在《【Cocos2dx】新建场景、场景的切换、设置启动场景与菜单的新建》(点击打开链接)已经讲过了,但这里着重对场景的scene函数的重写,这个scene函数相当于场景新建时候执行的构造函数。

先看改写了的HelloWorldScene:

HelloWorldScene.h,一些声明,没什么好说,只是删除一些官方无用的预编译声明、注释:

#include "cocos2d.h"
#include "cocos-ext.h" //使用按钮事件,必须要需要的头文件
USING_NS_CC_EXT;//使用按钮事件,必须要需要的命名空间
class HelloWorld:public cocos2d::CCLayer
{
public:virtual bool init();//场景初始化的函数//场景声明函数static cocos2d::CCScene* scene();CREATE_FUNC(HelloWorld);void pause(CCObject* pSender,CCControlEvent event);//暂停void restart(CCObject* pSender,CCControlEvent event);//重新开始void close(CCObject* pSender,CCControlEvent event);//关闭
};

HelloWorldScene.cpp,看起来代码很长很长,然而在init()声明N个按钮起始是一大堆重复的,详情可以看《【Cocos2dx】使用CCControlButton创建按钮、按钮点击事件,点击事件中的组件获取,setPosition的坐标问题 》( 点击打开链接),关键是各个函数的回调函数,核心是你要通过CCDirector::sharedDirector()召唤出导演,才能操作场景:

#include "HelloWorldScene.h"
#include "PauseScene.h"USING_NS_CC;CCScene* HelloWorld::scene()
{CCScene *scene = CCScene::create();//创建HelloWorld场景HelloWorld *layer = HelloWorld::create();//创建HelloWorld层scene->addChild(layer);//将HelloWorld层放在HelloWorld场景,所有元素只能放在层上,而不能放在场景上,场景仅能放层,相当于JavaSwing中在frame中添加panel才能继续搞return scene;
}bool HelloWorld::init()
{//获取屏幕的尺寸、位置信息等    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();  //声明按钮部分/*右上角按钮*/CCScale9Sprite *btn_noraml1 = CCScale9Sprite::create("CloseNormal.png");//声明CloseNormal图片,用于按钮没被按下时的背景图片  CCLabelTTF *label1 = CCLabelTTF::create("Pause!","arial",36);//声明一个文字Pause!第2个参数是字体,仅能使用Resource文件夹中fonts文件夹中的字体,第3个参数是字体大小  CCControlButton *controlButton1 = CCControlButton::create(label1,btn_noraml1);  controlButton1->setAnchorPoint(ccp(1,1));controlButton1->setPosition(ccp(visibleSize.width,visibleSize.height));  controlButton1->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::pause), CCControlEventTouchDown);//声明按钮的事件,第三个参数为定值常量意为,点击此按钮之后,触发第二个函数所声明的,下面给出的HelloWorld::pause(){}中所有代码。  this->addChild(controlButton1);//将此按钮添加到场景,默认不自动添加/*左上角按钮*/CCScale9Sprite *btn_noraml2 = CCScale9Sprite::create("CloseNormal.png");//声明CloseNormal图片,用于按钮没被按下时的背景图片  CCLabelTTF *label2 = CCLabelTTF::create("Refresh!","arial",36);//声明一个文字Refresh!第2个参数是字体,仅能使用Resource文件夹中fonts文件夹中的字体,第3个参数是字体大小  CCControlButton *controlButton2 = CCControlButton::create(label2,btn_noraml2);  controlButton2->setAnchorPoint(ccp(0,1));controlButton2->setPosition(ccp(0,visibleSize.height));controlButton2->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::restart), CCControlEventTouchDown);//声明按钮的事件,第三个参数为定值常量意为,点击此按钮之后,触发第二个函数所声明的,下面给出的HelloWorld::restart(){}中所有代码。  this->addChild(controlButton2);//将此按钮添加到场景,默认不自动添加  /*右下角按钮*/CCScale9Sprite *btn_noraml3 = CCScale9Sprite::create("CloseNormal.png");//声明CloseNormal图片,用于按钮没被按下时的背景图片  CCLabelTTF *label3 = CCLabelTTF::create("Close!","arial",36);//声明一个文字Close!第2个参数是字体,仅能使用Resource文件夹中fonts文件夹中的字体,第3个参数是字体大小  CCControlButton *controlButton3 = CCControlButton::create(label3,btn_noraml3);  controlButton3->setAnchorPoint(ccp(1,0));controlButton3->setPosition(ccp(visibleSize.width,0));controlButton3->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::close), CCControlEventTouchDown);//声明按钮的事件,第三个参数为定值常量意为,点击此按钮之后,触发第二个函数所声明的,下面给出的HelloWorld::close(){}中所有代码。  this->addChild(controlButton3);//将此按钮添加到场景,默认不自动添加  /*声明一个做动作的按钮精灵,以显示出效果*/CCSprite *sprite=CCSprite::create("CloseSelected.png");  sprite->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));this->addChild(sprite);  CCFiniteTimeAction* action2=CCMoveBy::create(5.0f,ccp(0,100));//在5秒内提升100px  sprite->runAction(action2);return true;
}void HelloWorld::pause(CCObject* pSender,CCControlEvent event)
{//将游戏界面暂停,压入场景堆栈。并切换到GamePause界面CCDirector::sharedDirector()->pushScene(PauseScene::scene());
}void HelloWorld::restart(CCObject* pSender,CCControlEvent event)
{//将游戏界面重新开始,replaceScene意思是用一个新场景替换旧场景,旧场景被替换之后,马上被销毁CCDirector::sharedDirector()->replaceScene(HelloWorld::scene());
}void HelloWorld::close(CCObject* pSender,CCControlEvent event)
{//结束当前游戏CCDirector::sharedDirector()->end(); exit(0);
}

之后是暂停场景类PauseScene,

PauseScene.h同样是一些声明:

#include "cocos2d.h"
#include "cocos-ext.h" //使用按钮事件,必须要需要的头文件
USING_NS_CC_EXT;//使用按钮事件,必须要需要的命名空间
using namespace cocos2d;class PauseScene:public CCLayer{
public:static CCScene* scene();virtual bool init();CREATE_FUNC(PauseScene);void back(CCObject* pSender,CCControlEvent event);//返回场景
};

PauseScene.cpp则同样是放一个按钮,按钮的回调函数,同样是召唤出Cocos2dx的导演。

暂停功能是这样的:Cocos2dx自身就自带一个场景栈,在初始化的时候,在main.cpp指定的开始场景就会自动进入场景栈,具体见《【Cocos2dx】Windows平台下Cocos2dx 2.x的下载、安装、配置,打造自己的Helloworld》(点击打开链接),暂停的话,CCDirector::sharedDirector()召唤出来的导演,有令让某一场景进入场景栈的方法pushScene,Cocos2dx只会演出当前在场景栈最上方的场景,下方的所有场景的行为、元素位置,通通会被存档、暂停,待其回到场景栈最顶部才会继续运行。

导演同样有让当前在场景栈最上方的场景出栈的方法。场景被出栈是马上被销毁,再也找不到了。

如果场景栈为空,则会自动关闭游戏,不过建议还是用导演的end()与exit(0)方法来结束游戏,这也是Cocos2dx官方的Helloworld使用的方法。

#include "PauseScene.h"USING_NS_CC;CCScene* PauseScene::scene()
{CCScene *scene=CCScene::create();  PauseScene* pauseScene=PauseScene::create();scene->addChild(pauseScene);return scene;
}bool PauseScene::init()
{//获取屏幕的尺寸、位置信息等    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();  //声明按钮部分  cocos2d::extension::CCScale9Sprite *btn_noraml = cocos2d::extension::CCScale9Sprite::create("CloseNormal.png");//声明CloseNormal图片,用于按钮没被按下时的背景图片  CCLabelTTF *label1 = CCLabelTTF::create("back!","arial",36);//声明一个文字Click me!第2个参数是字体,仅能使用Resource文件夹中fonts文件夹中的字体,第3个参数是字体大小  CCControlButton *controlButton = CCControlButton::create(label1,btn_noraml);  controlButton->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));//按钮的中心点位于屏幕的中央  controlButton->addTargetWithActionForControlEvents(this, cccontrol_selector(PauseScene::back), CCControlEventTouchDown);//声明按钮的事件,第三个参数为定值常量意为,点击此按钮之后,触发第二个函数所声明的,下面给出的PauseScene::back(){}中所有代码。  this->addChild(controlButton);//将此按钮添加到场景,默认不自动添加    return true;
}void PauseScene::back(CCObject* pSender,CCControlEvent event)
{//本场景出栈CCDirector::sharedDirector()->popScene();
}

【Cocos2dx】利用导演类、场景类完成重新开始游戏、暂停游戏、关闭游戏功能相关推荐

  1. 每日一题.PYTHON面向对象编写模拟人生屌丝逆袭游戏(登录类/角色类/场景类)?

    文件结构: [root@xmdevops xmdevops_limanman]# tree |grep -v ".pyc" |-- main.py                 ...

  2. 【玩转cocos2d-x之七】场景类CCScene和布景类CCLayer

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12708811 场景类CCScene和布景类CCLayer都是作为一个容器来使 ...

  3. cocos2d-x中的导演、场景、层和精灵

    场景(Scenes) 场景在cocos2d-x中是CCScene类实现的,是应用程序流中独立的一部分.一个cocos2dx应用程序可以有许多场景,但是在某一时刻,只有一个场景在运行. 比如,你有一个游 ...

  4. cocos2dx[3.2](5) ——入口类AppDelegate.cpp

    [唠叨] 入口类AppDelegate.cpp是游戏程序的入口. [AppDelegate.cpp] 这是游戏程序的入口,主要用于游戏程序的逻辑初始化,并创建运行程序的入口界面(即第一个游戏界面场景) ...

  5. NLP之词向量:利用word2vec对20类新闻文本数据集进行词向量训练、测试(某个单词的相关词汇)

    NLP之词向量:利用word2vec对20类新闻文本数据集进行词向量训练.测试(某个单词的相关词汇) 目录 输出结果 设计思路 核心代码 输出结果 寻找训练文本中与morning最相关的10个词汇: ...

  6. 利用java反射调用类的的私有方法

    http://blog.csdn.net/sunyujia/article/details/2501709 今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为在反射看来根 ...

  7. 利用java反射调用类的的私有方法--转

    原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...

  8. 利用反射技术修改类中的字段(成员变量的反射)

    题目:利用反射技术修改类中的字段及成员变量的反射 作者:Vashon 一.首先定义一个类如下: class ReflectPoint {private int x; //私有的public int y ...

  9. 社区网站类场景下的静态资源处理

    社区网站类场景下静态资源处理 场景描述 解决的问题 本实践通过搭建WordPress博客系统,向用户展示如何l 静态资源(图片.视频等)CDN访问加速和刷新 将图片.附件等静态资源上传到阿里云OSS, ...

最新文章

  1. discuz!x3 门户友情链接模块的横排显示
  2. 华为鸿蒙系统6月24首发,华为终于迎来好消息,P50系列有望在6月上市,首发搭载鸿蒙OS系统...
  3. [功能改进]防止提交重复评论内容
  4. PostgreSQL — 安装
  5. 编写好代码的10条戒律
  6. [置顶] CopyU!v2插件合集 [2013年7月18日更新]
  7. 关于面试宝典中的各个问题(一)
  8. GitLab 公开拒收中国员工,你怎么看?!
  9. vs2019轻松完成python项目创建
  10. 甘肃暴雨强度公式_甘肃暴雨强度公式
  11. 很值得看看的中文翻译The Django Book
  12. android商品详情详解
  13. matlab演示波粒二象性,MATLAB实验电子波动性的Matlab仿真
  14. Navicat提示Access violation at address ... in module ‘navicat.exe‘.Write of address ...
  15. iOS 15:如何翻译照片中的文本-「实况文本」
  16. 清除缓冲区的几种方法
  17. 在Scrapy中使用爬虫动态代理IP
  18. react 渲染table数据
  19. 浙江理工c语言复试试题,2016年浙江理工大学信息学院C语言程序设计复试笔试最后押题五套卷...
  20. 【后端】消息队列--Kafka篇

热门文章

  1. 软件测试 | 测试开发 | 双非院校,从外包到外企涨薪85%,他的涨薪秘籍全公开
  2. 「镁客·请讲」泛联智能蒲忠文:灯联网是未来物联网行业的一个杀手级应用...
  3. 一个完整项目的流程都涉及哪些内容
  4. 微型计算机输入设备 写出六种,计算机一级考试word题及答案
  5. 禹司凤扛鸿蒙炉,琉璃美人煞12人物结局,司凤 璇玑完满,柏麟 副宫主结局大快人心...
  6. win7如何更改文件类型_如何在win10中使用云笔记软件来做pdf手写笔记或绘图? - 敬业签便签...
  7. EasyMesh_Specification_v4中英文
  8. 服务器系统部署方案,系统部署方案.doc
  9. 【脑洞大开】《西潮》及《走向世界丛书》
  10. 安卓上哔哩哔哩视频的导出