今天出了在使用cocosbuilder调用菜单的时候出现了上次按钮类似的崩溃,最后查明了原因,同时也说下CCNode和CCObject的关系。
首先,CCNode是一个节点类,是层Layer,场景Scene,精灵Sprite的的父类,是一个节点,有tag值和很多相关的方法,这个可以通过查看类内的接口来了解。
CCObject则是几乎所有cocos2d的父类,关系可以看下图。
这里我在使用menu调用方法的时候是这样写的。
void WishingTreeLayer::AwardShowMenuCallBack(CCNode *pSender) { //…… }
想法和平常一样,是不用转换了,直接使用pSender->getTag();来直接获取Tag值,当然这个也是我经常这么干的。比如说我平常如果知道只是传一个button,我会直接写为button类型的,而这次问题就出现在了这里。当然如果你是使用的代码,比如说pMenu->settarget的方式,在这个函数里面直接写其他类型是没有关系的,但是这次因为直接是用cocosbuilder绑定的,所以出现了问题。
首先查看这个绑定的函数:
SEL_MenuHandler WishingTreeLayer::onResolveCCBCCMenuItemSelector(CCObject *pTarget, const char *pSelectorName) { CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "AwardShowMenu", WishingTreeLayer::AwardShowMenuCallBack); return NULL; }
在这个函数里面是这么定义的宏:
#define CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(TARGET, SELECTORNAME, METHOD) if(pTarget == TARGET && strcmp(pSelectorName, SELECTORNAME) == 0) { \ return menu_selector(METHOD); \ }
而这个宏的定义是这样的:
#define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR) typedef void (CCObject::*SEL_MenuHandler)(CCObject*);
好,问题出来了,现在对应的是CCObject,而不是CCNode,所以出错了。而如果你是用代码,不是用这个宏,则不会出错,所以以后还是多看看内部的代码为好,同时细心解决问题记录才是硬道理。
版权属于:东哥笔记 - DongGe.org
本文链接:https://dongge.org/blog/208.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!