我收到一条错误消息,指出我未正确地将 CCMenuItemImage 转换为“Button”
按钮.cpp:
#include "button.h"
void Button::selected(){
CCLOG("SELECTED");
}
void Button::unselected(){
CCLOG("UNSELECTED");
}
按钮.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));
最佳答案
当您调用 Button::create 时,它实际上引用了 CCMenuItemImage 中的 create 方法,因此您将返回一个 CCMenuItemImage(而不是 Button)。
您需要在 Button 类中创建一个静态创建方法。您仍然可以引用父类(super class)中的初始值设定项,因此它应该相当简单。因此,在您的 Button 类创建方法中,执行以下操作:
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;
}
}
(免责声明:我实际上没有对此进行测试,只是这里的一些快速代码。)
如果您使用此创建方法,它将返回一个 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 文件中定义。)
希望这有帮助!!
关于overriding - 如何子类化 CCMenuItemImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13753906/