在cpp:
void Character::jump(CCLayer *layer){
if (this->isAnimationPlaying) return;
up_or_down = UP;
body->runAction(CCSequence::actions(
CCMoveBy::actionWithDuration(0.5, ccp(0, 50)),
CCCallFuncND::actionWithTarget(body, callfuncND_selector(Character::upDownDone), this),
// CCCallFuncN::actionWithTarget(body, callfuncN_selector(Character::upDownDone)),
NULL));
this->isAnimationPlaying = true;
}
void Character::upDownDone(CCNode *node, CCObject *ob){
this->isAnimationPlaying = false; // *this is different from the this(class instance) in jump method, seems this in upDownDone is a new created instance*
}
那么如何在回调方法中获取类实例?我可以为主类实例和回调的类实例做同样的事情吗?
编辑:
Character是一个没有父类的类,body是一个成员变量,它是CCSprite的一个实例。
感谢。
答案 0 :(得分:1)
因为您使用body
来调用函数Character::upDownDone
。
您应该使用this
来呼叫它。
CCCallFuncND* callFunc = CCCallFuncND::actionWithTarget(first_arg, secend_arg, third_arg);
body->runAction(callFunc);
假设您的secend_arg
为callfuncND_selector(Character::upDownDone)
然后,
first_arg
是来电者,即。在您的代码中调用此函数的类实例是body
。但实际上它应该是this
,或任何Charactor类的实例
CCNode* node
(传递给你的调用函数的第一个para)是动作运行器,即。代码中的body
。因为您使用的是body->runAction()
CCObject* obj
(传递给你的调用函数的第二个para)是一个void指针,与third_arg
完全相同。
另一种方式是使用
void Character::upDownDone(CCNode *node, void *ob){
(Character*)ob->isAnimationPlaying = false;
}
答案 1 :(得分:0)
好像你使用实例" body"调用了Character :: upDownDone方法。而不是这个。可能你想要这个:
CCCallFuncND::actionWithTarget(this, callfuncND_selector(Character::upDownDone), body),