Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cocos 2d-x添加触摸事件回调错误_C++_Cocos2d X - Fatal编程技术网

C++ cocos 2d-x添加触摸事件回调错误

C++ cocos 2d-x添加触摸事件回调错误,c++,cocos2d-x,C++,Cocos2d X,我有一个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 =

我有一个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未能专门化函数模板“未知类型std::invoke(_Callable&&,_Types&&&…)

我理解回调或我使用回调的方式有问题。请帮忙

注:接下来的几行工作得很好,但我希望将此事件处理代码封装在其他函数中

*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\u CALLBACK\u 2
在引擎盖下使用
std::bind
Button::addTouchEventListener
的声明是
void Button::addTouchEventListener(const-ccWidgetTouchCallback&callback)
,其中
ccWidgetTouchCallback
std::function
而不是
EventTouchListener


绑定虚拟函数是一种不好的做法,因为派生版本不会被调用。

解决方案:使用lambda调用函数

button->addTouchEventListener([this](Touch*, Event*){ this->Do();}
button->addClickEventListener([=](Ref*)
{
  Do();
});
CC\u CALLBACK\u 2
在引擎盖下使用
std::bind
Button::addTouchEventListener
的声明是
void Button::addTouchEventListener(const-ccWidgetTouchCallback&callback)
,其中
ccWidgetTouchCallback
std::function
而不是
EventTouchListener


绑定虚拟函数是一种不好的做法,因为派生版本不会被调用。

这似乎是最简单的方法。这似乎是最简单的方法。
button->addClickEventListener([=](Ref*)
{
  Do();
});