首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

成员函数指针兑现的回调

2013-06-26 
成员函数指针实现的回调成员函数指针实现的回调?1、回调的类型设置成基类的成员函数,每次set时进行转换2、回

成员函数指针实现的回调

成员函数指针实现的回调

?

1、回调的类型设置成基类的成员函数,每次set时进行转换

2、回调的参数是menuItem自身

3、回调的实现是 m_pListener->*m_pfnSelector)(this); ?即初始化的时候,设置的是监听者(负责处理回调的指针),

? ?回调内的参数是被点击的对象指针,一般情况下 这2个是一致的。

? ?

例子:cocos2d-x中的实现

1、CCObject.h

typedef void (CCObject::*SEL_MenuHandler)(CCObject*); ? ? ? ? ? ? // 定义回调类型

#define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR) ? ?// 定义转换成合适类型的功能函数, 注意为了可移植性 要用取地址的符号 &

?

2、CCMenuItem.cpp 中

bool CCMenuItem::initWithTarget(CCObject *rec, SEL_MenuHandler selector) ?// 设置回调,和负责监听的对象

{

? ? setAnchorPoint(ccp(0.5f, 0.5f));

? ? m_pListener = rec;

? ? m_pfnSelector = selector;

? ? m_bIsEnabled = true;

? ? m_bIsSelected = false;

? ? return true;

}

?

void CCMenuItem::activate()?

{

? ? if (m_bIsEnabled)

? ? {

? ? ? ? if (m_pListener && m_pfnSelector)

? ? ? ? {

? ? ? ? ? ? (m_pListener->*m_pfnSelector)(this); // 触发回调,从上一层的menu来调用

? ? ? ? }

? ? ? ??

? ? ? ? if (kScriptTypeNone != m_eScriptType)

? ? ? ? {

? ? ? ? ? ? CCScriptEngineManager::sharedManager()->getScriptEngine()->executeMenuItemEvent(this);

? ? ? ? }

? ? }

}

?

3、使用的方式

?CCMenuItemImage *pCloseItem = CCMenuItemImage::create(

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "CloseNormal.png",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "CloseSelected.png",

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? this, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 设置listener

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? menu_selector(HelloWorld::menuCloseCallback));// 设置callback

?

void HelloWorld::menuCloseCallback(CCObject* pSender) // 真正的回调函数

{

? ? CCDirector::sharedDirector()->end();

?

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

? ? exit(0);

#endif

}

热点排行