Ios 与主实例相比,回调方法中的类实例发生了更改
在cpp中: 那么,如何在回调方法中获取类实例呢?我可以对主类实例和回调的类实例进行同样的处理吗 编辑: Character是一个没有父类的类,body是一个成员变量,是CCSprite的实例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 =
谢谢。因为您正在使用
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),