在项目开发时,发现如果用CCDirector::sharedDirector()->pause();之后精灵是做不了动作的,所以我寻求了另一种方法,
原理就是要弹出暂停界面是就用push(暂停场景),及顾名思义推出一个暂停界面,将游戏界面暂停压入栈中,当暂停界面响应后(或做动作完后)就可以pop,及拿出意思,推出栈,及之前的游戏界面会继续开始。
先新建一个暂停类PauseLayer
下面是部分实现 CCRenderTexture 是传过来的截图纹理 :
CCScene* PauseLayer::scene( CCRenderTexture *sqr, bool isFlip ) { CCScene *scene = CCScene::create(); CCSize size = CCDirector::sharedDirector()->getWinSize(); CCSprite *_spr = CCSprite::createWithTexture(sqr->getSprite()->getTexture()); _spr->setPosition(ccp(size.width / 2, size.height / 2)); _spr->setFlipY(isFlip); //是否翻转 _spr->setColor(ccGRAY); //颜色(变灰暗) scene->addChild(_spr); PauseLayer* layer = PauseLayer::create(); scene->addChild(layer); return scene; CCDirector::sharedDirector()->pause(); }
暂停之后恢复游戏使用
CCDirector::sharedDirector()->popScene();
然后就有个新的问题了,如果我的手机点击了桌面键(Home),正在进行的游戏需要变成暂停状态,该如何弄的呢,一开始我想到了用控制home的监听,但结果似乎起不来作用(它直接响应了回到手机主界面),所以只能在AppDelegate类里面修改
必须在这两个函数动手脚applicationDidEnterBackground(),applicationWillEnterForeground()
第一个表示的是退出游戏界面时(及桌面不显示游戏界面时),第二个表示的是回到游戏界面时
void AppDelegate::applicationDidEnterBackground() { CCDirector::sharedDirector()->stopAnimation(); SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); CCSize size = CCDirector::sharedDirector()->getWinSize();//在游戏界面类里的scene定义一个tag为30 CCRenderTexture* renderTexture = CCRenderTexture::create(size.width, size.height); renderTexture->retain(); CCScene *s = CCDirector::sharedDirector()->getRunningScene(); CCLog("%d", s->getTag()); if (s->getTag() == 30) { renderTexture->begin(); s->visit(); renderTexture->end(); CCScene* pause = PauseLayer::scene(renderTexture, true); Game::pauseflag=true; pause->setTag(30+1); CCDirector::sharedDirector()->pushScene(pause); }else { CCLog("do nothing"); } }
void AppDelegate::applicationWillEnterForeground() { CCDirector::sharedDirector()->startAnimation(); int tag = CCDirector::sharedDirector()->getRunningScene()->getTag(); switch (tag) { case 31: //回到来后判断是否为暂停界面 是的话不恢复声音 CCLog("Tag = 31 do nothing"); break; default: CCLog("Tag = other do something"); SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); break; } }
就这样子就搞定了 加油、。。。。。