cocos2d-x添加触摸事件回调错误

cocos 2d-x add touch event callback error

本文关键字:回调 错误 事件 触摸 添加 cocos2d-x      更新时间:2023-10-16

我有一个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::bindButton::addTouchEventListener的声明是void Button::addTouchEventListener(const ccWidgetTouchCallback& callback),其中ccWidgetTouchCallbackstd::function<void(Ref*,Widget::TouchEventType)>而不是EventTouchListener
绑定虚拟函数是一种糟糕的做法,因为不会调用派生版本。

button->addClickEventListener([=](Ref*)
{
  Do();
});