2014-10-08 63 views
0

我得到了類叫CharacterAnimation由一個虛擬的方法:調用類方法::地圖

CharacterAnimation : public cocos2d::CCObject { 
    public: 
    ... 
    virtual void start(float td); 
} 

和幾個從它類繼承:

  • CharacterAnimationBlink
  • CharactedAnimationDropTear
  • etc

我要的是:

  1. 創建

    std::map<std::string, CharacterAnimation*> animationsList; 
    
  2. 填寫animationList像:

    animationsList["blink"] = new CharacterAnimationBlink(1,2,3); 
    animationsList["dropTear"] = new CharacterAnimationDropTear(1,2); 
    
  3. 通過這個循環的std ::地圖

  4. 對於每個std::map元素調用

    this->schedule(schedule_selector(characterAnimationStartMethodPointer), Character::animationPeriod); 
    

應該怎樣放置,而不是currentAnimationStartMethodPointer?如何從std::map訪問指向start()當前對象的方法?

從CCObject.h

typedef void (CCObject::*SEL_SCHEDULE)(float); 
... 
#define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR) 
+0

'schedule_selector'是如何定義的? – 2014-10-08 18:03:40

+0

2 Piotr S .:通過schedule_selector定義更新發布 – Alex 2014-10-08 18:06:33

回答

1

假設你不控制的schedule()函數的聲明,你不能讓一個指針指向一個特定CharacterAnimation實例的start()功能。相反,這裏需要兩件事:一個成員函數指針,指向應該調用該函數的實例的引用或指針。

如您的問題所示,它看起來像schedule()需要成員函數指針(特別是CCObject類中的函數)。你CharacterAnimation類從CCObject繼承,而是一個成員函數指針CharacterAnimation::start()一個成員函數指針CCObject功能,因爲缺乏該start()CharacterAnimation聲明,而不是從CCObject繼承了virtualoverride符的假設。

+0

但cocos2d-x使用與我在場景代碼相同的邏輯。 **例如**:可以使用類似「someActionHere()」的方法定義一個類SomeScene(從CCObject繼承),並將其成功傳遞給schedule_selector()。有什麼不同?無論如何感謝您的重播。 – Alex 2014-10-08 21:36:05

+0

不幸的是,我需要看到更多的示例代碼才能確定地說話。我的回答是基於從你在這裏分享的內容推斷出的幾個假設,但是一如既往,真實的故事更多。 – seh 2014-10-09 00:05:08

+0

我在這裏創建了一個更常見問題的新主題:https://stackoverflow.com/questions/26279101/fetching-address-of-virtual-method-by-class-instance。也許它會更詳細 – Alex 2014-10-09 13:04:01

0

使用此代碼可讓全局調度程序每隔Character::animationPeriod秒調用start方法。

for (std::map<std::string, CharacterAnimation*>::iterator i = animationsList.begin(); 
    i != animationsList.end(); 
    ++i) 
{ 
    CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(CharacterAnimation::start), 
                    i->second, 
                    Character::animationPeriod, 
                    false); 
}