Tig*_*ing 3 cocos2d-x cocos2d-x-3.0
Cocos2d-x 3.x 中新的 Event Dispatcher 有几个测试示例,它们显示了 lambda 用于同一类中的回调。我有一个需要注册事件的基类,然后有一个覆盖的子类方法响应该事件。我将如何做到这一点?
在我的基类中:
EventListenerCustom* listener = EventListenerCustom::create("my_event", myVirtualEventMethod);
Run Code Online (Sandbox Code Playgroud)
根据 Kazuki 的回答更新:
class BaseScene : public cocos2d::Layer
{
public:
virtual void myVirtualEventMethod();
};
Run Code Online (Sandbox Code Playgroud)
我的方法:
EventListenerCustom* listener = EventListenerCustom::create("my_event", CC_CALLBACK_1(BaseScene::myVirtualEventMethod, this));
Run Code Online (Sandbox Code Playgroud)
请参阅下面评论中的错误。
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)
Run Code Online (Sandbox Code Playgroud)
所以你可以像这样用 std::bind 指定一个成员函数。
EventListenerCustom* listener = EventListenerCustom::create("my_event",
std::bind(&YourSubclass::myVirtualEventMethod, this, std::placeholders::_1));
Run Code Online (Sandbox Code Playgroud)
在 cocos2d-x 中有一个宏。
EventListenerCustom* listener = EventListenerCustom::create("my_event",
CC_CALLBACK_1(YourSubclass::myVirtualEventMethod, this));
Run Code Online (Sandbox Code Playgroud)
已编辑
No viable conversion from '__bind<void (BaseScene::*)(), BaseScene ,
std::__1::placeholders::__ph<1>&>' to 'const std::function<void(Eventcustom)>'
Run Code Online (Sandbox Code Playgroud)
因为 myVirtualEventMethod 的类型与void(EventCustom*) 不同。因此它应该是
virtual void myVirtualEventMethod(EventCustom*);
Run Code Online (Sandbox Code Playgroud)
或者
EventListenerCustom* listener = EventListenerCustom::create("my_event",
CC_CALLBACK_0(YourSubclass::myVirtualEventMethod, this));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2789 次 |
| 最近记录: |