问题描述:
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));