問題描述:
GameObject - > AIPlayer
在基類gameobject中有一個update(float dt),就是默認schedule後每偵執行的方法,然後AIPlayer繼承了go,也實現了Update(float dt),通過在AIPlayer裏面調用父類的update,因爲某些共性的物體判斷,例如HP <= 0則destroy這個物體,以及如果是Player則判斷輸贏等情況。
那麼我期望的處理是在GameObject中如果HP <= 0 ,物體死亡,先淡化 -> 消失後調用一個selector方法回調清理緩存並且判斷是否是AIPlayer或者Player則判斷輸贏。
結果:
並沒有我們如上描述期待的那樣,因爲AIPlayer中的子類指針調用父類的方法(可以執行),但在父類中回調一個selector,則這個selector不會調用。
CCFiniteTimeAction* actionDone = CCCallFuncN::create(this, callfuncN_selector(GameObject::destroy));
如上這句就是在GameObject的Update方法中當HP<= 0時候會執行的,因爲通過子類指針去安排回調,但回調方法卻是父類GameObject的方法,回調其實還是用子類指針,所以找不到該方法,並沒有被執行,不知此理解對否。
解決方法:
如果AIPlayer需要每偵判斷AIPlayer專屬的事情,那麼我們不實現父類實現了的Update,添加新的方法
void UpdateAI(float dt);
然後通過在AIPlayer初始化時候執行schedule安排每偵執行該方法,同時因爲父類也在初始化時候執行schedule,所以父類的update也會被執行。
this->schedule(schedule_selector(AIPlayer::UpdateAI));