【问题标题】:How Can I Subclass CCMenuItemImage我如何继承 CCMenuItemImage
【发布时间】:2012-12-06 22:39:02
【问题描述】:

我收到一条错误消息,提示我将 CCMenuItemImage 不正确地转换为“Button”

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

【问题讨论】:

  • 还需要重写create函数。
  • 我不知道怎么做。对不起,我还在学习。你能简单解释一下吗?
  • 检查@SoMuchDramaStudios 的答案,我认为他解释清楚:P。

标签: overriding subclass cocos2d-x ccmenuitem


【解决方案1】:

当您调用 Button::create 时,它​​实际上是在引用 CCMenuItemImage 中的 create 方法,因此您将得到一个 CCMenuItemImage(不是 Button)。

您需要在 Button 类中创建一个静态创建方法。你仍然可以在你的超类中引用初始化器,所以它应该相当简单。因此,在您的 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;
    }
}

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

如果您使用此 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 文件中定义。)

希望这会有所帮助!

【讨论】:

  • 抱歉花了这么长时间。我一直忙于我的大学期末考试。我也为成为这样的菜鸟而道歉。所以我像你说的那样在我的 Button.cpp 中添加了 create 方法。现在我收到一条错误消息,指出这是从 cocos2d::CCMenuItemImage 到 Button* 的无效转换。我也不确定您希望我对您发布的初始化程序做什么。感谢您的帮助!
  • 我还是不明白。有什么帮助吗?
猜你喜欢
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 2010-12-22
  • 2010-12-08
  • 1970-01-01
相关资源
最近更新 更多