【问题标题】:Cocos2d-x Subclassing Issue CCMenuItemImageCocos2d-x 子类化问题 CCMenuItemImage
【发布时间】:2012-12-18 23:59:53
【问题描述】:

我正在尝试创建一个从基类 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;

}

按钮.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));

【问题讨论】:

  • 您是否在 .h 文件中定义了这个 create() 函数?如果没有,你应该把Button* Button::create(const char *normalImage, const char *selectedImage, const char *disabledImage, CCObject* target, SEL_MenuHandler selector);放在那里。
  • 你把using namespace cocos2d;放到你的h文件里了吗?
  • 对不起,这是我的错,你应该删除h文件中的Button::
  • 使其成为静态的。在 h 文件中。 static Button*...
  • 删除 proj.android/libs 和 proj.android/objs 中的所有内容。但我确实认为在你直接进入 cocos2d-x 之前,你需要阅读一些关于 c++ 和 ndk 的书籍。

标签: c++ subclass cocos2d-x ccmenuitem


【解决方案1】:

MenuItem select() 默认在触摸完成时触发。

您需要使用向调度程序注册的 Touch 子类化 CCSprite 并覆盖 ccTouchBegan

【讨论】:

    【解决方案2】:

    我可以理解的是,您正在尝试通过触摸您的 CCMenuItemImage 进行手动控制。实际上所有的触摸都是在 CCMenu 中处理的,而不是在 MenuItem 中,所以你必须继承 CCMenu 而不是 CCMenuItemImage 来覆盖触摸。

    在我的游戏中,我遇到了 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;
    
    }
    

    【讨论】:

    • 知道如何使用 cocos2d-x 版本 3.x 完成此操作吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多