cocos2d-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无法专用化函数模板"未知类型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();
});
相关文章:
- MSVC __debugbreak() 与 openGL 错误回调一起使用时不会产生调用堆栈
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- 通过实用程序 fn 将捕获的 lambda 传递给 C 样式回调 - 错误
- 更新 Visual Studio 2017,现在出现编译错误 C7510:"回调":使用依赖模板名称必须以 'template' 为前缀
- 调用某个回调函数两次会导致分段错误:Nan
- 从C++代码抛出错误调用 JavaScript 回调函数 - nbind
- 回调方法显示错误,类型为"void(*)"的值不能用于初始化类型的实体
- OpenGL 调试 错误回调函数的 ID 参数是什么?
- 从触摸回调访问向量元素的方法时,不良访问错误
- 插件中节点.js/Nan 回调C++不频繁的隔离错误
- std::函数,带有 SDL 事件回调的 lambda 错误
- clang消毒剂回调错误
- 带有回调函数的cocos2d-x菜单项错误
- 通过功能指针通过DLL进行回调功能,运行时检查失败#0错误
- pybind11基本回调,不兼容的功能签名错误
- C 11 std :: bind and auto的编译错误,用于回调函数参数
- C++ - 在 C++ 中实现回调时的允许错误
- 调用带参数的方法时出现本机回调错误
- 回调函数,aerospike_query_foreach给出构建错误
- cocos2d-x添加触摸事件回调错误