cocos2dx监听home键,锁屏,后台转前台暂停功能
2013-05-29 10:47
393 查看
原帖:http://www.tuicool.com/articles/7nEJz2
根据cocos2d-x游戏原理当home键或者锁屏键被按下,游戏处于后台状态就会调用AppDelegate.cpp里面的方法applicationDidEnterBackground()
其实按照这个方法的意思就可以知道到底是怎么回事了。所以我们就在这个方法内部写自己的东西。
首先,我说一下原理, 自己写了一个Dialog 模态对话框(这个可以搜到), 然后写了自己写了一个方法
传入一个CCrenderTexture 相当于一个正在运行的游戏的截图作为这个暂停对话框的背景 这样就看起来像是对话框在游戏界面之上,一般游戏当中都是这样子写的。
在applicationDidEnterBackground()里面这样写:
我把我游戏的场景设置了一个Tag 这样子我就可以判断什么时候弹出暂停对话框:就是当游戏处于运行状态的时候才弹出对话框 当游戏处于选择关卡什么的界面的时候没有必要弹出对话框的。
当写了以上代码后 成功运行在android上面,但是发现游戏暂停是暂停了 但是背景音乐没有暂停,这个时候就得说起另外一个方法applicationWillEnterForeground 当home键以后再进入游戏就会执行这个
所以我这样写的:
然后在pauseLayer里面当点击继续游戏的时候恢复声音 这种用户体验很好
对了为什么要用 CCDirector::sharedDirector()->pushScene(pause);呢 是因为在punshScene我的这个暂停CCScene以后 原来的那个CCScene在栈底处于暂停状态 所以我们在pauseLayer里面当点击继续游戏按钮的时候 就把pauseLayer从栈中pop弹出 然后游戏场景就会恢复正常。
根据cocos2d-x游戏原理当home键或者锁屏键被按下,游戏处于后台状态就会调用AppDelegate.cpp里面的方法applicationDidEnterBackground()
其实按照这个方法的意思就可以知道到底是怎么回事了。所以我们就在这个方法内部写自己的东西。
首先,我说一下原理, 自己写了一个Dialog 模态对话框(这个可以搜到), 然后写了自己写了一个方法
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; }
传入一个CCrenderTexture 相当于一个正在运行的游戏的截图作为这个暂停对话框的背景 这样就看起来像是对话框在游戏界面之上,一般游戏当中都是这样子写的。
在applicationDidEnterBackground()里面这样写:
void AppDelegate::applicationDidEnterBackground() { CCDirector::sharedDirector()->stopAnimation(); SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); CCSize size = CCDirector::sharedDirector()->getWinSize(); 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); pause->setTag(30+1); CCDirector::sharedDirector()->pushScene(pause); }else { CCLog("do nothing"); } }
我把我游戏的场景设置了一个Tag 这样子我就可以判断什么时候弹出暂停对话框:就是当游戏处于运行状态的时候才弹出对话框 当游戏处于选择关卡什么的界面的时候没有必要弹出对话框的。
当写了以上代码后 成功运行在android上面,但是发现游戏暂停是暂停了 但是背景音乐没有暂停,这个时候就得说起另外一个方法applicationWillEnterForeground 当home键以后再进入游戏就会执行这个
所以我这样写的:
CCDirector::sharedDirector()->startAnimation(); int tag = CCDirector::sharedDirector()->getRunningScene()->getTag(); switch (tag) { case 30: CCLog("Tag = 30 do nothing"); break; case 31: CCLog("Tag = 31 do nothing"); break; default: CCLog("Tag = other do something"); SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); break; }
然后在pauseLayer里面当点击继续游戏的时候恢复声音 这种用户体验很好
void PauseLayer::NextMenuItemCallback(CCObject *pSender) { SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); CCDirector::sharedDirector()->popScene(); }
对了为什么要用 CCDirector::sharedDirector()->pushScene(pause);呢 是因为在punshScene我的这个暂停CCScene以后 原来的那个CCScene在栈底处于暂停状态 所以我们在pauseLayer里面当点击继续游戏按钮的时候 就把pauseLayer从栈中pop弹出 然后游戏场景就会恢复正常。
相关文章推荐
- cocos2dx监听home键,锁屏,后台转前台暂停功能
- cocos2dx监听home键,锁屏,后台转前台暂停功能
- cocos2dx监听home键,锁屏,后台转前台暂停功能
- cocos2dx监听home键,锁屏,后台转前台暂停功能
- cocos2dx监听home键,锁屏,后台转前台暂停功能
- cocos2dx监听home键,锁屏,后台转前台暂停功能
- cocos2dx监听home键,锁屏,后台转前台暂停功能
- [Android开发] 从后台恢复前台界面需要输入密码的demo|监听Home短按长按锁屏
- Android 改写返回键事件监听,使得back键功能类似home键,让Acitivty退至后台时不被系统销毁
- Android-服务中监听电源键和Home键的广播、在锁屏下仍然工作的方法
- 探讨Android实现后台(Service)按键监听的功能
- cocos2dx3.13 lua注册、分发监听真机切到后台事件
- 关于 android app 返回键模拟 home键 功能的介绍_仿QQ返回键 又重新回到当前界面_锁屏状态 又要重新唤醒
- ios 监听app从后台恢复到前台
- 如何监听android程序进入后台,和恢复到前台???
- android 监听app进入后台以及从后台进入前台
- linux学习入门2-3——bash命令基本操作(linuxcast.net)(bash部分快捷键、uname、history、通配符、切换用户、作业管理(前台、后台运行,暂停等操作))
- iOS开发-基础:监听app从后台恢复到前台
- [Android界面] 如何监听android程序进入后台,和恢复到前台???
- ios开发——日常之ios 监听app从后台恢复到前台