0

我有一堂课,

class Ticket : public cocos2d::CCNode, public cocos2d::CCTargetedTouchDelegate { ... };

当我使用以下方法在该节点上注册触摸事件时,效果很好:

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(ticket_, 0, true);

但是,如果我更改我的类,使其对 CCNode 位使用组合而不是继承:

class Ticket : public cocos2d::CCTargetedTouchDelegate {
private:
  cocos2d::CCNode* node_;
public:
  Ticket() { node_ = new CCNode(); node_->init(); }
  cocos2d::CCNode* node() { return node_; }
  ...
};

然后用 SIGSEGV 11 炸毁了以下内容:

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(ticket_, 0, true);

我已将ticket_->node() 添加到当前层,但我想知道触摸调度程序是否不喜欢节点和委托是不同的东西。或者换句话说,触摸调度程序是否期望节点和委托是同一件事?

所以简而言之,我的代码在我使用多重继承时有效,但在我使用组合时却不行。如果不深入研究框架,谁能说这是真的,或者我只是错过了一些明显的东西?我正在使用 cocos2d-2.1rc0-x-2.1.2

4

1 回答 1

1

是的,cocos2d-x 似乎确实强制多重继承。它期望触摸委托可以动态转换为 CCObject,而当您使用组合时,您的 Ticket 类不是。当您从 CCNode 继承时,CCNode 本身继承自 CCObject,您就很清楚了。你可以在 github 上看到这个问题

但这似乎不是一个错误,因为文档实际上通过注释来暗示这一点

重要提示:该代表将被保留。

对于 CCTouchDispatcher::addTargetedDelegate。

于 2013-05-06T00:25:09.343 回答