2013-06-10 1 views
2

У меня есть 2 года опыта работы в cocos2d, но сегодня начал cocos2d-x. Я только что написал derrived menu button class, который не запускает какой-либо метод по умолчанию, например onEnter, selected и все.Cocos2d-x onEnter и другие методы по умолчанию не называются

Вот мой код:

//MyButton.h

#include <stddef.h> 
#include "cocos2d.h" 

using namespace cocos2d; 
class MyButton : public CCMenuItemSprite 
{ 
    public: 

    void onEnter(); 

    void selected(); 

}; 

//MyButton.mm

void MyButton::onEnter() 
{ 
    CCPoint pos = this->getSelectedImage()->getPosition(); 
    CCSize size = this->getSelectedImage()->getContentSize(); 


    this->getSelectedImage()->setPosition(ccp(pos.x+size.width*0.5f, pos.y+size.height*0.5f)); 
    this->getSelectedImage()->setAnchorPoint(ccp(0.5f,0.5f)); 
} 

void MyButton::selected() 
{ 
    if (isEnabled()) 
    { 
     if (this->getSelectedImage()) 
     { 
      CCScaleTo *scale = CCScaleTo::create(0.5f, 1.3f); 

      this->getSelectedImage()->runAction(scale); 
     } 
    } 

} 

MyButton * MyButton::create(CCNode* normalSprite, CCNode* selectedSprite, CCObject* target, SEL_MenuHandler selector) 
{ 
    MyButton *btn = (MyButton*)CCMenuItemSprite::create(normalSprite, selectedSprite,target, selector); 

    return btn; 
} 

// Вот код, который создает кнопку

CCSprite *start_1 = CCSprite::createWithSpriteFrameName(FRAME_MM_START); 
CCSprite *start_2 = CCSprite::createWithSpriteFrameName(FRAME_MM_START); 

MyButton *btnPlay =(MyButton*) MyButton::create(start_1, 
               start_2, 
               this, 
               menu_selector(MyMainMenu::playGame)); 

btnPlay->setPosition(ccp(mS.width*0.5f, mS.height*0.5f)); 
btnPlay->mMaxScale = 1.2f; 

CCMenu* menu = CCMenu::create(); 
menu->setAnchorPoint(ccp(0,0)); 
menu->setPosition(ccp(0,0)); 
this->addChild(menu, 1); 

menu->addChild(btnPlay); 
+1

метод подписи правильны, и Вы проверили, что супер метод вызывается? – LearnCocos2D

+0

Как проверить, я использовал, как в Cocos2d-iphone, что является альтернативой onEnter? – iPhoneProcessor

+0

тест, установив точку останова в методе супер-класса onEnter – LearnCocos2D

ответ

2

Добавление чего-то важного:

В вашем классе MyButton у вас нет метода создания. что вы сделали, просто создайте экземпляр CCMenuItemSprite и нажмите на кнопку. ЭТО НЕ ВЕРНО.

вы должны добавить что-то в MyButton

общественного статического MyButton * создать (CCSprite * normal_sprite, CCSprite * selected_sprite, ...);

в качестве примера можно найти класс CCMenuItemSprite.

первый вопрос, есть CCMenuItemSprite::onEnter() виртуальный?

второй, я думаю, ваш OnEnter должен быть похож ниже

void MyButton::onEnter() 
{ 
    CCMenuItemSprite::onEnter(); 
    CCPoint pos = this->getSelectedImage()->getPosition(); 
    CCSize size = this->getSelectedImage()->getContentSize(); 


    this->getSelectedImage()->setPosition(ccp(pos.x+size.width*0.5f, pos.y+size.height*0.5f)); 
    this->getSelectedImage()->setAnchorPoint(ccp(0.5f,0.5f)); 
} 

это как C++ работает. он отличается от object-c, что позволяет по умолчанию перегружать метод.

MyButton * MyButton::create(CCNode* normalSprite, CCNode* selectedSprite, CCObject* target, SEL_MenuHandler selector) 
{  
    MyButton *pRet = new MyButton(); 
    pRet->initWithNormalSprite(normalSprite, selectedSprite, null, target, selector); 
    pRet->autorelease(); 
    return pRet; 
} 
+0

теперь добавлен MyButton :: создаётся, но все еще не работает. Обновлен мой вопрос..посмотрите на него и скажите мне свою ошибку. – iPhoneProcessor

+0

@iPhoneProcessor Я обновил свой ответ. вы можете попробовать? и если CCMenuItemSprite :: onEnter() не является виртуальным, сделайте его виртуальным. –

+1

Большое спасибо, сэр. Затем в cocos2d-x нам нужно добавить все функции в производный класс, когда мы настраиваем класс ..oh..lots extra: - – iPhoneProcessor

2

Объявить onEnter() и selected() как virtual. onEnter() и selected() являются производными методами от CCMenuItemSprite, поэтому их необходимо объявить как virtual, чтобы переопределить их. Если не отменено, ваше приложение вызывает CCMenuItemSprite::onEnter(), а не MyButton::onEnter().

Попробуйте прочитать больше об этом here

#include "cocos2d.h" 

using namespace cocos2d; 
class MyButton : public CCMenuItemSprite { 
public: 
    virtual void onEnter(); 
    virtual void selected(); 
}; 
+0

ya получил это ... долго назад изучал C++ и после обучения obj.C забыл все :) – iPhoneProcessor