成員函數指針實現的回調

成員函數指針實現的回調

 

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

}

發佈了62 篇原創文章 · 獲贊 3 · 訪問量 7222
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章