cocos2dx监听home键,锁屏,后台转前台暂停功能

转载 2013年12月06日 11:45:01
 1083人阅读 评论(1) 收藏 举报
根据cocos2d-x游戏原理当home键或者锁屏键被按下,游戏处于后台状态就会调用AppDelegate.cpp里面的方法applicationDidEnterBackground()

其实按照这个方法的意思就可以知道到底是怎么回事了。所以我们就在这个方法内部写自己的东西。

首先,我说一下原理, 自己写了一个Dialog 模态对话框(这个可以搜到), 然后写了自己写了一个方法

  1. CCScene *PauseLayer::scene(CCRenderTexture *sqr, bool isFlip)  
  2. {  
  3.     CCScene *scene = CCScene::create();  
  4.     CCSize size = CCDirector::sharedDirector()->getWinSize();  
  5.   
  6.     CCSprite *_spr = CCSprite::createWithTexture(sqr->getSprite()->getTexture());  
  7.     _spr->setPosition(ccp(size.width / 2, size.height / 2));  
  8.     _spr->setFlipY(isFlip);  
  9.     _spr->setColor(ccGRAY);  
  10.     scene->addChild(_spr);  
  11.   
  12.     PauseLayer* layer = PauseLayer::create();  
  13.     scene->addChild(layer);  
  14.   
  15.     return scene;  
  16. }  

传入一个CCrenderTexture 相当于一个正在运行的游戏的截图作为这个暂停对话框的背景 这样就看起来像是对话框在游戏界面之上,一般游戏当中都是这样子写的。

在applicationDidEnterBackground()里面这样写:

  1. void AppDelegate::applicationDidEnterBackground()  
  2. {  
  3.     CCDirector::sharedDirector()->stopAnimation();  
  4.     SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();  
  5.     CCSize size = CCDirector::sharedDirector()->getWinSize();  
  6.   
  7.         CCRenderTexture* renderTexture = CCRenderTexture::create(size.width, size.height);  
  8.         renderTexture->retain();  
  9.         CCScene *s = CCDirector::sharedDirector()->getRunningScene();  
  10.           
  11.         CCLog("%d", s->getTag());  
  12.   
  13.         if (s->getTag() == 30)  
  14.         {  
  15.             renderTexture->begin();  
  16.             s->visit();  
  17.             renderTexture->end();  
  18.             CCScene* pause = PauseLayer::scene(renderTexture, true);  
  19.             pause->setTag(30+1);  
  20.             CCDirector::sharedDirector()->pushScene(pause);  
  21.         }else  
  22.         {  
  23.             CCLog("do nothing");  
  24.         }  
  25. }  

我把我游戏的场景设置了一个Tag 这样子我就可以判断什么时候弹出暂停对话框:就是当游戏处于运行状态的时候才弹出对话框 当游戏处于选择关卡什么的界面的时候没有必要弹出对话框的。

当写了以上代码后 成功运行在android上面,但是发现游戏暂停是暂停了  但是背景音乐没有暂停,这个时候就得说起另外一个方法applicationWillEnterForeground 当home键以后再进入游戏就会执行这个

所以我这样写的:

  1. CCDirector::sharedDirector()->startAnimation();  
  2.     int tag = CCDirector::sharedDirector()->getRunningScene()->getTag();  
  3.   
  4.     switch (tag)  
  5.     {  
  6.     case 30:  
  7.         CCLog("Tag = 30 do nothing");  
  8.         break;  
  9.     case 31:  
  10.         CCLog("Tag = 31 do nothing");  
  11.         break;  
  12.     default:  
  13.         CCLog("Tag = other do something");  
  14.         SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();  
  15.         break;  
  16.     }  

然后在pauseLayer里面当点击继续游戏的时候恢复声音 这种用户体验很好

  1. void PauseLayer::NextMenuItemCallback(CCObject *pSender)  
  2. {  
  3.     SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();  
  4.     CCDirector::sharedDirector()->popScene();  
  5. }  

对了为什么要用 CCDirector::sharedDirector()->pushScene(pause);呢  是因为在punshScene我的这个暂停CCScene以后 原来的那个CCScene在栈底处于暂停状态 所以我们在pauseLayer里面当点击继续游戏按钮的时候 就把pauseLayer从栈中pop弹出 然后游戏场景就会恢复正常。

效果图:

解决cocos2d-x 安卓锁屏再解锁,OPenGL报错;后台转前台异常问题解决办法

最近几天解决游戏中安卓遇到一个让人蛋碎的问题,先具体描述一下问题: 游戏在安卓手机上运行正常,按HOME键转后台以后 ,再点桌面图标游戏无法正常运行,显示黑框;无法正常从后台转到前台;锁屏以后再解锁...
  • cuihao1234
  • cuihao1234
  • 2015年08月27日 12:14
  • 1321

cocos2dx如何简单判断一个点在旋转的矩形上

cocos中containsPoint使用与不旋转的矩形 关于旋转矩形可以这样玩: auto startPos = 90; auto y = visibleSize.height - 100; ...
  • u012861978
  • u012861978
  • 2016年05月21日 20:51
  • 935

cocos2dx 游戏切到后台再进入游戏的处理

由于Cocos引擎中,游戏切入后台后定时器后停掉会让某个Animation动作停止。  导致当重新进入游戏时,看到的不是你想要的画面。或者定时器倒计时的时间对不上等问题。  cc.game.EVE...
  • W_han__
  • W_han__
  • 2017年07月01日 12:30
  • 968

cocos2dx-2.X前后台切换分析,基于android平台

cocos2dx-2.X前后台切换分析,基于android平台: 1、从后台进入前台 项目的activity一般继承自Cocos2dxActivity,看过activity生命周期的 都知道onCre...
  • tianxiawuzhei
  • tianxiawuzhei
  • 2015年05月21日 17:04
  • 2318

cocos2dx 游戏切到后台再进入游戏的处理

由于cocos引擎中,游戏切入后台后定时器后停掉以及停止渲染的问题会让某个Animation动作停止。 导致当重新进入游戏时,看到的不是你想要的画面。或者定时器倒计时的时间对不上等问题。 cc.g...
  • iamlegendary
  • iamlegendary
  • 2017年02月06日 12:33
  • 3639

COCOS2DX实现线程后台运作与推送

  • 2014年09月17日 13:48
  • 7.4MB
  • 下载

quickcocos2dx 切到后台声音继续播放

供自己总结jingyanzhiyong 我现在的需求是在宝贝猫项目切到后台之后
  • y505772146
  • y505772146
  • 2014年07月21日 13:57
  • 1378

android 下 cocos2dx 后台黑屏的解决办法

问题描述:1.运行游戏,无问题 2.游戏点击网站链接,或进入后台,回来黑屏 3.eclipse控制台报错: 03-01 17:51:55.347: W/Adreno-ES20(8664): : G...
  • zszeng
  • zszeng
  • 2016年03月01日 21:36
  • 4433

Cocos2dx 禁止锁屏

IOS版本: 在文件 cocos2d::CCApplication::sharedApplication()->run();
  • tyxkzzf
  • tyxkzzf
  • 2014年08月28日 19:35
  • 4898

cocos2d-x创建安卓项目,解决锁屏会黑屏

参考 http://blog.csdn.net/hahahacff/article/details/8518541
  • dj0379
  • dj0379
  • 2015年10月13日 11:56
  • 3075
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2dx监听home键,锁屏,后台转前台暂停功能
举报原因:
原因补充:

(最多只允许输入30个字)