2016-05-08 9 views
0

Ich migriere gerade meine Software von Cocos2d-X 2.2.6 zu Cocos2d-X 3.10 und ich habe Probleme, einige MenuItem Callbacks arbeiten zu lassen.Cocos2d-X Menü Callback löst Exception aus

Mein Code ist unten:

bool MainMenuLayer::init() 
{ 
    bool result; 

    result = Layer::init(); 

    mainMenu = Menu::create(); 
    mainMenu->setPosition(0, 0); 
    this->addChild(mainMenu); 

    Sprite *equalSprite, *equalDownSprite; 
    MenuItemSprite *equalButton; 
    LabelBMFont *equalButtonLabel; 
    MenuItemLabel *equalButtonMenuLabel; 
    CCPoint equalButtonMenuLabelPosition; 
    CCPoint equalButtonPosition; 

    equalSprite = Sprite::createWithSpriteFrameName("botao_menu_igual.png"); 
    equalDownSprite = Sprite::createWithSpriteFrameName("botao_menu_igual_down.png"); 

    equalButton = MenuItemSprite::create(equalSprite, equalDownSprite, CC_CALLBACK_1(MainMenuLayer::buttonPressedCallback, this)); 

    equalButton->setEnabled(gameContext->getEqualGameEnabled()); 
    equalButton->setTag(EQUAL_BUTTON_TAG); 
    equalButtonPosition = Point(screenSize.width/4, screenSize.height/2); 
    equalButton->setPosition(mainMenu->convertToNodeSpace(equalButtonPosition)); 

    mainMenu->addChild(equalButton); 

    equalButtonLabel = LabelBMFont::create(localization->getLocalizedString("EqualButtonLabel"), fontHelper->getStdFont().c_str()); 
    equalButtonMenuLabel = MenuItemLabel::create(equalButtonLabel, CC_CALLBACK_1(MainMenuLayer::buttonPressedCallback, this)); 

    equalButtonMenuLabel->setTag(EQUAL_BUTTON_TAG); 
    equalButtonMenuLabelPosition.x = equalButtonPosition.x; 
    equalButtonMenuLabelPosition.y = equalButtonPosition.y - equalButton->boundingBox().size.height/2 - equalButtonMenuLabel->boundingBox().size.height; 
    equalButtonMenuLabel->setPosition(mainMenu->convertToNodeSpace(equalButtonMenuLabelPosition)); 

    mainMenu->addChild(equalButtonMenuLabel); 

hier auch ein Teil der Header-Datei ist in dem ich das mainMenu Objekt definieren:

using namespace cocos2d; 

class MainMenuLayer : public Layer 
{ 

private: 

    Size screenSize; 

    Menu *mainMenu; 

    bool init(); 

    void buttonPressedCallback(Ref *sender); 

public: 

    MainMenuLayer(); 

    ~MainMenuLayer(); 

    static MainMenuLayer *create(); 

    static CCScene *scene(); 

}; 

Das Problem ist, dass, wenn ich mein Spiel laufen, und klicken Sie auf die oben erstellten Schaltflächen, ich erhalte eine Ausnahme für die Datei type_traits und in der Zeile: return (((*_STD forward<_Ty1>(_Arg1)).*_Pmf)(_STD forward<_Types2>(_Args2)...)); (siehe unten).

struct _Invoker_pmf_pointer 
    { // INVOKE a pointer to member function on a [smart] pointer 
    template<class _Decayed, 
     class _Ty1, 
     class... _Types2> 
     static auto _Call(_Decayed _Pmf, _Ty1&& _Arg1, _Types2&&... _Args2) 
     -> decltype(((*_STD forward<_Ty1>(_Arg1)).*_Pmf)(
      _STD forward<_Types2>(_Args2)...)) 
     { // INVOKE a pointer to member function on a [smart] pointer 
     return (((*_STD forward<_Ty1>(_Arg1)).*_Pmf)(
      _STD forward<_Types2>(_Args2)...)); 
     } 
    }; 

Ich erstelle diesen Rückruf falsch? Hat jemand anderes das angetroffen?

Antwort

0

Ich habe herausgefunden, was der Fehler war. Das Problem war, dass ich einen Touch-Listener auf einer vorherigen Szene registrierte und ich ihn nicht entfernte, als die Szene endete.

Also, als ich den Remove Touch Listener-Code vor dem Ändern der Szenen hinzugefügt hat, hat alles gut funktioniert.

void SplashScreenMenuLayer::onTouchesEnded(Touch* touch, Event* event) 
{ 
    Director::getInstance()->getEventDispatcher()->removeEventListener(touchListener); 
    Director::getInstance()->replaceScene(MainMenuLayer::scene()); 
}