日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cocos2d-x游戏开发(十三)细说回调函数

發布時間:2024/4/11 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocos2d-x游戏开发(十三)细说回调函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

歡迎轉載:http://blog.csdn.net/fylz1125/article/details/8546607


cocos2d-x中有大量的回調函數的應用,主要有以下幾類,看下CCObject.h中的定義

[cpp]?view plaincopyprint?
  • typedef?void?(CCObject::*SEL_SCHEDULE)(float);//?用來調update??
  • typedef?void?(CCObject::*SEL_CallFunc)();//?用來自定義無參回調??
  • typedef?void?(CCObject::*SEL_CallFuncN)(CCNode*);//?帶執行者回調??
  • typedef?void?(CCObject::*SEL_CallFuncND)(CCNode*,?void*);?//?帶一個自定參數的回調??
  • typedef?void?(CCObject::*SEL_CallFuncO)(CCObject*);??
  • typedef?void?(CCObject::*SEL_MenuHandler)(CCObject*);??
  • typedef?void?(CCObject::*SEL_EventHandler)(CCEvent*);??
  • typedef?int?(CCObject::*SEL_Compare)(CCObject*);??
  • ??
  • #define?schedule_selector(_SELECTOR)?(SEL_SCHEDULE)(&_SELECTOR)??
  • #define?callfunc_selector(_SELECTOR)?(SEL_CallFunc)(&_SELECTOR)??
  • #define?callfuncN_selector(_SELECTOR)?(SEL_CallFuncN)(&_SELECTOR)??
  • #define?callfuncND_selector(_SELECTOR)?(SEL_CallFuncND)(&_SELECTOR)??
  • #define?callfuncO_selector(_SELECTOR)?(SEL_CallFuncO)(&_SELECTOR)??
  • #define?menu_selector(_SELECTOR)?(SEL_MenuHandler)(&_SELECTOR)??
  • #define?event_selector(_SELECTOR)?(SEL_EventHandler)(&_SELECTOR)??
  • #define?compare_selector(_SELECTOR)?(SEL_Compare)(&_SELECTOR)??

  • 本質上,就是函數指針的應用。

    但是,我們知道,在C中,函數指針是很普遍的應用。一般函數的函數名就是指針,不過是常量,再定義一個函數指針就是一個變量,這個變量可以指向這一類函數的地址。

    比如:

    [cpp]?view plaincopyprint?
  • typedef?void?(*func)(int?x);??
  • void?up(int?s);??
  • func?f=?up;??
  • f(3);??



  • func是個函數指針類型:返回值是void,參數是一個int的函數。所以func的變量可以指向所有這一類的函數。
    這是C風格的函數指針。但是在cocos2d-x中的回調,雖然還是函數指針,但已經有所區別。準確點說應該是成員函數指針。那么這普通的函數指針還可以來調成員函數嗎?呵呵,如果能的話我就不用寫這篇文章了。
    C風格的函數指針要想調用成員函數,那么這個成員函數如果是static的也可以(為什么靜態函數就可以,呵呵)。但是這樣的話就會破壞類的結構??碿ocos2d-x的實現也不是這樣的。
    這里說cocos2d-x的實現方式:
    看上面的定義,如:typedef void (CCObject::*SEL_MenuHandler)(CCObject*);
    看這個就應該大致可以知道它的實現了。
    這個定義有點不一樣,就是這個函數是CCObject的成員函數。這就是成員函數指針的定義。
    大家知道,成員函數不能像普通C風格的函數那樣調用,因為每個成員函數需要知道是哪個對象實例調用它的,隱含有一個this指針。這也解釋了為什么靜態函數可以用C風格的函數指針來回調,因為靜態函數不需要對象實例就可以調用,呵呵。
    既然定義成員函數指針,那么要用這個指針變量來調用回調函數,還需不需要對象實例呢。毫無疑問,還是需要的。
    所以還必須有一個回調對象,CCObject *m_pListener。
    這樣調用:?

    [cpp]?view plaincopyprint?
  • (m_pListener->*m_pSelector)(CCObject?*param);??



  • 下面是我寫的一個demo,類似cocos2d-x的實現:
    [cpp]?view plaincopyprint?
  • #ifndef?__TestCallBack__Person__??
  • #define?__TestCallBack__Person__??
  • ??
  • #include?<iostream>??
  • #include?<string>??
  • ??
  • using?namespace?std;??
  • ??
  • //?基類??
  • class?Person?{??
  • ??
  • public:??
  • void?name(string?name);??
  • };??
  • ??
  • //?定義基類的成員函數指針??
  • typedef?void?(Person::*SEL_CallFun)(string?str);??
  • ??
  • ??
  • //?派生類??
  • class?Student?:?public?Person{??
  • private:??
  • string?m_name;??
  • int?m_age;??
  • ??
  • public:??
  • Student(string?name,?int?age);??
  • ~Student();??
  • ??
  • //?回調??
  • void?callBack(string?str);??
  • ??
  • //?say方法,要調用回調函數。??
  • void?say();??
  • protected:??
  • //?回調的執行者??
  • Person?*m_pListen;??
  • ??
  • //?回調函數指針??
  • SEL_CallFun?m_pfnSelectior;??
  • };??



  • 實現:
    [cpp]?view plaincopyprint?
  • #include?"Person.h"??
  • ??
  • void?Person::name(string?name)??
  • {??
  • cout<<name<<endl;??
  • }??
  • ??
  • Student::Student(string?name,?int?age)??
  • {??
  • this->m_name?=?name;??
  • this->m_age?=?age;??
  • }??
  • ??
  • Student::~Student()??
  • {??
  • ??
  • }??
  • ??
  • void?Student::say()??
  • {??
  • cout<<"Hi?this?is?a?Student"<<endl;??
  • ??
  • //?回調函數指針賦值。需要強轉成?SEL_CallFun??
  • m_pfnSelectior?=?(SEL_CallFun)(&Student::callBack);??
  • ??
  • //?回調的執行對象,傳this??
  • m_pListen?=?this;??
  • ??
  • //?調用回調,參數是個string??
  • (m_pListen->*m_pfnSelectior)(m_name);??
  • }??
  • ??
  • //?成員函數,要回調的函數??
  • void?Student::callBack(string?str)??
  • {??
  • cout<<"My?name?is?"??
  • <<?str<<endl??
  • <<?"age?is?"??
  • <<m_age<<endl;??
  • }??



  • main
    [cpp]?view plaincopyprint?
  • #include?<iostream>??
  • #include?"Person.h"??
  • ??
  • int?main(int?argc,?const?char?*?argv[])??
  • {??
  • ??
  • Student?*a?=?new?Student("Join",20);??
  • a->say();??
  • return?0;??
  • }??


  • 輸出:
    [cpp]?view plaincopyprint?
  • Hi?this?is?a?Student??
  • My?name?is?Join??
  • age?is?20??



  • 如果再定義一個宏:
    [cpp]?view plaincopyprint?
  • #define?callFunc_selector(_SELECTOR)?(SEL_CallFun)(&_SELECTOR)??


  • 那么調用就改成:
    [cpp]?view plaincopyprint?
  • m_pfnSelectior?=?callFunc_selector(Student::callBack);??

  • 這個就是cocos2d-x的回調實現模式了。呵呵
    仔細看看,是不是一樣。

    [cpp]?view plaincopyprint?
  • <pre></pre>??
  • <pre></pre>??
  • <pre></pre>??
  • <pre></pre>??
  • <pre></pre>??
  • ??????
  • ????????<div?style="padding-top:20px">???????????
  • ????????????<p?style="font-size:12px;">版權聲明:本文為博主原創文章,轉載請注明出處?http://blog.csdn.net/dawn_moon</p>??
  • ????????</div> ?
  • 總結

    以上是生活随笔為你收集整理的cocos2d-x游戏开发(十三)细说回调函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。