类实例在回调方法中与主实例相比发生了变化

时间:2012-11-08 05:50:12

标签: ios cocos2d-iphone cocos2d-x

在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的一个实例。

感谢。

2 个答案:

答案 0 :(得分:1)

因为您使用body来调用函数Character::upDownDone

您应该使用this来呼叫它。

CCCallFuncND* callFunc = CCCallFuncND::actionWithTarget(first_arg, secend_arg, third_arg);
body->runAction(callFunc);

假设您的secend_argcallfuncND_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),