cocos 2d-x 添加触摸事件回调错误
cocos 2d-x add touch event callback error
我有一个 cocos2d-x 场景和按钮。
我尝试添加触摸事件监听器并为其提供回调函数:
preloadScene.h:
...
public:
virtual void Do(Touch* touch, Event* event);
...
preloadScene.cpp
bool Preload::init(){
...
auto button = ui::Button::create("assets/preload_button.png");
...
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchEnded = CC_CALLBACK_2(Preload::Do, this);
button->addTouchEventListener(listener);
...
}
在编译过程中我得到了这个错误:
错误 C2893 函数模板专用化失败 'unknown-type std::invoke(_Callable &&,_Types &&...)'
我知道回调或我使用它的方式有问题。请帮忙。
P.S:下一行工作得很好,但我想将这个事件处理代码封装在其他函数中。
*button->addTouchEventListener(
[](Ref* sender, ui::Widget::TouchEventType type) {
switch (type) {
case ui::Widget::TouchEventType::BEGAN: {
CCLOG("touch began");
auto scene = MainMenu::createScene();
Director::getInstance()->popScene();
Director::getInstance()->replaceScene(scene);
}
break;
解决方案:使用 lambda 来调用您的函数。
button->addTouchEventListener([this](Touch*, Event*){ this->Do();}
CC_CALLBACK_2
在后台使用 std::bind
。 Button::addTouchEventListener
的声明是 void Button::addTouchEventListener(const ccWidgetTouchCallback& callback)
,其中 ccWidgetTouchCallback
是 std::function<void(Ref*,Widget::TouchEventType)>
而不是 EventTouchListener
.
绑定虚函数是一种不好的做法,因为派生版本不会被调用。
button->addClickEventListener([=](Ref*)
{
Do();
});
我有一个 cocos2d-x 场景和按钮。 我尝试添加触摸事件监听器并为其提供回调函数:
preloadScene.h:
...
public:
virtual void Do(Touch* touch, Event* event);
...
preloadScene.cpp
bool Preload::init(){
...
auto button = ui::Button::create("assets/preload_button.png");
...
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchEnded = CC_CALLBACK_2(Preload::Do, this);
button->addTouchEventListener(listener);
...
}
在编译过程中我得到了这个错误: 错误 C2893 函数模板专用化失败 'unknown-type std::invoke(_Callable &&,_Types &&...)'
我知道回调或我使用它的方式有问题。请帮忙。
P.S:下一行工作得很好,但我想将这个事件处理代码封装在其他函数中。
*button->addTouchEventListener(
[](Ref* sender, ui::Widget::TouchEventType type) {
switch (type) {
case ui::Widget::TouchEventType::BEGAN: {
CCLOG("touch began");
auto scene = MainMenu::createScene();
Director::getInstance()->popScene();
Director::getInstance()->replaceScene(scene);
}
break;
解决方案:使用 lambda 来调用您的函数。
button->addTouchEventListener([this](Touch*, Event*){ this->Do();}
CC_CALLBACK_2
在后台使用 std::bind
。 Button::addTouchEventListener
的声明是 void Button::addTouchEventListener(const ccWidgetTouchCallback& callback)
,其中 ccWidgetTouchCallback
是 std::function<void(Ref*,Widget::TouchEventType)>
而不是 EventTouchListener
.
绑定虚函数是一种不好的做法,因为派生版本不会被调用。
button->addClickEventListener([=](Ref*)
{
Do();
});