[cocos2dx]问个关于CCNotificationCenter发送消息的问题(其实也不知道是否这里的问题)

yxlovemoney 2014-09-09 03:08:32
首先又是个让我想不通的问题,也是很让我郁闷的,写了几个小东西后,遇上的困难依然没有减少,反而觉得遇到的越来越麻烦,
难道我真要把引擎的源码好好分析一遍才行吗? AI,小小吐槽一下。

问题描述开始:
====================================================================================
首先有这样一个类A,继承了public CCLayer, public CCTableViewDataSource, public CCTableViewDelegate
几个类,用于实现CCTableView的滑屏功能。 显示一张张的图片
像这样(图1)



然后再建一个类B,其只继承了 CCLayer , 为的是显示滑屏上小图片的放大版本,
像这样显示(图2)


而类B,我是在类A中通过这样的方式添加的

// 类A.cpp

类B *layer = 类B::create(unClickIndex);
layer->setScale(0);

this->addChild(layer, HIGH);



一点击图1上的小图,就显示图2上的大图,就是这样。


然而在图2显示时,后面的滑屏和返回功能我必须屏蔽,当按图2上的关闭按钮把图关闭回到图1时,又需要恢复
滑屏和返回按钮的功能,所以这里我就在类B里用了
CCNotificationCenter::sharedNotificationCenter()->postNotification("Resume", NULL);
这个发送消息的方法。
具体代码如下:

void CScreenshotAmplify::closeBigScreenshot(CCObject *pSender)
{
// this->removeChildByTag(BIGSCREENSHOT_TAG, true);
// this->removeChildByTag(SCREENSHOTFRAME_TAG, true);
this->removeAllChildrenWithCleanup(true);
// 从精灵帧缓存池删除图片缓存
CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFramesFromFile("selectScenePic/button.plist");
// 向浏览界面发送恢复点击的消息
CCNotificationCenter::sharedNotificationCenter()->postNotification("Resume", NULL);

// 关闭时标记变量置为0
setFlag(0);
}

当类B界面关闭时就发送这个消息到类A,让类A恢复滑屏等功能。


经过前面的提问知道,在接收消息的类A,需要调用
CCNotificationCenter::sharedNotificationCenter()->removeAllObservers(this);
取消消息的订阅。而我把这方法放在 OnExit里面


之后重点在这里
而现在相当奇怪的就是当加上这句,退出类A类B的界面后,去到别的界面,再开启另外一个带滑屏的界面时,就会报错!
错误定位到了CCTableView.cpp上的

unsigned int CCTableView::_indexFromOffset(CCPoint offset)
{
int index = 0;
const int maxIdx = m_pDataSource->numberOfCellsInTableView(this)-1; // 定位到这里
。。。。。


而且我把 OnExit里的 CCNotificationCenter 这句代码注释掉同样报错,必须连同 OnExit这方法也一起注释掉才行。
即使把CCNotificationCenter::sharedNotificationCenter()->removeAllObservers(this);这句放到析构函数中也是一样
的情况。当然不加这句最后也是会出错的。

这实在是让人很摸不着头脑。分析了很久没找到解决的方向。希望给点解决思路我这只渣得不行的渣鸟吧。这引擎实在是不好驾驭。。。。。
...全文
271 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxlovemoney 2014-09-10
  • 打赏
  • 举报
回复
引用 3 楼 musicvs 的回复:
就是,和你这种一样的~ 对话框不是要屏蔽下层的触摸事件么,你的这个也需要~ 但是我以前的做法就是在对话框底部加一个Layer,这个Layer的触摸优先级大于所有的节点,除了对话框及其上面的节点~ 总之,就是修改触摸优先级,效果和你的一样,但是没有用到消息订阅,耦合没有那么强 (2.x的触摸机制很折腾人,我是怕了~) 那篇文章也是类似的做法,我找到了,你参考一下看看:http://www.tairan.com/archives/4854 这里还有一篇:http://www.zaojiahua.com/popscene.html PS:我并没有去验证文章的代码,因为那时候我已经自己实现了,你看看思路~应该差不多
好的,我先参考一下
笨木头 2014-09-09
  • 打赏
  • 举报
回复
就是,和你这种一样的~ 对话框不是要屏蔽下层的触摸事件么,你的这个也需要~ 但是我以前的做法就是在对话框底部加一个Layer,这个Layer的触摸优先级大于所有的节点,除了对话框及其上面的节点~ 总之,就是修改触摸优先级,效果和你的一样,但是没有用到消息订阅,耦合没有那么强 (2.x的触摸机制很折腾人,我是怕了~) 那篇文章也是类似的做法,我找到了,你参考一下看看:http://www.tairan.com/archives/4854 这里还有一篇:http://www.zaojiahua.com/popscene.html PS:我并没有去验证文章的代码,因为那时候我已经自己实现了,你看看思路~应该差不多
yxlovemoney 2014-09-09
  • 打赏
  • 举报
回复
引用 1 楼 musicvs 的回复:
你的问题依旧是那么委婉曲折,步步深入...引人...(旁白:停!) 估计这问题最后还是你自己搞定的...因为我感觉旁人还是没法完全明白你的问题 那,现在你出问题的地方是在屏蔽(以及恢复)按钮和滑动列表的处理上吗? 如果是的话,也许你应该换一种处理方式,用消息订阅的方式来处理,感觉不太妥。 因为用消息订阅来处理,那,如果换了一个界面,又要重新订阅一次,每一个新的界面,只要用到屏蔽的功能,都要这么做,可能就写得有点“死”。不过,我只是从你这段描述来猜测的,如果说错了,就,那个喇~~ 而且用这种方式还增加了逻辑的复杂度,比如你现在就很可能是消息订阅间出的问题 我记得泰然网有一篇文章,介绍了对话框的实现思路,其中就必须用到屏蔽下层事件的功能,我觉得你用实现对话框的方式来完成这个功能比较合适~ 显然我说了一堆废话,不过,如果你时间不紧的话,确实换一种方式比较好~ PS:为嘛不用3.x版本呢?3.x的这个功能就简单多了,基本上一句代码就搞定了~
对话框的方式?有这东西么?COCOS自带的? (3.X考虑到很多东西,一方面还不怎么熟,一方面还有网络问题。。。。)
笨木头 2014-09-09
  • 打赏
  • 举报
回复
你的问题依旧是那么委婉曲折,步步深入...引人...(旁白:停!) 估计这问题最后还是你自己搞定的...因为我感觉旁人还是没法完全明白你的问题 那,现在你出问题的地方是在屏蔽(以及恢复)按钮和滑动列表的处理上吗? 如果是的话,也许你应该换一种处理方式,用消息订阅的方式来处理,感觉不太妥。 因为用消息订阅来处理,那,如果换了一个界面,又要重新订阅一次,每一个新的界面,只要用到屏蔽的功能,都要这么做,可能就写得有点“死”。不过,我只是从你这段描述来猜测的,如果说错了,就,那个喇~~ 而且用这种方式还增加了逻辑的复杂度,比如你现在就很可能是消息订阅间出的问题 我记得泰然网有一篇文章,介绍了对话框的实现思路,其中就必须用到屏蔽下层事件的功能,我觉得你用实现对话框的方式来完成这个功能比较合适~ 显然我说了一堆废话,不过,如果你时间不紧的话,确实换一种方式比较好~ PS:为嘛不用3.x版本呢?3.x的这个功能就简单多了,基本上一句代码就搞定了~

8,303

社区成员

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

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