cocos2dx 3.x截图功能实现

本文介绍如何在Cocos2d-x中实现游戏暂停功能,包括创建暂停界面、截图当前游戏画面作为背景,并添加继续游戏、重新开始及返回主菜单等按钮。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自--http://blog.youkuaiyun.com/evankaka/article/details/42936117

本文要实现游戏中的暂停、重新开始。将当前界面截图,然后用这张图去构造一个层(以这张图为背景),然后加个按钮,主界面点暂停时,pushScene(),然后转到游戏暂停界面,当在游戏暂停界面点继续游戏popScne()。在cocos2dx中推进(pushScene())暂停场景,之前运行的场景将会自动暂停,然后我们可以在暂停场景中操作,当我们不再需要暂停场景时,可以popScene()将暂停场景弹出。重新开始游戏直接replaceScene().

cocos2d-x版本:2.2.5

工程环境:windows7+VS2010

打开方式:将工程放在cocos2d-x安装目录下的project文件夹下用VS打开

源码免费下载

本文效果:


一、游戏暂停界面初步实现

 思路:将当前界面截图,然后用这张图去构造一个层(以这张图为背景),然后加个按钮,主界面点暂停时,pushScene(),然后转到游戏暂停界面,当在游戏暂停界面点继续游戏时popScne(),

首先看看自定义的游戏暂停的层

头文件 Gamepause.h

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #ifndef __Gamepause__H__  
  2. #define __Gamepause__H__  
  3. #include "cocos2d.h"  
  4. USING_NS_CC;  
  5. class Gamepause : public cocos2d::CCLayer  
  6. {  
  7. public:  
  8.     virtual bool init();    
  9.     static cocos2d::CCScene* scene(CCRenderTexture* sqr);  
  10.     CREATE_FUNC(Gamepause);  
  11.     //继续游戏  
  12.     void menuContinueCallback(CCObject* pSender);  
  13.   
  14. private:  
  15.   
  16. };  
  17.   
  18. #endif // __Gamepause_H__  
然后是实现文件
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "Gamepause.h"  
  2. //传入一个CCrenderTexture   
  3. //相当于一个正在运行的游戏的截图作为这个暂停对话框的背景   
  4. //这样就看起来像是对话框在游戏界面之上,一般游戏当中都是这样子写的。  
  5. CCScene* Gamepause::scene(CCRenderTexture* sqr)  
  6. {  
  7.   
  8.     CCScene *scene = CCScene::create();  
  9.     Gamepause *layer = Gamepause::create();  
  10.      scene->addChild(layer,1);  
  11.       //增加部分:使用Game界面中截图的sqr纹理图片创建Sprite  
  12.     //并将Sprite添加到GamePause场景层中  
  13.     //得到窗口的大小  
  14.     CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();  
  15.     CCSprite *back_spr = CCSprite::createWithTexture(sqr->getSprite()->getTexture());    
  16.     back_spr->setPosition(ccp(visibleSize.width/2,visibleSize.height/2)); //放置位置,这个相对于中心位置。  
  17.     back_spr->setFlipY(true);            //翻转,因为UI坐标和OpenGL坐标不同  
  18.     back_spr->setColor(cocos2d::ccGRAY); //图片颜色变灰色  
  19.     scene->addChild(back_spr);  
  20.     return scene;  
  21. }  
  22.   
  23. bool Gamepause::init()  
  24. {  
  25.   
  26.     if ( !CCLayer::init() )  
  27.     {  
  28.         return false;  
  29.     }  
  30.     //得到窗口的大小  
  31.     CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();  
  32.     //原点坐标  
  33.     CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();  
  34.   
  35.     //继续游戏按钮  
  36.     CCMenuItemImage *pContinueItem = CCMenuItemImage::create(  
  37.         "pause_continue.png",  
  38.         "pause_continue.png",  
  39.         this,  
  40.         menu_selector(Gamepause::menuContinueCallback));  
  41.   
  42.     pContinueItem->setPosition(ccp( visibleSize.width/2 ,visibleSize.height/2+30));  
  43.   
  44.   
  45.     CCMenu* pMenu = CCMenu::create(pContinueItem,NULL);  
  46.     pMenu->setPosition(CCPointZero);  
  47.     this->addChild(pMenu, 2);  
  48.   
  49.     return true;  
  50. }  
  51. void Gamepause::menuContinueCallback(CCObject* pSender)  
  52. {  
  53.     CCDirector::sharedDirector()->popScene();  
  54.   
  55. }  
使用方法

 在游戏主界面init函数加个:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. CCMenuItemImage *pCloseItem = CCMenuItemImage::create(  
  2.     "CloseNormal.png",  
  3.     "CloseSelected.png",  
  4.     this,  
  5.     menu_selector(HelloWorld::menuPauseCallback));  
  6.   
  7. pCloseItem->setPosition(ccp(visibleSize.width - pCloseItem->getContentSize().width/2 ,  
  8.     visibleSize.height - pCloseItem->getContentSize().height/2));  
  9.   
  10. // create menu, it's an autorelease object  
  11. CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);  
  12. pMenu->setPosition(CCPointZero);  
  13. this->addChild(pMenu, 1);  

然后是回调用的函数 暂停界面((记得加上面的头文件就是了))

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. void HelloWorld::menuPauseCallback(CCObject* pSender)  
  2. {  
  3.     //得到窗口的大小  
  4.     CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();  
  5.     CCRenderTexture *renderTexture = CCRenderTexture::create(visibleSize.width,visibleSize.height);  
  6.   
  7.     //遍历当前类的所有子节点信息,画入renderTexture中。  
  8.     //这里类似截图。  
  9.     renderTexture->begin();   
  10.     this->getParent()->visit();  
  11.     renderTexture->end();  
  12.   
  13.     //将游戏界面暂停,压入场景堆栈。并切换到GamePause界面  
  14.     CCDirector::sharedDirector()->pushScene(Gamepause::scene(renderTexture));  
  15. }  

这里来看看效果:



效果就是这样了,基本实现了游戏暂停的功能了。上面的代码可以直接拿去用,自己把图片改改就行了


二、游戏暂停界面美化实现

单单只有上面的肯定是不行的,太难看了,所以给图片的按钮加个背景图片,然后再加三个按钮,

这是按钮背景图片


这是三个按钮的图片

        

要用的直接拿去用,全是我原创的

直接看下代码,就是在上面的基础上来增加函数的

Gamepause.h

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #ifndef __Gamepause__H__  
  2. #define __Gamepause__H__  
  3. #include "cocos2d.h"  
  4. USING_NS_CC;  
  5. class Gamepause : public cocos2d::CCLayer  
  6. {  
  7. public:  
  8.     virtual bool init();    
  9.     static cocos2d::CCScene* scene(CCRenderTexture* sqr);  
  10.     CREATE_FUNC(Gamepause);  
  11.     //继续游戏  
  12.     void menuContinueCallback(CCObject* pSender);  
  13.     //重新开始游戏  
  14.     void menuRestart(CCObject* pSender);  
  15.     //回主界面  
  16.     void menuLogin(CCObject* pSender);  
  17. private:  
  18.   
  19. };  
  20.   
  21. #endif // __Gamepause_H__  

Gamepause.cpp
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "Gamepause.h"  
  2. #include "HelloWorldScene.h"//重新开始游戏的头文件  
  3. //传入一个CCrenderTexture   
  4. //相当于一个正在运行的游戏的截图作为这个暂停对话框的背景   
  5. //这样就看起来像是对话框在游戏界面之上,一般游戏当中都是这样子写的。  
  6. CCScene* Gamepause::scene(CCRenderTexture* sqr)  
  7. {  
  8.   
  9.     CCScene *scene = CCScene::create();  
  10.     Gamepause *layer = Gamepause::create();  
  11.         scene->addChild(layer,1);//把游戏层放上面,我们还要在这上面放按钮  
  12.   
  13.   
  14.     //增加部分:使用Game界面中截图的sqr纹理图片创建Sprite  
  15.     //并将Sprite添加到GamePause场景层中  
  16.     //得到窗口的大小  
  17.     CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();  
  18.     CCSprite *back_spr = CCSprite::createWithTexture(sqr->getSprite()->getTexture());    
  19.     back_spr->setPosition(ccp(visibleSize.width/2,visibleSize.height/2)); //放置位置,这个相对于中心位置。  
  20.     back_spr->setFlipY(true);            //翻转,因为UI坐标和OpenGL坐标不同  
  21.     back_spr->setColor(cocos2d::ccGRAY); //图片颜色变灰色  
  22.     scene->addChild(back_spr);  
  23.   
  24.   
  25.     //添加游戏暂停背景小图,用来放按钮  
  26.     CCSprite *back_small_spr = CCSprite::create("back_pause.png");  
  27.     back_small_spr->setPosition(ccp(visibleSize.width/2,visibleSize.height/2)); //放置位置,这个相对于中心位置。  
  28.     scene->addChild(back_small_spr);  
  29.   
  30.   
  31.     return scene;  
  32. }  
  33.   
  34. bool Gamepause::init()  
  35. {  
  36.   
  37.     if ( !CCLayer::init() )  
  38.     {  
  39.         return false;  
  40.     }  
  41.     //得到窗口的大小  
  42.     CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();  
  43.     //原点坐标  
  44.     CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();  
  45.   
  46.     //继续游戏按钮  
  47.     CCMenuItemImage *pContinueItem = CCMenuItemImage::create(  
  48.         "pause_continue.png",  
  49.         "pause_continue.png",  
  50.         this,  
  51.         menu_selector(Gamepause::menuContinueCallback));  
  52.   
  53.     pContinueItem->setPosition(ccp( visibleSize.width/2 ,visibleSize.height/2+30));  
  54.   
  55.     //重新开始游戏按钮  
  56.     CCMenuItemImage *pRestartItem = CCMenuItemImage::create(  
  57.         "pause_restart.png",  
  58.         "pause_restart.png",  
  59.         this,  
  60.         menu_selector(Gamepause::menuRestart));  
  61.   
  62.     pRestartItem->setPosition(ccp( visibleSize.width/2 ,visibleSize.height/2-20));  
  63.   
  64.     //回主界面  
  65.     CCMenuItemImage *pLoginItem = CCMenuItemImage::create(  
  66.         "pause_login.png",  
  67.         "pause_login.png",  
  68.         this,  
  69.         menu_selector(Gamepause::menuLogin));  
  70.   
  71.     pLoginItem->setPosition(ccp( visibleSize.width/2 ,visibleSize.height/2-70));  
  72.   
  73.   
  74.     // create menu, it's an autorelease object  
  75.     CCMenu* pMenu = CCMenu::create(pContinueItem,pRestartItem,pLoginItem,NULL);  
  76.     pMenu->setPosition(CCPointZero);  
  77.     this->addChild(pMenu, 2);  
  78.   
  79.   
  80.   
  81.       
  82.   
  83.   
  84.     return true;  
  85. }  
  86. void Gamepause::menuContinueCallback(CCObject* pSender)  
  87. {  
  88.     CCDirector::sharedDirector()->popScene();  
  89.   
  90. }  
  91. //重新开始游戏  
  92. void  Gamepause::menuRestart(CCObject* pSender)  
  93. {  
  94.     CCDirector::sharedDirector()->replaceScene(HelloWorld::scene());  
  95. }  
  96. //回主界面  
  97. void  Gamepause::menuLogin(CCObject* pSender)  
  98. {  
  99.   
  100. }  


最后再来看看效果:





三、思路总结

            游戏暂停将当前界面截图,然后这个张图去创建一个层,然后就是push场景和pop场景了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值