2013-06-10 1 views
2

저는 2 년 동안 cocos2d에서 경험했지만 오늘은 cocos2d-x를 시작했습니다. 나는 onEnter, selected와 all과 같은 기본 메소드를 실행하지 않는 메뉴 버튼 클래스를 작성했습니다. 여기 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

테스트하는 방법, 나는 그것이 onEnter의 대안 인 Cocos2d-iphone에있는 것처럼 사용 했습니까? – iPhoneProcessor

+0

수퍼 클래스의 onEnter 메서드에서 중단 점을 설정하여 테스트 – LearnCocos2D

답변

2

중요한 것을 추가 :

MyButton 클래스에는 create 메서드가 없습니다. 당신이 한 일은 CCMenuItemSprite 인스턴스를 만들어 버튼에 캐스트하는 것입니다. 이것은 잘못되었습니다.

당신은 MyButton

공공 정적 MyButton에 뭔가를 추가해야 * 생성 (CCSprite * normal_sprite, CCSprite * selected_sprite, ...);

예를 들어 CCMenuItemSprite 클래스를 찾으십시오.

첫 번째 질문은 CCMenuItemSprite::onEnter() 가상입니까?

초, 내가해야 당신의 onEnter가 C 작동 ++ 방법이있다

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)); 
} 

아래처럼 보이는 것 같아요. objective-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 :: created을 추가했지만 여전히 작동하지 않습니다. 내 질문을 업데이트하십시오. 제발 저를보고 제 실수를 말해주십시오. – iPhoneProcessor

+0

@iPhoneProcessor 내 대답을 업데이트했습니다. 시도해볼 수 있니? CCMenuItemSprite :: onEnter()가 가상이 아니면 가상으로 만듭니다. –

+1

고맙습니다. 그런 다음 cocos2d-x에서 우리는 class.oh..lots extra를 사용자 정의 할 때 파생 클래스에 모든 함수를 추가해야합니다. - – iPhoneProcessor

2

virtualonEnter()selected()를 선언합니다. onEnter()selected()CCMenuItemSprite에서 파생 된 메서드이므로 해당 값을 무시하려면 virtual으로 선언해야합니다. 재정의하지 않으면 앱에 MyButton::onEnter()이 아니라 CCMenuItemSprite::onEnter()이 호출됩니다.

here

#include "cocos2d.h" 

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

나중에 가지고있어 ... 오래전에 C++을 공부하고 obj를 배운 후에. C 모두 잊어 버렸어. :) – iPhoneProcessor

관련 문제