如何在Cocos2d-x 3.x中创建没有lambda函数的自定义事件侦听器?

时间:2014-07-08 21:06:33

标签: cocos2d-x cocos2d-x-3.0

Cocos2d-x 3.x中的新事件调度程序有几个测试示例,显示lambdas用于同一类中的回调。我有一个需要注册事件的基类,然后有一个重叠的子类方法响应该事件。我该如何做到这一点?

在我的基类中:

EventListenerCustom* listener = EventListenerCustom::create("my_event", myVirtualEventMethod);

根据Kazuki的回答更新:

class BaseScene : public cocos2d::Layer
{
    public:
    virtual void myVirtualEventMethod();
};

我的方法:

EventListenerCustom* listener = EventListenerCustom::create("my_event", CC_CALLBACK_1(BaseScene::myVirtualEventMethod, this));

请参阅以下评论中的错误。

1 个答案:

答案 0 :(得分:4)

EventListenerCustom :: create()接受std :: function。

https://github.com/cocos2d/cocos2d-x/blob/v3/cocos/base/CCEventListenerCustom.h#L59

static EventListenerCustom* create(const std::string& eventName, const std::function<void(EventCustom*)>& callback)

所以你可以像这样用std :: bind指定一个成员函数。

EventListenerCustom* listener = EventListenerCustom::create("my_event",
    std::bind(&YourSubclass::myVirtualEventMethod, this, std::placeholders::_1));

cocos2d-x中有一个宏。

EventListenerCustom* listener = EventListenerCustom::create("my_event",
    CC_CALLBACK_1(YourSubclass::myVirtualEventMethod, this));

<强> EDITED

No viable conversion from '__bind<void (BaseScene::*)(), BaseScene ,
    std::__1::placeholders::__ph<1>&>' to 'const std::function<void(Eventcustom)>'

因为myVirtualEventMethod的类型与 void(EventCustom *)不同。因此它应该是

virtual void myVirtualEventMethod(EventCustom*);

或者

EventListenerCustom* listener = EventListenerCustom::create("my_event",
    CC_CALLBACK_0(YourSubclass::myVirtualEventMethod, this));