cocos2d在两场景间转换,生成的动作在addChild时会出错,求解

yxlovemoney 2014-06-14 11:26:37
有A,B两场景,从场景A到B场景,在B场景音乐播放完了,我就通过
CCNotificationCenter::sharedNotificationCenter()->postNotification("Time", NULL);发送一个消息(这个发送消息的是在音乐的管理类里面的)

B场景就通过

CCNotificationCenter::sharedNotificationCenter()->addObserver(this, callfuncO_selector(CGameScene::TimeOutMsg), "Time", NULL); // 这放在了INIT方法里


接收消息后,就调用一个方法,这方法大概就是

void TimeOutMsg()
{
CCSprite *sp1 = CCSprite::create("myLight_1.png"); 一个精灵
CCRotateTo *rotate1 = CCRotateTo::create(1.5f, 180);一个动作
sp1->runAction((rotate1));
this->addChild(sp1);
}



跑完这些动作,返回到A场景,
然后又从A场景进入B场景,再做一次这些动作,
但这次跑到this->addChild(sp1);就出错了


这样一个错误,大概是内存冲突什么的,想不明白为什么,我的精灵跟动作都是局部的,按道理,返回A这些变量就回收了,后来我还特意在析构加了this->removeAllChildrenWithCleanup(true);看是不是这类问题,结果还是报错。

再之后 我把这个 CCSprite *sp1改为成员变量, 不行,
再再之后,我先到构造函数 初始化成员变量
sp1 = CCSprite::create("myLight_1.png");
this->addChild(sp1);

结束时在TimeOutMsg方法
CCSprite *csp1 = (CCSprite*)this->getChildByTag(101); 这样把对象取回来再RUNACTION也是会出错。

实在想不出什么问题了,求帮忙。
...全文
148 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxlovemoney 2014-06-16
  • 打赏
  • 举报
回复
引用 1 楼 musicvs 的回复:
你要在B场景的onExit或者析构函数里取消消息的订阅:CCNotificationCenter::sharedNotificationCenter()->removeAllObserver(this); 函数名字不知道有没有记错,现在用的是别人的电脑,没法看代码,嘿嘿 否则,一直切换场景,就会有越来越多的B场景在订阅消息,理应被释放的那些B场景,在接收消息的时候当然就会报错了(话说为什么是这个表情?)
非常感谢,原来就是这个问题,真解决了我个大问题
笨木头 2014-06-14
  • 打赏
  • 举报
回复
你要在B场景的onExit或者析构函数里取消消息的订阅:CCNotificationCenter::sharedNotificationCenter()->removeAllObserver(this); 函数名字不知道有没有记错,现在用的是别人的电脑,没法看代码,嘿嘿 否则,一直切换场景,就会有越来越多的B场景在订阅消息,理应被释放的那些B场景,在接收消息的时候当然就会报错了(话说为什么是这个表情?)

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧