2012-11-08 29 views
0

在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* 
} 

所以,我怎樣才能獲得類實例的回調方法?我可以使這主要類實例和回調的類實例相同嗎?

編輯:

字符是它沒有父類的類,和身體是一個成員變量這是CCSprite的一個實例。

謝謝。

+0

我認爲這可能會更好地使Character成爲CCNode的一個子類。 –

回答

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(已傳遞給您的調用函數的第一個參數)是動作參數,即。 body在您的代碼。因爲您正在使用body->runAction()

CCObject* obj(已傳遞給您的調用函數的第二段)是一個空指針,與third_arg完全相同。

另一種方式是像你這樣的使用實例調用字:: upDownDone方法使用

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

感謝您的回覆。但角色不是CCNode的子類,身體是。所以我運行它反對身體。 –

+0

@TowerJoo那麼你應該改變你的'空隙字符:: upDownDone(CCNode *節點,CCObject * OB)''到空隙字符:: upDownDone(CCNode *節點,無效* OB){(字符*)轉播 - > isAnimationPlaying =假}' –

+0

@TowerJoo但實際上會有一個嚴重的問題,因爲身體不具備的功能特徵:: upDownDone,你怎麼能運行代碼? cuz如果使用你的代碼,如果你追查cocos2d-x的源代碼,最後'body - > *(&Character :: upDownDone)(body,this);'將被執行。 –

0

看來的「身體」,而不是這個。可能是你想要的:

CCCallFuncND::actionWithTarget(this, callfuncND_selector(Character::upDownDone), body), 
+0

謝謝。只需編輯問題。你有支票嗎? –