2

私はcocos2dで2年の経験がありますが、今日cocos2d-xを始めました。onEnter、selected などのデフォルト メソッドを起動しない派生メニュー ボタン クラスを作成しました。

これが私のコードです:

//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);
4

2 に答える 2

2

重要なことを追加する:

MyButton クラスには、create メソッドがありません。あなたがしたことは、CCMenuItemSprite インスタンスを作成し、それをボタンにキャストするだけです。これは間違っています。

何かを追加する必要がありますMyButton

public static MyButton* create(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++の仕組みです。デフォルトでメソッドのオーバーロードを許可する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;
}
于 2013-06-10T23:58:15.900 に答える
2

onEnter()selected()as を宣言しvirtualます。onEnter()およびselected()から派生したメソッドであるため、それらをオーバーライドするCCMenuItemSpriteように宣言する必要があります。virtualオーバーライドされていない場合、アプリは ではCCMenuItemSprite::onEnter()なく を呼び出しますMyButton::onEnter()

詳しくはこちらを読んでみてください

#include "cocos2d.h"

using namespace cocos2d;
class MyButton : public CCMenuItemSprite {
public:
    virtual void onEnter();
    virtual void selected();
};
于 2013-06-13T05:04:59.370 に答える