Ios 与主实例相比,回调方法中的类实例发生了更改

Ios 与主实例相比,回调方法中的类实例发生了更改,ios,cocos2d-iphone,cocos2d-x,Ios,Cocos2d Iphone,Cocos2d X,在cpp中: 那么,如何在回调方法中获取类实例呢?我可以对主类实例和回调的类实例进行同样的处理吗 编辑: Character是一个没有父类的类,body是一个成员变量,是CCSprite的实例 谢谢。因为您正在使用body调用函数Character::upDownDone 您应该使用this来调用它 void Character::jump(CCLayer *layer){ if (this->isAnimationPlaying) return; up_or_down =

在cpp中:

那么,如何在回调方法中获取类实例呢?我可以对主类实例和回调的类实例进行同样的处理吗

编辑:

Character是一个没有父类的类,body是一个成员变量,是CCSprite的实例


谢谢。

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

您应该使用
this
来调用它

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*
}
假设您的
secend\u arg
callfuncND\u选择器(Character::upDownDone)

那么

first_arg
是调用者,即在代码中调用此函数的类实例是
body
。但实际上它应该是
this
,或者character类的任何实例

CCNode*node
(传递给调用函数的第一个段落)是动作执行器,即代码中的
body
。因为您正在使用
body->runAction()

CCObject*obj
(传递给调用函数的第二个参数)是一个空指针,与
third_arg
完全相同

另一种方法是使用

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

您似乎使用实例“body”而不是this调用Character::upDownDone方法。您可能希望这样:

void Character::upDownDone(CCNode *node, void *ob){
    (Character*)ob->isAnimationPlaying = false;
}

谢谢你的回复。但角色不是CCNode子类,body是。所以我对body运行它。@TowerJoo然后你应该将你的
void Character::upDownDone(CCNode*node,CCObject*ob)
更改为
void Character::upDownDone(CCNode*node,void*ob){(Character*)ob->isAnimationPlaying=false}
@TowerJoo但是实际上会有一个严重的问题,由于主体没有函数Character::upDownDone,如何运行代码?因为如果使用您的代码,如果您追踪cocos2d-x的源代码,最后
body->*(&Character::upDownDone)(body,this)将被执行。谢谢您的回复。你说得对。我不太明白这个电话。现在我修好了。谢谢。我认为把Character作为CCNode的子类可能更好。
CCCallFuncND::actionWithTarget(this, callfuncND_selector(Character::upDownDone), body),