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

分类Cocos2d-x 7954人阅读 评论(5) 收藏 举报

游戏暂停界面:

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的相关代码如下:
copy
    CCScene*PauseLayer::scene(CCRenderTexture*sqr,boolisFlip){
  1. CCScene*m_scene=CCScene::create();
  2. CCSprite*_spr=CCSprite::createWithTexture(sqr->getSprite()->getTexture());
  3. _spr->setPosition(ccp(400,300));
  4. _spr->setFlipY(isFlip);
  5. _spr->setColor(ccGRAY);
  6. m_scene->addChild(_spr);
  7. //'layer'isanautoreleaSEObject
  8. PauseLayer*layerr=PauseLayer::create();
  9. //addlayerasachildtoscene
  10. m_scene->addChild(layerr);
  11. //returnthescene
  12. returnm_scene;
  13. }


监听返回键和Menu键:

要点:

1.继承CCKeypadDelegate

2.实现两个虚函数

virtual void keyBackClicked()
virtual void keyMenuClicked()

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

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

copy
    classCC_DLLcclayer:publicCCNode,publicCCTouchDelegate,153); font-weight:bold; background-color:inherit">publicCCAccelerometerDelegate,153); font-weight:bold; background-color:inherit">publicCCKeypadDelegate


监听home键:

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

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

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

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

相关代码如下:

copy
    voidAppDelegate::applicationDidEnterBackground()
  1. {
  2. SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
  3. Global*sh=Global::toIns();
  4. CCRenderTexture*renderTexture;
  5. switch(sh->targetScene){
  6. caseTargetSceneFirstScene:
  7. break;
  8. caseTargetScenesecondScene:
  9. renderTexture=CCRenderTexture::create(800,600);
  10. renderTexture->begin();
  11. sh->battleLayer->visit();
  12. renderTexture->end();
  13. CCDirector::sharedDirector()->pushScene(PauseLayer::scene(renderTexture,153); font-weight:bold; background-color:inherit">false));
  14. caseTargetSceneInvalid:
  15. default:
  16. }
  17. //thisfunctionwillbecalledwhentheappisactiveagain
  18. voidAppDelegate::applicationWillEnterForeground()
  19. SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
  20. }

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


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

相关文章

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