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

转自:http://blog.csdn.net/qq634416025/article/details/8739780

根据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弹出 然后游戏场景就会恢复正常。

效果图:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值