如何对CCMenuItemImage进行子类化

时间:2012-12-06 22:39:02

标签: override subclass cocos2d-x ccmenuitem

我收到一条错误消息,说我将CCMenuItemImage未正确转换为“按钮”

button.cpp:

#include "button.h"

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

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

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:

//I get an error 'invalid conversion from 'cocos2d::CCMenuItemImage*' to 'Button*' '

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

1 个答案:

答案 0 :(得分:4)

当你调用Button :: create时,它实际上引用了CCMenuItemImage中的create方法,所以你得到一个CCMenuItemImage(不是Button)。

您需要在Button类中创建一个静态create方法。您仍然可以在超类中引用初始值设定项,因此它应该相当简单。因此,在Button类的create方法中,执行以下操作:

Button* Button::create(const char* normalImg, const char* selectedImg) {
    Button *button = new Button ();
    if (button && button->CCMenuItemImage::initWithNormalImage(normalImg, selectedImg, NULL, NULL, NULL) {
      button->autorelease ();
      return button;
    } else {
      delete button;
      button = NULL;
      return NULL;
    }
}

(免责声明:我实际上并没有对此进行测试,只是这里有一些快速代码。)

如果您使用此create方法,它将返回一个Button对象,这正是您正在寻找的。

您正在寻找的初始化程序是:

bool CCMenuItemImage::initWithNormalImage(const char *normalImage, const char *selectedImage, const char *disabledImage, CCObject* target, SEL_MenuHandler selector);

您可能希望使Button类的创建构造函数适应CCMenuItemImage初始值设定项的更多值。由你决定。

跟踪CCMenuItem.cpp文件; CCMenuItemImage本身是CCMenuItem的子类,因此应该为您提供一个相当强大的参考点,说明如何设置它。 (CCMenuItem和CCMenuItemImage都在CCMenuItem.cpp / .h文件中定义。)

希望这会有所帮助!!