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

转载,原文地址:http://blog.csdn.net/qq634416025/article/details/8739780

根据cocos2d-x游戏原理当home键或者锁屏键被按下,游戏处于后台状态就会调用AppDelegate.cpp里面的方法applicationDidEnterBackground()

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

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

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

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

在applicationDidEnterBackground()里面这样写:

copy

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

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

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

所以我这样写的:

copy

    CCDirector::sharedDirector()->startAnimation();
  1. inttag=CCDirector::sharedDirector()->getRunningScene()->getTag();
  2. switch(tag)
  3. {
  4. case30:
  5. CCLog("Tag=30donothing");
  6. break;
  7. case31:
  8. CCLog("Tag=31donothing");
  9. break;
  10. default:
  11. CCLog("Tag=otherdosomething");
  12. SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
  13. 然后在pauseLayer里面当点击继续游戏的时候恢复声音 这种用户体验很好

    copy

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

      效果图:

      相关文章

          本文实践自 RayWenderlich、Ali Hafizji 的文章《...
      Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
      第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
          Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
      1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
         Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...