CCNode和CCObject

今天出了在使用cocosbuilder调用菜单的时候出现了上次按钮类似的崩溃,最后查明了原因,同时也说下CCNode和CCObject的关系。

首先,CCNode是一个节点类,是层Layer,场景Scene,精灵Sprite的的父类,是一个节点,有tag值和很多相关的方法,这个可以通过查看类内的接口来了解。
CCObject则是几乎所有cocos2d的父类,关系可以看下图。

1365209135_1941.jpg

这里我在使用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,所以出错了。而如果你是用代码,不是用这个宏,则不会出错,所以以后还是多看看内部的代码为好,同时细心解决问题记录才是硬道理。

Last modification:January 1st, 1970 at 08:00 am
如果看了这个文章可以让你少加会班,可以请我喝杯可乐
已打赏名单
微信公众号

Leave a Comment