cocos2d-x游戏开发(十三)细说回调函数
歡迎轉載:http://blog.csdn.net/fylz1125/article/details/8546607
cocos2d-x中有大量的回調函數的應用,主要有以下幾類,看下CCObject.h中的定義
[cpp]?view plaincopyprint?
本質上,就是函數指針的應用。
但是,我們知道,在C中,函數指針是很普遍的應用。一般函數的函數名就是指針,不過是常量,再定義一個函數指針就是一個變量,這個變量可以指向這一類函數的地址。
比如:
[cpp]?view plaincopyprint?
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。
這樣調用:?
下面是我寫的一個demo,類似cocos2d-x的實現:
[cpp]?view plaincopyprint?
實現:
[cpp]?view plaincopyprint?
main
[cpp]?view plaincopyprint?
輸出:
[cpp]?view plaincopyprint?
如果再定義一個宏:
[cpp]?view plaincopyprint?
那么調用就改成:
[cpp]?view plaincopyprint?
這個就是cocos2d-x的回調實現模式了。呵呵
仔細看看,是不是一樣。
[cpp]?view plaincopyprint?
總結
以上是生活随笔為你收集整理的cocos2d-x游戏开发(十三)细说回调函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cocos2d-x游戏开发(十二)场景切
- 下一篇: cocos2d-x游戏开发(十四)用sh