发现一个特定情况下的bug ...[排除了上层逻辑代码问题]

这个bug是今天写一个功能的时候发现的,目前还没有具体的解决办法,先发上来,希望管理人员能看到。

是关于游戏暂停的

游戏暂停我的实现方式是用一个CCLayer,然后Init一些按钮(包括resum,返回主菜单)

然后在一个CCLayer中,调用CCDirector::sharedirector()->pause() 将游戏暂停,然后我在返回主菜单那个MenuItem里写跳转回主菜单的CCLayer,同时resum(这样才有跳转效果)

点击返回主菜单,第一次正常返回切换界面,然后再进入游戏,再暂停,就会发生析构错误(或者反复几次),我将上层逻辑代码都注销掉,单纯的让2个界面之间切换(先暂停,再跳转场景),总是会发生析构错误,在cocos2d-x内部

我观察cocos2d-x内部是在跳转界面后,析构前面一个界面,然后就在层层析构的时候,到达一个CCArray就会报错了,

我使用的版本是cocos2d-x 2.0,还没有找到原因,怀疑是暂停导致的。可能要换一种暂停的写法了

等我找到原因再贴上来吧。。。如果有知道的大神也希望赐教一下

— Begin quote from ____

skoky 发表于 2012-8-16 09:13 url

给你提供两个方法用于暂停和恢复 一个Node

— End quote

万分感谢,mark收藏

— Begin quote from ____

juckerpp 发表于 2012-8-15 09:42 url

看来真的是BUG了。。我找到了test里的ActionTest,里面的PauseResumeActions。。。也是用pause暂停动作。。 …

— End quote

给你提供两个方法用于暂停和恢复 一个Node


void KimiXin::KXTool::pauseNode( CCNode* cnode)
{
	if ( cnode )
	{
		cnode->pauseSchedulerAndActions();
		CCArray* children = cnode->getChildren();
		do {
			if(children && children->count() > 0)
			{
				CCObject* child = NULL;
				CCARRAY_FOREACH(children, child)
				{
					CCNode* pNode = (CCNode*) child;
					if(pNode)
					{
						pauseNode(pNode);
					}
				}                                               
			}                                               
		}while(false);
	}
}

void KimiXin::KXTool::resumeNode( CCNode* cnode)
{
	if ( cnode )
	{
		cnode->resumeSchedulerAndActions();
		CCArray* children = cnode->getChildren();
		do {
			if(children && children->count() > 0)
			{
				CCObject* child = NULL;
				CCARRAY_FOREACH(children, child)
				{
					CCNode* pNode = (CCNode*) child;
					if(pNode)
					{
						resumeNode(pNode);
					}
				}                                               
			}                                               
		}while(false);
	}
}

实话说没有手动调用过游戏的pause,因为在暂停的时候一般只会暂停游戏的逻辑, UI还是要有动画的,所以就自己做的暂停。

这里要提一下,pause游戏后,调度器也会暂停,所以你的过度切换场景会失败,动画会失效。我猜会不会是这里引起的。

  • 本帖最后由 juckerpp 于 2012-8-15 13:53 编辑 *

看来真的是BUG了。。我找到了test里的ActionTest,里面的PauseResumeActions。。。也是用pause暂停动作。。结果例子直接都报错了

void PauseResumeActions::pause(float dt)
{
    CCLog("Pausing");
    CCDirector *director = CCDirector::sharedDirector();
    this->m_pPausedTargets = director->getActionManager()->pauseAllRunningActions();
}

void PauseResumeActions::resume(float dt)
{
    CCLog("Resuming");
    CCDirector *director = CCDirector::sharedDirector();
    director->getActionManager()->resumeTargets(this->m_pPausedTargets);
}

我在m_pPausedTargets 下面加了一句m_pPausedTargets ->retain();
可以稍微缓解,但是治标不治本,求大神修复这个例子

— Begin quote from ____

调度器也会暂停,所以你的过度切换场景会失败,动画会失效。我猜会不会是这里引起的。

— End quote

没错,所以我在调度之前先resume的