cocos2d-x 游戏暂停界面,监听home键,返回键,Menu键 解决方案

转自:http://blog.csdn.net/we000636/article/details/8597540


游戏暂停界面:

cocos2d-x中游戏暂停界面提供的思路是用pushScene()和popScne(),即推进和弹出场景,当游戏暂停时,推进(pushScene())暂停场景,之前运行的场景将会自动暂停,然后我们可以在暂停场景中操作,如Resume,ReStart,Quit等,当我们不再需要暂停场景时,可以popScene()将暂停场景弹出。(场景就像一张纸,我们推进一个场景,相当于在这张纸上再盖上一张,弹出场景相当于将最表面的那张纸拿掉)。

推进暂停场景的相关代码如下:

  1. CCRenderTexture*renderTexture=CCRenderTexture::create(800,600);
  2. renderTexture->begin();
  3. this->getParent()->visit();
  4. renderTexture->end();//这里实际是通过CCRenderTexture保存当前界面(相当于截屏),然后传递给暂停界面,当成背景精灵
  5. CCDirector::sharedDirector()->pushScene(PauseLayer::scene(renderTexture,true));

暂停场景PauseLayer的相关代码如下:

  1. CCScene*PauseLayer::scene(CCRenderTexture*sqr,boolisFlip){
  2. CCScene*m_scene=CCScene::create();
  3. CCSprite*_spr=CCSprite::createWithTexture(sqr->getSprite()->getTexture());
  4. _spr->setPosition(ccp(400,300));
  5. _spr->setFlipY(isFlip);
  6. _spr->setColor(ccGRAY);
  7. m_scene->addChild(_spr);
  8. //'layer'isanautoreleaseobject
  9. PauseLayer*layerr=PauseLayer::create();
  10. //addlayerasachildtoscene
  11. m_scene->addChild(layerr);
  12. //returnthescene
  13. returnm_scene;
  14. }


监听返回键和Menu键:

要点:

1.继承CCKeypadDelegate

2.实现两个虚函数

virtual void keyBackClicked()
virtual void keyMenuClicked()

如查要实现监听的对象是CCLayer或者继承CCLayer的,则只需做第二步及在初始化中setKeypadEnabled(true);

因为CCLayer本身继承了CCKeypadDelegate,如下图所示

  1. classCC_DLLCCLayer:publicCCNode,publicCCTouchDelegate,publicCCAccelerometerDelegate,publicCCKeypadDelegate


监听home键:

在cocos2d-x中我现在还没找到明确的监听home键的方案,但可以用替代方案。

不知你们有没有发现在AppDelegate.cpp里的两个方法:

  1. //Thisfunctionwillbecalledwhentheappisinactive.Whencomesaphonecall,it'sbeinvokedtoo
  2. voidAppDelegate::applicationDidEnterBackground(){
  3. CCDirector::sharedDirector()->stopAnimation();
  4. //ifyouuseSimpleAudioEngine,itmustbepause
  5. //SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
  6. }
  7. //thisfunctionwillbecalledwhentheappisactiveagain
  8. voidAppDelegate::applicationWillEnterForeground(){
  9. CCDirector::sharedDirector()->startAnimation();
  10. //ifyouuseSimpleAudioEngine,itmustresumehere
  11. //SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
  12. }

注意这两个方法的英文解释,实际上这两个方法就是判断程序是否被切换或者说是否被扔至后台工作。因为在手机上按home键,实际就是切换将程序推至后台。So,我们就能在这两个方法做文章了。

相关代码如下:

  1. voidAppDelegate::applicationDidEnterBackground()
  2. {
  3. CCDirector::sharedDirector()->stopAnimation();
  4. SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
  5. Global*sh=Global::toIns();
  6. CCRenderTexture*renderTexture;
  7. switch(sh->targetScene){
  8. caseTargetSceneFirstScene:
  9. break;
  10. caseTargetSceneSecondScene:
  11. renderTexture=CCRenderTexture::create(800,600);
  12. renderTexture->begin();
  13. sh->battleLayer->visit();
  14. renderTexture->end();
  15. CCDirector::sharedDirector()->pushScene(PauseLayer::scene(renderTexture,false));
  16. break;
  17. caseTargetSceneInvalid:
  18. break;
  19. default:
  20. break;
  21. }
  22. }
  23. //thisfunctionwillbecalledwhentheappisactiveagain
  24. voidAppDelegate::applicationWillEnterForeground()
  25. {
  26. CCDirector::sharedDirector()->startAnimation();
  27. SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
  28. }

在上面的代码中,我做的是,当程序InActive(推至后台)时,推进暂停界面


如果还有其它的解决方案,欢迎留言



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值