0

基本クラスCCMenuItemImageから派生したボタンを作成しようとしています。このボタンは、タッチが終了した後ではなく、最初にタッチしたときに関数を呼び出せるようにしたいと思います。ただし、サブクラス化しようとすると、無効な変換であるというエラーが表示されます。

button.ccp:

#include "button.h"

void Button::selected(){
CCLOG("SELECTED");
}

void Button::unselected(){
CCLOG("UNSELECTED");
}

Button* Button::create(const char *normalImage, const char *selectedImage, const char     *disabledImage, CCObject* target, SEL_MenuHandler selector) {
Button *button = new Button();
    if (button && button->initWithNormalImage(normalImage, selectedImage,     disabledImage, NULL, NULL))
    {
        button->autorelease();
        return button;
    }
    CC_SAFE_DELETE(button);
    return NULL;

}

button.h:

#ifndef BUTTON_H
#define BUTTON_H
#include "cocos2d.h"

class Button : public cocos2d::CCMenuItemImage{
public:
virtual void selected();

virtual void unselected();

};

#endif

SinglePlayer.ccpピース:

Button *left1 = Button::create("turncircle.png","turncircle.png", this, menu_selector(SinglePlayer::turning));
4

2 に答える 2

2

MenuItem select()は、デフォルトでタッチ終了時にトリガーされます。

ディスパッチャに登録されたTouchでCCSpriteをサブクラス化し、ccTouchBeganを上書きする必要があります

于 2013-03-20T22:58:05.787 に答える
1

私が理解できるのは、CCMenuItemImageのタッチで手動制御を行おうとしているということです。実際には、すべてのタッチはMenuItemではなくCCMenuで処理されるため、タッチをオーバーライドするには、CCMenuItemImageではなくCCMenuを継承する必要があります。

私のゲームでは、CCTableViewとCCMenuItemでこの問題が発生しました。ここで、MenuItemはジェスチャの実行で優先されました。そこで、CCMenuを継承して微調整しました。

余分なコードも含まれていますが、すべてを無傷にするために、すべてを貼り付けています。

ScrollMenu.hクラス

class ScrollMenu:public CCMenu
{
public:
ScrollMenu();
virtual ~ScrollMenu(){};

bool isMovedGesture_;
bool istabBar_;
CCMenuItem * previousSelectedItem_;
static ScrollMenu* create(CCMenuItem* item,...);
virtual void registerWithTouchDispatcher();

virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch *touch, CCEvent* event);
CREATE_FUNC(ScrollMenu);
};

class ScrollMenuLoader : public cocos2d::extension::CCNodeLoader
{
public:
    CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(ScrollMenuLoader, loader);

protected:
    CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(ScrollMenu);
};

ScrollMenu.cppクラス

#include "ScrollMenu.h"

ScrollMenu* ScrollMenu::create(CCMenuItem* item, ...)
{
    va_list args;
    va_start(args, item);
    ScrollMenu *pRet = new ScrollMenu();
    if (pRet && pRet->initWithItems(item,args))
    {
        pRet->autorelease();
        va_end(args);
        return pRet;
    }
    va_end(args);
    CC_SAFE_DELETE(pRet);
    return NULL;
}
ScrollMenu::ScrollMenu()
{
    isMovedGesture_ = false;
}

void ScrollMenu::registerWithTouchDispatcher()
{
    CCDirector* pDirector = CCDirector::sharedDirector();
    pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
}

bool ScrollMenu::ccTouchBegan(CCTouch* touch, CCEvent* event)
{
    return CCMenu::ccTouchBegan(touch, event);
}

void ScrollMenu::ccTouchMoved(CCTouch* touch, CCEvent* event)
{
    CC_UNUSED_PARAM(event);
    CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchMoved] -- invalid state");
    isMovedGesture_ = true;
}

void ScrollMenu::ccTouchEnded(CCTouch *touch, CCEvent* event)
{
    CC_UNUSED_PARAM(touch);
    CC_UNUSED_PARAM(event);
    CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchEnded] -- invalid state");

    CCMenuItem * currentItem = this->itemForTouch(touch);
    if(!currentItem && isMovedGesture_ && m_pSelectedItem)
    {

        if(!istabBar_ || (previousSelectedItem_ && previousSelectedItem_ != m_pSelectedItem))
        {
            m_pSelectedItem->unselected();
        }
    }
    else if(currentItem)
    {
        if(currentItem == m_pSelectedItem)
        {
            if(!isMovedGesture_)
            {
                m_pSelectedItem->activate();
                previousSelectedItem_ = m_pSelectedItem;
            }
            else{
                if(previousSelectedItem_ != m_pSelectedItem)
                {
                    m_pSelectedItem->unselected();
                }
            }

        }
        else
        {
            if(isMovedGesture_)
            {
                m_pSelectedItem->unselected();
                m_pSelectedItem = currentItem;
                m_pSelectedItem->activate();
                previousSelectedItem_ = m_pSelectedItem;
            }

        }
        if (!istabBar_) {
            currentItem->unselected();
        }
    }

    m_eState = kCCMenuStateWaiting;
    isMovedGesture_ = false;

}
于 2013-03-19T11:25:13.857 に答える